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编译测试

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值