32位系统,添加系统调用过程总结.
由于编译内核需要较大空间,建议给boot和/都分大一些,以防编译过程中出现no space error
1 .获得root权限
sudo su
输入密码.
2 .获得内核源码
ubuntu可以直接通过指令获得,获得的压缩包存在了/usr/src中
apt-get install linux-source
解压下载好的源码压缩包
我下载得到的包是 linux-source-3.13.0.tar.bz2
tar jxvf linux-source-3.13.0.tar.bz2
之后在同一文件夹产生linux-source-3.13.0文件夹,内容一览
root@TianYuPC:/usr/src/linux-source-3.13.0# ls
arch firmware lib REPORTING-BUGS ubuntu
block fs MAINTAINERS samples usr
COPYING include Makefile scripts virt
CREDITS init mm security x509.genkey
crypto ipc modules.builtin signing_key.priv
Documentation Kbuild modules.order signing_key.x509
drivers Kconfig net sound
dropped.txt kernel README tools
4 . 接下来添加系统调用.需要修改三个文件.
第一个sys.c
cd linux-source-3.13.0
gedit或者vi kernel/sys.c
打开编辑,在文件最后,写自己的函数.比如一个排序函数,对输入的数字进行堆排序.数字范围要求有理数.由于C语言的标准库在内核中不能使用,且double类型会报错(其他同学的实践经验),我使用字符数组处理.
首先写一个int compare(char*a,char *b),比较
两个字符串表示的数的大小.具体细节不多说.
然后是堆排用到的void adjust(char * array[],int i,int n)函数,以及系统调用函数asmlinkage int sys_heapsort(char * array[],int n).(最后返回了我的学号)
不要使用printf输出,可以直接修改数组,实在想输出可以用printk(“%s “,array[i]).最后再说printk显示到什么地方.
5. 第二个文件syscalls.h
系统调用头文件中声明刚添加的函数,在这一文件夹下/usr/src/linux-source-3.13.0/include/asm-generic有 syscalls.h
在#endif /* __ASM_GENERIC_SYSCALLS_H */这一行(最后一行)之前,写上
#ifndef sys_heapsort
asmlinkage int sys_heapsort(char * array[],int n);
#endif
6.修改第三个文件syscall_32.tbl
在/usr/src/linux-source-3.13.0/arch/x86/syscalls文件夹中有syscall_32.tbl文件.64位系统修改syscall_64.tbl
打开后发现以及有300多个了,在最后按原有的格式添加自己写的函数.最前面的数字比原有最大的加1.
回到路径/usr/src/linux-source-3.13.0
按顺序执行指令
make localmodconfig
(这一条可选,是精简编译,只编译当前内核用到的模块,会省很多时间)
make menuconfig
注意在弹出设置界面后,general setup里面的第三条local version,可以给内核版本名加后缀.加个带自己名字的后缀想必是极好的,把女朋友名字放上说不定能让她感动一把.
make -j4
(相当于make bzImage和make modules,也可以拆开输入)
make modules_install
make install
执行完这两条指令,内核编译就完成了.reboot重启,在grub引导界面的advancedoption可以选择新内核(直接进入默认也是新内核), 由于机器不同,配置不同,环境不同,不能保证完全成功.