|
我用的是redhat9.内核是2.4.20-8。增加系统调用的过程如下:
1。vi /usr/src/linux-2.4.20-8/kernel/sys.c
添加代码:(该系统调用仅仅返回一个整数值);
asmlinkage int sys_mycall(int number)
{
return number;
}
2。vi /usr/src/linux-2.4.20-8/arch/i386/kernel/entry.S
添加:
.long SYMBOL_NAME(sys_mycall)
3。vi /usr/src/linux-2.4.20.-8/include/asm-i386/unistd.h
添加:
#define __NR_mycall 259 /*系统本身已有调用号已达258*/
4。这一步有的文章没有,有的又有,而且修改的文件好像说法不统一,所以 我干脆修改了两个。(这里也是比较困惑的地方).
vi /usr/include/linux/unistd.h
添加:
#define __NR_mycall 259
vi /usr/include/asm/unistd.h
添加:
#define __NR_mycall 259
5。重新编译内核,用编译过的内核重新引导系统。
6。重启,编写测试文件
vi tt.c
#include <stdio.h>
#include <linux/unistd.h>
_syscall1(int,mycall,int,ret)
main()
{
printf("%d \n",mycall(100));
}
gcc -o tt tt.c
提示:
/tmp/cckyQ5Sb.o(.text+0x20): In function `mycall':
: undefined reference to `errno'
collect2: ld returned 1 exit status
我搜了一下论坛以前的帖子,发现有个兄弟出现过类似的情况,按照他的 解决办法,我在测试文件tt.c中加了个头文件
#include <errno.h>
再gcc -o tt tt.c
运行./tt
结果输出-1 (并不是预想的100);
请问各位大侠这是怎么回事呀??折腾了一天,看了无数个相关帖子,重新编译了n遍内核,快崩溃了55555555555。尤其是第4步,网上说法千差万别,有的修改这个,有的修改那个头文件。。。不知到底问题出在哪里:help |
|