本文是ubuntu13.10 32位环境下面添加系统调用并编译内核的过程。只针对3.12内核版本,对于其他版本的内核可能修改方式不同。
环境是virtualbox下面的ubuntu13.10 32bit ,雅乐网发现硬盘文件vdi分配20G有点不够,建议大家多分配一点硬盘空间。
一、下载内核
登陆下载,得到文件linux-3.12.38.tar.xz,解压
1 2 |
xz -d linux-3.12.38.tar.xz tar -xvf linux-3.12.38.tar |
解压完后得到文件夹linux-3.12.38 进入这个文件夹进行下面的操作。
二、添加一个系统调用
1. 系统调用函数实现:修改kernel/sys.c文件
在这个文件里添加一个函数.
1 2 3 4 5 |
asmlinkage int sys_yalewoo(int num) { printk("yalewoo"); return num; } |
2. 设置系统调用号:修改arch/x86/syscalls/syscall_32.tbl
在最下面添加一行。注意第一列的调用号不能和已经有的冲突。
1 |
351 i386 yalewoo sys_yalewoo |
3. 添加系统调用声明到头文件:修改 include/asm-generic/syscalls.h
在最后一行上面添加如下内容
1 2 3 |
#ifndef sys_yalewoo asmlinkage int sys_yalewoo(int num); #endif |
三、编译新内核
1. 安装必要的环境
在执行apt-get install之前,如果之前没有执行update就要先update一次
1 |
sudo apt-get update |
安装gcc等开发工具
1 |
sudo apt-get install build-essential |
安装ncurses库。这个在配置makeconfig的时候用到了。
1 |
sudo apt-get install libncurses5-dev |
2. 编译内核 使用root用户身份
依次运行下列命令。可以加上-j选项指定多线程加快速度,例如 make -j4 bzImage 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
make mrproper //清除旧的编译内容 make menuconfig //编译新内核的配置文件,会出现内核配置文件修改窗口,选择save,然后exit,使用原先的配置,并不做修改。 make bzImage //生成新的内核镜像 我的虚拟机里大概需要1小时 make modules //编译模块。我的虚拟机里大概需要3小时。可以直接输入 make 同时执行以上两步 make modules_install //安装模块 make install //安装内核 update-grub //更新引导文件 reboot //重新启动 |
四、测试系统调用
创建一个.c文件来测试
1 2 3 4 5 6 7 8 |
#include <stdio.h> #include <unistd.h> int main(void) { printf("%ld\n", syscall(351, 233)); return 0; } |
还可以使用dmesg -c来查看系统调用函数中printk输出的内容
1 |
sudo dmesg -c |
修改sys.c后 重新编译内核
只需要执行
1 2 |
make bzImage //生成新的内核镜像 make install //安装内核 |
就可以了。第二次编译会很快。