亚洲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)容如下
  1. #include<linux/linkage.h>
  2. #include<linux/kernel.h>
  3. #include<linux/sched.h>
  4. asmlinkage unsigned long sys_ff_get_ctx(void){
  5.         printk(KERN_WARNING"Enter syscall ff_get_ctx!\n");
  6.         return (current->ff_ctx);
  7. }
復制代碼
2、修改arch/x86/include/asm/unistd_32.h, 加上自己定義的系統(tǒng)調用號,并更改NR_syscalls宏
  1. #define __NR_fanotify_mark        339
  2. #define __NR_prlimit64                340

  3. /*        Add new syscall
  4. */
  5. #define __NR_ff_get_ctx                341

  6. #ifdef __KERNEL__

  7. /*        Modify syscall_table size
  8.         Original:#define NR_syscalls 341
  9. */
  10. #define NR_syscalls 342
復制代碼
3、修改arch/x86/kernel/syscall_table_32.S,在其最后加上
  1.         .long sys_fanotify_mark
  2.         .long sys_prlimit64                /* 340 */
  3.         .long sys_ff_get_ctx        /*341        newly added syscall*/
復制代碼
4、include/linux/syscalls.h中添加
  1. /*        Newly added syscall declaration
  2. */
  3. asmlinkage unsigned long sys_ff_get_ctx(void);
復制代碼
5、修改arch/x86/kernel/Makefile,在obj-y中加入自定義的目標
  1. obj-y                        += tsc.o io_delay.o rtc.o
  2. obj-y                        += pci-iommu_table.o
  3. obj-y                        += resource.o

  4. #        Add newly syscall obj-file
  5. obj-y                        += ff_get_ctx.o

復制代碼
然后重新編譯內(nèi)核并加載,寫一個用戶程序測試一下
  1. #include<stdio.h>
  2. #include<linux/unistd.h>
  3. #include<errno.h>
  4. #include<sys/syscall.h>

  5. #define __NR_ff_get_ctx                341

  6. int main(){
  7.         unsigned long t=syscall(__NR_ff_get_ctx);
  8.         if(t==-1){
  9.                 printf("Error occurs. errno=%d\n",errno);
  10.         }
  11.         else{
  12.                 printf("The ctx of this process is:\t%ld\n",t);
  13.         }

  14.         return 0;
  15. }
復制代碼
但是結果卻是  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)調用號
  1. #define __NR_XXXXX    my_syscall_num
  2. __SYSCALL(__NR_XXXX,sys_XXXX)
復制代碼


2、在/kernel下添加一個文件abcd.c,定義自己的系統(tǒng)調用
  1. asmlinkage long sys_XXXX(){

  2. //....code here....

  3. return ret_num;
  4. }
復制代碼

在/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