向linux内核增加一个系统调用-1

验证编辑编译内核的流程,并增加新的系统调用


注意:需要/目录至少10GB空间,/boot目录500MB空间


下载内核并解压

kernel下载
百度云搬运 密码: qc8b
进入 /usr/src目录
tar -xvf linux-4.13.10.tar.xz
cd linux-4.13.10

添加系统调用号

vim ./arch/x86/entry/syscalls/syscall_64.tbl(32位系统是syscall_32.tbl)
1029215-20171104093547841-1256982279.png

声明系统调用函数原型

vim ./include/linux/syscalls.h
1029215-20171104093603123-2119944903.png

其中的asmlinkage用在大多数的系统调用中。在一些情况下是需要明确的告诉编译器使用stack来传递参数,X86中的系统调用是先将参数压入stack以后调用sys_函数的,所以所有的sys_函数都有asmlinkage来告诉编译器不要使用寄存器来编译。

添加系统调用函数的定义

vim kernel/sys.c 末尾添加
1029215-20171104093610888-1862444324.png

编译

make menuconfig

(缺失ncurses,sudo apt-get install libncurses5-dev,)选择save 然后exit

make clean
make -jn

并行编译,加快编译速度,n=cpu核心数×2,双核即-j4
scripts/sign-file.c:25:30: fatal error: openssl/opensslv.h: 没有那个文件或目录 sudo apt-get install libssl-dev
作为参考,i5-6200u 2.8GHZ需要40min左右

安装

make modules
make modules_install 安装模块
make install 安装内核
update-grub

测试

重启选择新的内核(grub引导界面选择ubuntu高级设置,选择linux-4.13.10)
进入后可uname -a确认内核版本

#include<stdio.h>
#include<unistd.h>

int main()
 {
    int a=syscall(333,2);
    printf("system call return %d\n",a);
    return 0;
}

1029215-20171104093619310-1320352655.png

编译后运行返回2,并在日志中打印hello world

转载于:https://www.cnblogs.com/yueshangzuo/p/7782295.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值