内核编译与系统调用
Linux内核编译
实验内容
下载内核源码:
确定内核版本号
uname -r
在www.kernel.org选择接近的内核版本下载
linux-6.6.60.tar.xz
将压缩包解压到虚拟机目录中
确认系统位数
getconf LONG_BIT
确认虚拟机保留足够大硬盘空间(20G)
df -h
编写自定义系统调用函数
修改/kernel/sys.c文件,在文件末尾增加自己设定的函数
修改系统函数头文件/include/linux/syscalls.h
在文件最后的#endif之前添加函数声明
为函数添加系统调用号:/arch/x86/entry/syscall/syscall_32.tbl。(根据刚才查看系统的位数而定,如果是64位就修改syscall_64.tbl文件)。
在文件最后添加调用号,可以接着上面的序号继续+1,后面的格式参照上面编写模式。
编译内核
#编译安装依赖
sudo apt-get update
sudo apt-get install flex
sudo apt-get install bison
sudo apt-get install libssl-dev
sudo apt-get install libelf-dev
sudo apt-get install binutils-dev
sudo apt-get install pkg-config
sudo apt-get install libncurses5-dev
#清除内核的目标文件、附属文件以及配置文件
#(一般第一次编译时候需要使用,主要防止下载的源码包有一些配置文件,影响结果)
sudo make mrproper
#清除内核中的目标文件,并不会删除设置文件
#(在后续需要重新编译时候,只需要make clean就可以了)
sudo make clean
#设置配置文件:这是一种通过已存在.config文件内容,使用该文件内的默认值,只将新版本内核功能新功能提供出来让用户选择,可以简化内核功能挑选过程。
#(如果使用默认值一直按回车键快速略过也可以)
sudo make oldconfig
#编译内核
sudo make bzImage –j6 #-j6代表用六线程编译
编译完成
#编译模块
sudo make modules
#安装模块
sudo make modules_install
#安装内核
sudo make install
修改grub引导
#/etc/default/grub
GRUB_TIMEOUT_STYLE=meun
GRUB_TIMEOUT=30 #引导菜单超时时间
sudo update-grub #更新grub配置
重启系统,可以在GRUB界面选择编译的第二个内核
进入系统后查看内核版本
uname -r
内核版本已经被更换成6.6.60
调用系统函数
编写调用函数
#include<stdio.h>
int main(){
int num;
//syscall(arg1,arg2);1为自定义函数的系统调用号,2为函数参数
num = syscall(548,111);
printf("the number is %d",num);
return 0;
}
问题参考
https://blog.csdn.net/hknaruto/article/details/133672892
https://blog.csdn.net/weixin_45264425/article/details/123993855