亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標題:
2.6.37.3內(nèi)核添加系統(tǒng)調用的問題
[打印本頁]
作者:
licyuan
時間:
2011-04-05 00:08
標題:
2.6.37.3內(nèi)核添加系統(tǒng)調用的問題
本帖最后由 licyuan 于 2011-04-05 00:25 編輯
我添加一個系統(tǒng)調用,照著書上的步驟,最后用用戶程序測試的時候發(fā)現(xiàn)調用失敗,返回結果為-1,errno值為38,不知道問題出在哪兒,請大牛們幫忙看下
系統(tǒng)版本是 Linux ubuntu 2.6.37.3 #11 SMP Mon Apr 4 06:47:38 PDT 2011 x86_64 GNU/Linux
所修改的內(nèi)核版本也是2.6.37.3
更改的源碼文件分別是下列幾個:
1、新建一個文件arch/x86/kernel/ff_get_ctx.c,其中實現(xiàn)返回當前進程的ctx的功能(ctx記錄了進程被schedule的次數(shù),是在task_struct中自己添加的一個成員,而且已經(jīng)寫了一個模塊測試是沒有問題的)
內(nèi)容如下
#include<linux/linkage.h>
#include<linux/kernel.h>
#include<linux/sched.h>
asmlinkage unsigned long sys_ff_get_ctx(void){
printk(KERN_WARNING"Enter syscall ff_get_ctx!\n");
return (current->ff_ctx);
}
復制代碼
2、修改arch/x86/include/asm/unistd_32.h, 加上自己定義的系統(tǒng)調用號,并更改NR_syscalls宏
#define __NR_fanotify_mark 339
#define __NR_prlimit64 340
/* Add new syscall
*/
#define __NR_ff_get_ctx 341
#ifdef __KERNEL__
/* Modify syscall_table size
Original:#define NR_syscalls 341
*/
#define NR_syscalls 342
復制代碼
3、修改arch/x86/kernel/syscall_table_32.S,在其最后加上
.long sys_fanotify_mark
.long sys_prlimit64 /* 340 */
.long sys_ff_get_ctx /*341 newly added syscall*/
復制代碼
4、include/linux/syscalls.h中添加
/* Newly added syscall declaration
*/
asmlinkage unsigned long sys_ff_get_ctx(void);
復制代碼
5、修改arch/x86/kernel/Makefile,在obj-y中加入自定義的目標
obj-y += tsc.o io_delay.o rtc.o
obj-y += pci-iommu_table.o
obj-y += resource.o
# Add newly syscall obj-file
obj-y += ff_get_ctx.o
復制代碼
然后重新編譯內(nèi)核并加載,寫一個用戶程序測試一下
#include<stdio.h>
#include<linux/unistd.h>
#include<errno.h>
#include<sys/syscall.h>
#define __NR_ff_get_ctx 341
int main(){
unsigned long t=syscall(__NR_ff_get_ctx);
if(t==-1){
printf("Error occurs. errno=%d\n",errno);
}
else{
printf("The ctx of this process is:\t%ld\n",t);
}
return 0;
}
復制代碼
但是結果卻是 Error occurs. errno=38 ,即調用失敗,查了一下errno 38的定義,F(xiàn)unction not implemented,函數(shù)沒有實現(xiàn),請問下大家這是怎么回事呢?
在內(nèi)核編譯生成的System.map文件中已經(jīng)有 ffffffff810142c0 T sys_ff_get_ctx 這一項了,說明這個符號已經(jīng)在內(nèi)核中,但是卻沒有與實現(xiàn)代碼聯(lián)系起來 ,現(xiàn)在懷疑我的系統(tǒng)是64位的,系統(tǒng)調用機制可能和32位的有些不同,但是還沒有找到相關的資料,不知道是神馬原因,希望有高人解答,不甚感激!
作者:
marsbible
時間:
2011-04-06 10:32
arch/x86/include/asm/unistd_32.h
arch/x86/kernel/syscall_table_32.S
這兩個文件看上去會有64位版本,你修改一下64位的試試吧
作者:
licyuan
時間:
2011-04-07 19:20
回復
2#
marsbible
恩,謝謝 這個問題我已經(jīng)解決了,主要是以下兩步
1、在
arch/x86/include/asm/unistd_64.h 中添加自己的系統(tǒng)調用號
#define __NR_XXXXX my_syscall_num
__SYSCALL(__NR_XXXX,sys_XXXX)
復制代碼
2、在/kernel下添加一個文件abcd.c,定義自己的系統(tǒng)調用
asmlinkage long sys_XXXX(){
//....code here....
return ret_num;
}
復制代碼
在/kernel下的Makefile中加入自己的生成目標
obj-y += abcd.o
然后就是編譯內(nèi)核并加載了
用戶態(tài)程序用 syscall(my_syscall_num, args....)來調用即可
以上是64位的系統(tǒng)調用的方法
32位的系統(tǒng)調用
是需要在arch/x86/include/asm/unistd_32.h和arch/x86/kernel/syscall_table_32.S中添加對應的項,然后用可以int 0x80調用
以上兩類系統(tǒng)調用我已經(jīng)試驗成功了
歡迎光臨 Chinaunix (http://72891.cn/)
Powered by Discuz! X3.2