- 论坛徽章:
- 0
|
前几天在2.6.16.11的内核中加入了一条简单的系统调用,在FC4上编译成功。
下面的步骤大部分是在linux内核的目录进行的
1 make clean
2 cd include/linux
vi syscalls.h
在最后一行加上
asmlinkage long sys_mycall(void);
3 vi include/asm-i386/unistd.h
在#define __NR_unshare 310
下面加上#define __NR_mycall 311
并修改下面的#define NR_syscalls 311
为#define NR_syscalls 312
4 vi /kernel/sys.c
asmlinkage long sys_mycall(void)
{
printk("pid: %d:\tThis is my call.\n",current->tgid);
return 0;
}
5 在linux/arch/asm/kernel/syscall_table.S中的sys_call_table[]中加入最后一行
.long sys_mycall
6 make oldconfig(使用旧的配置比自己重新配置方便多了)
7 make (等了大概40分钟)
8 做好备份:
cd /lib
cp -R 2.6.16.11 2.6.16.11.save-060608
9 make modules_install
10 cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.16.11-060608
cp System.map /boot/System.map-060608
11 修改grub:
新增加几行:
title kernel-2.6.16.11-060608
root (hd0,7)
kernel /boot/vmlinuz-2.6.16.11-060608 root=/dev/hdb8 ro
initrd (hd0,7)/boot/initrd-2.6.16.11.img
12 重启,以single模式进入系统,安装nvidia显卡驱动,
进入解压后的目录,
./NVIDIA-Linux-x86-1.0-8756-pkg1.run
init 5就可以进入图形界面
13 测试系统调用:
新建文件test.c,见附录:
gcc -o test test.c
./test
输出:
before mycall: i=5
pid:2669 This is my call.
after mycall: i=0
注意:必须在非图形化的终端(使用Ctrl+Alt+[1..6])下才能输出pid...一行。具体原因还不清楚。
在> (William von Hagen)
中有一些说明。
附录:
/*** test.c ***/
#include
#include
#define __NR_mycall 311 /*不加不行*/
_syscall0(int,mycall)
int main()
{
int i;
i = 5;
printf("before mycall: i=%d\n",i);
i = mycall();
printf("after mycall: i=%d\n",i);
return 0;
}
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/20704/showart_129558.html |
|