- 論壇徽章:
- 0
|
本帖最后由 licyuan 于 2011-04-05 00:25 編輯
我添加一個系統(tǒng)調(diào)用,照著書上的步驟,最后用用戶程序測試的時候發(fā)現(xiàn)調(diào)用失敗,返回結(jié)果為-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)返回當(dāng)前進(jìn)程的ctx的功能(ctx記錄了進(jìn)程被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);
- }
復(fù)制代碼 2、修改arch/x86/include/asm/unistd_32.h, 加上自己定義的系統(tǒng)調(diào)用號,并更改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
復(fù)制代碼 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*/
復(fù)制代碼 4、include/linux/syscalls.h中添加- /* Newly added syscall declaration
- */
- asmlinkage unsigned long sys_ff_get_ctx(void);
復(fù)制代碼 5、修改arch/x86/kernel/Makefile,在obj-y中加入自定義的目標(biāo)- 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
復(fù)制代碼 然后重新編譯內(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;
- }
復(fù)制代碼 但是結(jié)果卻是 Error occurs. errno=38 ,即調(diào)用失敗,查了一下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)調(diào)用機制可能和32位的有些不同,但是還沒有找到相關(guān)的資料,不知道是神馬原因,希望有高人解答,不甚感激! |
|