温馨提示:必须保证硬盘(SCSI)在33G以上,不然后面重新编译内核会内存不够导致前功尽弃。
实验环境:Ubuntu18.04 64位,linux4.19。
实验步骤:
1.在www.kernel.org/中下载内核。在下载中打开terminal使用命令解压缩。
2.sudo mv linux-4.19 /usr/src移动文件夹到/usr/src
3.在/arch/x86/entry/syscalls/arch/x86/entry/syscalls/syscall_64.tbl(32位系统为syscall_32.tbl)
文件中添加系统调用号, 取一个与源文件中不重复的调用号,这里是548
添加的调用函数为 548 64 hello sys_hello
2.
在linux-4.19/include/linux/syscalls.h文件中添加系统调用函数声明:
asmlinkage long sys_hello(void);
3.在linux-4.19/kernel/sys.c文件中添加函数定义:
asmlinkage long sys_hello(void)
{
printk(“Hello, world!”);
return 606;
}
4.
编写调用系统调用函数的源程序:(在桌面上)
hello.c
#include
#include
#include
#include
int main()
{
long use = syscall(548);
printf(“System call sys_hello: %ld\n”,use);
return 0;
}
7.编译安装内核
make, gcc, kernel-package, bison, flex, libncurses-dev, ncurses-devel, libssl-dev
在ubuntu中打开控制台
输入命令安装: sudo apt install make
sudo apt install gcc
sudo apt install kernel-package
sudo apt install bison
sudo apt install flex
sudo apt install libncurses-dev
sudo apt install nucurses-devel
sudo apt install libssl-dev
在linux源文件目录中打开控制台(如/linux-4.19)
输入命令: sudo make menuconfig
会弹出配置菜单:
Save->ok->exit->exit(用方向键和enter控制)
2.开始编译内核
(如果执行这些命令期间遇到错误,根据错误提示安装相应的库sudo apt install xxx)
在控制台中输入命令开始编译:sudo make
编译执行时间很久, 期间不要关闭控制台
编译完成后在控制台中输入命令开始安装模块:sudo make modules_install
模块安装完成后在控制台中输入命令安装内核:sudo make install
安装结束后基本结束重启即可:reboot
查看内核版本:uname -r
开机时一直按shift 选第二个高级选项后选第三个recovery mode
关于用gcc编译c程序可以自行百度
编译hello.c
打开控制台cd到源文件所在目录:cd Desktop
用gcc编译写好的hello.c 输入命令:gcc -o hello hello.c
如果没有错误输入命令执行程序:./hello
可以看到我们的系统调用返回了606这个值,说明系统调用成功了
由于添加的系统调用的输出语句为printk写的,它将消息送到系统日志中,所以控制台没有输出,输入命令查看日志:dmesg
可以多调用几遍函数 再查看
出现了helloworld 成功了!!!