平台:VMware 9.0 pro
系统:Ubuntu 13.10 i386
新内核版本:Linux-3.17.7 32位
(全过程使用root账户)
一、下载新的内核
从 Kernel.org 上下载最新的内核。下载之后得到文件“ linux-3.13.7.tar.xz ”
cp文件到“ /usr/src ”目录,用以下命令解压
~$ xz -d linux-3.17.7.tar.xz ~$ tar -xvf linux-3.17.7.tar
解压完后得到目录” /usr/src/linux-3.17.7 ”
二、添加系统调用
进入新内核的文件目录
~$ cd /usr/src/linux-3.17.7
下面添加新的系统调用
a)、系统调用函数实现:修改kernel/sys.c文件
~$ vi kernel/sys.c
在文件的最后添加新的系统调用函数
SYSCALL_DEFINE1(mycall, int, number){ printk("11061135 Henry Zivers\n"); return number; } //DEFINEn中的n表示参数个数. 此函数目的为返回输入值
b)、设置系统调用号:修改arch/x86/syscalls/syscall_32.tbl
~$ vi arch/x86/syscalls/syscall_32.tbl
在文件最后添加一行
351 i386 mycall sys_mycall //351即为新的系统调用号
c)、添加系统调用声明到头文件
~$ vi include/asm-generic/syscalls.h
在文件倒数第二行,即 “ #endif /* __ASM_GENERIC_SYSCALLS_H */ ” 这行的上面一行添加如下内容
#ifndef sys_mycall asmlinkage long sys_mycall(long number); #endif
三、编译新的内核
首先安装ncurses库,这个库会在之后的编译中用到
~$ apt-get install libncurses5-dev
为了方便,将编译需要执行的所有内容写成批处理文件执行,写好的文件放在“ /usr/src/linux-3.17.7 ”目录下
~$ vi mycall.sh
批处理内容如下
#!/bin/bash make mrproper //清除旧的编译内容 make menuconfig //编译新内核的配置文件 make bzImage //生成新的内核镜像 make modules //编译模块 make modules_install //安装模块 make install //安装内核 update-grub //更新引导文件 reboot //重新启动
编辑完成后保存,并赋给批处理文件最高的读写权限
~$ chmod 777 mycall.sh
执行编译
~$ ./mycall.h
(提示:编译过程中,将出现内核配置文件修改窗口,选择<save>,之后<exit>即可。即使用原先的配置,并不做修改。)