感谢原作者:http://zakir.is-programmer.com/posts/22294.html
刚回来就听说操作系统要上机,内容是给linux系统添加一个系统调用,依据参数是否大于0返回两个数。表示毫无思路,Google了一下,发现网上的教程很多(难道各学校的作业都一样么?),但是写的都比较烦而且用的内核都比较旧,有些步骤在新内核的编译是没必要的。按照他们写的来做把我纠结死了,所以搞成了以后打算写一个简易的新的教程,希望让后人能少走些弯路。
环境:Ubuntu 10.04
准备工作:Linux内核(在这里可以下载,我用的是2.6.36)。
具体步骤:
Step 1:使用root权限,没有设置root的可以执行以下命令来设置密码
1
|
sudo passwd root
|
Step 2:把内核压缩包移至/usr/src,并解压
1
2
|
mv linux-2.6.36. tar .bz2 /usr/src
|
1
|
gedit /usr/src/linux-2 .6.36 /arch/x86/kernel/syscall_table_32 .S
|
1
|
.long sys_mysyscall
|
你的新调用的编号就是上一行的编号+1,记住这个编号,后面要用。
接下来写函数的实现,就相当于把家具搬进去。
1
|
gedit /usr/src/linux-2 .6.36 /kernel/sys .c
|
1
2
3
4
5
|
asmlinkage long sys_mysyscall( int number)
{
if (number>0) return 123456
else return 654321;
}
|
1
|
gedit /usr/src/linux-2 .6.36 /arch/x86/include/asm/unistd_32 .h
|
1
|
#define __NR_mysyscall 341 //这341是之前记下的那个编号
|
Step 4:利用root权限进入/usr/src,清除以前编译的内核,第一次编译的话可以跳过
1
|
make mrproper
|
1
|
make menuconfig
|
1
2
3
|
. /configure
make
make install
|
1
|
make
|
Step 7:生成文件并安装内核
1
2
|
make modules_install
make install
|
1
|
mkinitramfs -o initrd.img-2.6.36 2.6.36(本人按,这里后面的2.6.36不可以丢丢了就会开机后会出现:Could not load /lib/modules/.../modules.dep的错误)
|
1
|
mv initrd.img-2.6.36 /boot
|
Step 9:更新引导列表
1
|
update-grub
|
启动完以后在终端执行
1
|
uname -a
|
Step 11:测试
编一个测试程序:
1
2
3
4
5
6
7
8
|
#include<stdio.h>
#inlcude<unistd.h>
int main()
{
printf (“%d\n%d\n”,syscall(341,1),syscall(341,0)); //这里的341是之前的编号,请自行更改
return 0;
}
|
编译执行一下,看结果对不?
终于写完了,貌似我也写得有些繁琐了,毕竟是修改内核嘛。随着版本号和RP函数的波动,以上步骤不能保证一定能出结果,但大体原理是相同的,如果有童鞋杯具了。。。多Google多试几次。。。。