ubuntu编译内核 添加系统调用

Linux 编译内核那点事
花了几天填了一下坑
大概步骤就是下载内核,编译内核。其实也没什么复杂的就是一些细节要注意一下。
内核要从官网下载 https://www.kernel.org/
选择tarball 下载项即可。
下载后,进入到有下载项的那个目录
打开终端 sudo mv linux-4.4.179.tar.xz /usr/src
之后进入/usr/src
cd /usr/src
sudo tar -xvf /usr/src/linux-4.16.10.tar.bz2

可能你会先解压再移动到/usr/src文件夹下,这样的话可能有些文件会在移动中丢失掉了,导致编译是缺少文件
所以最合理的是先将压缩包移动到/usr/src文件夹下,再进行解压。
接下来进入

cd /usr/src/linux-4.4.1179/kernel
sudo vim sys.c

添加系统调用的函数定义

SYSCALL_DEFINE1(mycall, struct timeval *, tv) {//系统函数定义格式 mycall为添加的调用函数名,struct timeval *, tv为参数为结构体指针
struct timeval ktv;
do_gettimeofday(&ktv);//可能会写gettimeofday(),笔者就因为写这个函数编译了好几次都没有通过,报错为缺少头文件,但作为系统函数,只能写do_gettimeofday().
if(copy_to_user(tv, &ktv, sizeof(ktv) ) ) {//将核心态的结果拷贝到用户态
return -EFAULT;
}
return 0;
}

函数定义写好后,就要在头文件中添加声明

cd /usr/src/linux-4.4.179/arch/x86/include/asm/
sudo vim syscalls.h
在末尾插入asmlinkage long sys_mycall(strruct timeval *tv);//声明要和函数定义中保持一致函数名,参数等

加一个系统调用的id

cd/usr/src/linux-4.4.179/arch/x86/entry/syscalls//进入/usr/src/linux-4.16.10/arch/x86/syscalls目录

vim syscall_64.tbl//打开文件syscall_64.tbl(该文件有一个系统调用列表,最前面的属性是id)

在里面添加自己的系统调用号(326 common mycall sys_mycall)//326为当前调用号加一得来的

最后保存退出
最后一步
配置内核
cd /usr/src/linux-4.4.179

编译内核和安装内核.

依次输入这四条语句

sudo make mrproper

sudo make clean

sudo make menuconfi//先点save 再点exit

sudo make -j8//可以使用多线程编译 j8为8线程,多线程不好的地方就是出现错误不会停下来,下一个线程就切过去了,所以为了稳妥还是老老实实 sudo make 吧

如果运气好,没报错的话,接下来进行模块安装
sudo make modules_install
sudo install//将内核安装到系统中

安装好后重启电脑,开机选项中选择高级选项
选择你装好的内核版本
下面进行验证添加的系统调用函数
编写一个c文件

#define _GNU_SOURCE
#include <unistd.h>
#include <sys/time.h>
#include <sys/syscall.h>
#include <stdio.h>
#define __NR_mycall 333 //系统调用号

int main() {

    struct timeval gettime;
    struct timeval mycalltime;
    gettimeofday(&gettime, NULL);
    syscall(__NR_mycall, &mycalltime);
    printf("gettimeofday:%ld %ld \n", gettime.tv_sec, gettime.tv_usec);
    printf("mycall : %ld %ld \n", mycalltime.tv_sec, mycalltime.tv_usec);
    return 0;
}

如何结果相同则证明成功了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值