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

支付宝打赏
微信打赏