一、源码修改

1下载一个与所用系统内核版本接近的内核,放在/usr/src下,解压,作个链接ln -s linux-2.6.18.1 linux

2修改:修改三个地方

1)/usr/src/linux/kerner/sys.c中添加,

asmlinkage int sys_mysyscall(int a)

{

return a;

}

2)定义系统调用号,/usr/src/linux/include/asm-i386/unistd.h

#define _NR_sysmycall 318 //不能与前面已有的重复

#define _NR_syscalls 319//修改系统中所用系统调用数目

3)在系统调用向量表里添加自定义的系统调用函数入口位置,

/usr/src/linux/arch/i386/kernel/syscall_table.S,以前老版本是entry.s

.long sys_mysyscall

二、内核编译

1.在/boot下复制配置文件,到/usr/src/linux下,改名位config,make menuconfig,可以不用修改,直接退出

2.make clean 清空以前的编译痕迹

3.make,编译出来的是bzImage

4.make modules,make modules-install//编译、安装config里配置的模块

如不执行次步骤,对于有的系统,制作不了initrd文件。系统就启动不了

5.如果直接make install,系统会自动制作initrd文件,并复制initrd和bzimage文件到/boot下,修改grub.conf文件,重启系统,选择进入新内核

6.不使用make install命令。复制bzImage到/boot下,改名位vmlinuz-2.6.18.1,手工制作initrd文件,/mkinitrd initrd-2.6.18.1.img 2.6.18.1,initrd文件名位initrd-2.6.18.1

7.修改grub.conf文件,复制原来已有的启动设置,把title和kernel和initrd改名为新制作的即可

三、编写代码测试

int main(void)

{

int a=syscall(318,100);//318是系统调用号,100是参数

printf("%d\n",a);

return 0;

}

syscall是内核提供为用户程序的一个函数,

如果不使用syscall函数,也可以使用宏定义,但是在2.6.20以后的版本里,没有宏定义,需要自己从其他版本里复制过来添加。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐