linux内核编程
内容要求
1.编译一个新内核并用新内核启动
2.添加一个系统调用
开发平台
系统版本ubuntu18.04-desktop-amd64
内核版本linux-4.14
步骤
1.下载内核
最新内核下载官网链接:
https://www.kernel.org/
各版本内核下载地址
https://mirrors.edge.kernel.org/pub/linux/kernel/
2.将下载到文件linux-4.14.103.tar.gz移动到目录 /usr/src
,使用命令
tar zxvf linux-4.14.103.tar.gz
解压内核
3.进入子目录/linux-4.14.103
,执行
sudo make mrproper
净化源代码(第一次make不需要此步骤)
4.配置内核
sudo make menuconfig
执行此命令时注意terminal窗口不能过小,否则会出现如下错误
这一步如有其他错误可能是没有安装必要到库文件,执行
sudo apt install libncurses5-dev
安装
完成后窗口如下,一般为默认设置保存退出即可5.编译内核
执行
sudo make bzImage
这一步编译时间较长,可以加上 -j4
或-j8
加速-j后面到参数最好为物理核心到两倍
6.编译模块
执行
sudo make modules
同理,可以使用sudo make modules -j4
加速
7.安装内核
执行
sudo make modules_install
安装模块
执行
sudo make install
安装内核,同样可以使用-j4
加速
8.配置grub引导程序
执行
sudo update-grub2
更新grub引导
9.重启系统,使用新内核启动,使用命令uname -r可以看到内核为我们刚编译到内核添加系统调用
添加系统调用需要修改三个文件,
1.添加系统调用号,该文件保存在/arch/x86/entry/syscalls/syscall_64.tbl
找到一个未使用到系统调用号,添加自己的系统调用,如我添加的系统调用号为333,其格式为:<系统调用号><commom/64/x32><系统调用名><服务例程入口地址>
2.实现系统调用服务例程
文件位置为/kernel/sys.c
,在文件最后添加自己的系统调用3.修改
/include/linux/syscalls.h
文件,添加头文件asmlinkage int sys_mycopy(char* sourceFile,char* destFile);
4.重新编译内核
5.编写测试文件测试系统调用
#include <linux/unistd.h>
#include <stdio.h>
#include <asm/unistd.h>
int main(int argc,char**argv){
int i=syscall(333,argv[1],argv[2]);
if(i){
printf(“successfully!\r\n”);
printf(“The renturn number is %d\n”,i);
}
return 1;
}
使用gcc编译测试