一、实验内容
1、添加头文件及系统调用函数;
2、添加相应的系统调用函数声明;
3、添加一个没有使用的系统调用号;
4、编译内核,重启进入编译后的内核;
5、编写测试程序测试系统调用。
二、实验步骤
1.进入中断,切换为root身份;
sudo -s -H //按要求输入密码,切换为root身份
2.安装vim;
apt-get install vim
//安装vim文本编辑器(在vim中,i进入编辑, esc退出编辑状态,G跳到末尾, gg进入开头, :wq保存退出, :q不保存退出)
3.打开sys.c文件,添加头文件及系统调用函数;
cd /usr/src/linux-3.13.3/kernel //进入sys.c的目录
vim sys.c //利用vim打开sys.c
#include
asmlinkage int sys_mycall(void)
{
printk(KERN_ALERT "My name is ***!!My studentid is *****!\n");
return 1;
} //在末尾加入函数sys_mycall
4.打开syscalls.h文件,添加相应的系统调用函数声明;
cd /usr/src/linux-3.13.3/arch/x86/include/asm //进入syscalls.h目录级
vim syscalls.h //利用vim打开syscalls.h
asmlinkage int sys_mycall(void); //倒数第二行后插入函数声明
5.打开syscall_32.tbl,添加一个没有使用的系统调用号;
cd /usr/src/linux-3.13.3/arch/x86/syscalls //进入syscall_32.tbl目录级
vim syscall_32.tbl //利用vim打开syscall_32.tbl
222 i386 mycall sys_mycall//添加一个系统调用的id(我这里用的没有使用的222号)
6.进入内核文件目录级,开始编译;
cd /usr/src/linux-3.13.3 //进入内核文件linux-3.13.3 的目录级
7.删除以前进行过的内核功能选择文件;
make mrproper
8.载入配置文件.config,注意不要修改;
make menuconfig
9.编译内核(大概15-20分钟);
make bzImage
10.编译模块(大概1-1个半小时);
make modules
11.安装模块到正确目录;
make modules_install
12.安装,当然这里可以手动使用命令复制、移动目标文件到指定目录;
make install
13.更新开机启动项;
update-grub
14.重启;
reboot
15.查看内核版本是否跟新;
uname -a //查看当前内核详细信息,可以看到内核更新时间,确定是否编译成功
16.写测试程序,编译运行测试自己添加的系统调用函数。
附测试函数mycall.c:
#include
int main()
{
syscall(222); //222号是我自己添加的系统调用函数的id号
return 0;
}
gcc -o mycall mycall.c //gcc编译测试函数
./mycall //运行测试函数
sudo dmesg -c //查看日志文件里打印的信息(姓名、学号)
三、实验中遇到的问题
1.输入make bzImage报错;
*** Configuration file ".config"not found!
*** Please run some configurator (e.g."make oldconfig" or
*** "make menuconfig" or"make xconfig").
make[2]: *** [silentoldconfig] Error 1
make[1]: *** [silentoldconfig] Error 2
解决方法:
先make menuconfig, 并设置对应64位的配置;安装后继续输入make menuconfig。
2.make menuconfig 报错;
Your display is too small to runMenuconfig!
It must be at least 19 lines by 80 columns.
make[1]: *** [menuconfig] Error 1
make: *** [menuconfig] Error 2
解决方法:窗口最大化。
3.make modules报错;
ERROR: "__modver_version_show" [drivers/staging/rts5139/rts5139.ko] undefined!
make[1]: *** [__modpost] Error 1
make: *** [modules] Error 2
解决方法:
修改usr/src/linux-3.13.3/.config文件,找到STAGING项,将其值改为n。
CONFIG_RTS5139=n //修改CONFIG_RTS5139=n(在整个文件的80%-82%左右)