- 论坛徽章:
- 0
|
本帖最后由 licyuan 于 2011-04-05 00:25 编辑
我添加一个系统调用,照着书上的步骤,最后用用户程序测试的时候发现调用失败,返回结果为-1,errno值为38,不知道问题出在哪儿,请大牛们帮忙看下
系统版本是 Linux ubuntu 2.6.37.3 #11 SMP Mon Apr 4 06:47:38 PDT 2011 x86_64 GNU/Linux
所修改的内核版本也是2.6.37.3
更改的源码文件分别是下列几个:
1、新建一个文件arch/x86/kernel/ff_get_ctx.c,其中实现返回当前进程的ctx的功能(ctx记录了进程被schedule的次数,是在task_struct中自己添加的一个成员,而且已经写了一个模块测试是没有问题的)
内容如下- #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, 加上自己定义的系统调用号,并更改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
复制代码 然后重新编译内核并加载,写一个用户程序测试一下- #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的定义,Function not implemented,函数没有实现,请问下大家这是怎么回事呢?
在内核编译生成的System.map文件中已经有 ffffffff810142c0 T sys_ff_get_ctx 这一项了,说明这个符号已经在内核中,但是却没有与实现代码联系起来 ,现在怀疑我的系统是64位的,系统调用机制可能和32位的有些不同,但是还没有找到相关的资料,不知道是神马原因,希望有高人解答,不甚感激! |
|