通过内核编译法向Linux内核添加系统调用

【实验内容】:

  向Linux添加一个系统调用

  测试该系统调用

  使用ptrace或类似的系统跟踪工具来对该测试程序进行跟踪调试

【软件】:VMWare支持的Ubuntu虚拟机 VSCode

【步骤】

1.在实验之前先下载好相关软件包

不过如果升级了make以后,如果内核版本低,会报错

1.    sudo apt-get install make
2.    sudo apt-get install gcc
3.    sudo apt-get install libncurses5-dev
4.    sudo apt-get install flex
5.    sudo apt-get install bison
6.    sudo apt-get install libssl-dev
7.    sudo apt-get install libelf-dev

2.进入 /usr/src下载内核源码(实验所用源码为 linux-5.5.7)

内核5.5.7所需要的存储空间特别大!!!一定要提前准备好!!!

1.    cd /usr/src
2.    wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.5.7.tar.xz  

3.下载好之后在当前目录进行解压

1.    tar -xvf linux-5.5.7.tar.xz  

4.编写系统调用的入口表

1.    sudo vim linux-5.5.7/arch/x86/entry/syscalls/syscall_64.tbl  

添加

1.    335     common      mysyscall        __x64_sys_mysyscall

5.编写系统调用函数声明

1.    sudo vim linux-5.5.7/include/linux/syscalls.h

在里面添加

1.    asmlinkage long sys_mysyscall(int number);

6.实现系统调用函数

1.    sudo vim linux-5.5.7/kernel/sys.c

在里面添加

1.    SYSCALL_DEFINE1(mysyscall, int, number) {
2.        int result = number * number * number;
3.        printk("The result is %d\n", result);
4.        return 0;
5.    }  

7.重新编译内核

1.    cd linux-5.5.7/                            //进入内核文件夹
2.    sudo cp /usr/src/linux-headers-5.3.0-40-generic/.config /usr/src/linux-5.5.7 //复制内核配置
3.    make mrproper                                //删除以前编译产生的垃圾文件
4.    make clean
5.    make menuconfig                              //选择Save保存再Exit
6.    make -j4                                     //编译内核
7.    make modules_install                         //安装模块
8.    make install                                 //安装内核  

8.重启选择linux-5.5.7进入

(因为linux系统会自动选择高版本内核加载,因此重启虚拟机后加载的内核就是刚刚编译完成的5.5.7内核)

9. 编写测试程序test.c验证系统调用是否成功

1.    #include <stdio.h>
2.    #include <sys/ptrace.h>
3.    #include <sys/types.h>
4.    #include <sys/wait.h>
5.    #include <sys/user.h>
6.    #include <sys/reg.h>
7.    #include <sys/syscall.h>
8.    #include <unistd.h>
9.    #include <linux/kernel.h>
10.
11.    int main () {
12.        syscall(335,4);
13.        return 0;
14.    }  

编译执行后用dmsg查看结果

正确哒!!!

10.用strace进行追踪

能看到系统调用成功

11.常见错误汇总!!

我太难了我编译了五次才成功!

make首先,一定要在解压好的文件夹里make,内核也一定解压到那个文件夹!!!千万不能自己创一个文件夹写那个名字!!!我有个朋友这么干的哈哈哈哈

最常见的错误就是包没装全,如果报错就装就好了。

然后在make -4j之前,一定要检查一下有没有问题,因为make -4j一旦失败enmmmmmm。。。我的方法就是不sudo输入make -4j,这样除了权限报错以外,别的错误也会报错

之后就是内核编译的错误了

它是这样报错的:

[[email protected] module]# make

make -C /opt/kangear/kernel/linux-2.6.32.2 M=/root/桌面/kangear/module modules

make[1]: Entering directory `/opt/kangear/kernel/linux-2.6.32.2‘

ERROR: Kernel configuration is invalid.

include/linux/autoconf.h or include/config/auto.conf are missing.

Run ‘make oldconfig && make prepare‘ on kernel src to fix it.

WARNING: Symbol version dump /opt/kangear/kernel/linux-2.6.32.2/Module.symvers

is missing; modules will have no dependencies and modversions.

Building modules, stage 2.

/opt/kangear/kernel/linux-2.6.32.2/scripts/Makefile.modpost:42: include/config/auto.conf: 没有那个文件或目录

make[2]: *** 没有规则可以创建目标“include/config/auto.conf”。 停止。

make[1]: *** [modules] 错误 2

make[1]: Leaving directory `/opt/kangear/kernel/linux-2.6.32.2‘

make: *** [all] 错误 2

[[email protected] module]#

内核配置文件.config出错。

可以参照一下这个博客https://blog.csdn.net/u013225150/article/details/48272853

另外,这个博客的错误我也都遇到了https://blog.csdn.net/stranger00001/article/details/84637032?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

然后总结一下我这五次编译的卑微过程吧……

0.编译前因为安装包不全,在make -4j之前失败了很多次

1.第一次编译,因为在写程序的时候用了for函数,编译时并不支持,导致失败

2.去掉for函数之后,显示找不到配置的.config文件,发现make menuconfig的操作有误,内核配置文件的命令输入同样错误,并没有把内核配置成功复制

3.配置好内核,把所有相关包检查升级后再次编译,出现pkg错误,上网查资料后发现是make版本过高,一开始选择的4.18内核不支持

4.选择最新的5.5.7内核进行编译,因为虚拟机空间不足报错

5.不加sudo编译时(即会报错但因权限不足无法全部编译,通过这种办法节省时间查找错误)报错arch/x86/Makefile:129: CONFIG_X86_X32 enabled but no binutils support,查找网上资料后说是缺少binutils支持,检查更新没有问题,之后找到方案在内核配置时选择:

--> Device Drivers

--> Multiple devices driver support (RAID and LVM)

--> Device mapper support

(这一项改为n)

再次编译后成功。

原文地址:https://www.cnblogs.com/jhjgarden/p/12591453.html

时间: 2024-10-14 00:54:56

通过内核编译法向Linux内核添加系统调用的相关文章

debian下为stm32f429i-discovery编译uboot、linux内核和根文件系统

交叉编译器:arm-uclinuxeabi-2010q1 交叉编译器下载下来后解压,然后将其中bin文件夹路径加入到PATH变量中. 根据<debian下烧写stm32f429I discovery裸机程序>安装openocd. 安装genromfs,使用下面命令: sudo apt-get install genromfs 已经有人提供好脚本,只要执行几条命令即可.使用git下载文件并进行编译: git clone https://github.com/jserv/stm32f429-lin

Linux内核分析——第一章 Linux内核简介

第一章   Linux内核简介 一.Unix的历史 1.Unix系统成为一个强大.健壮和稳定的操作系统的根本原因: (1)简洁 (2)在Unix中,很多东西都被当做文件对待.这种抽象使对数据和对设备的操作都是通过一套相同的系统调用借口来进行的:open(),read(),write(),lseek()和close(). (3)Unix的内核和相关的系统工具软件是用C语言编写而成.(移植能力) (4)进程创建非常迅速,并且有一个非常独特的fork()系统调用. (5)Unix提供了一套非常简单但又

Ubuntu10.04 编译并安装Linux 内核2.6.32.60版本及错误解决。

本文主要是写给内核学习新手的,主要是在VMWare虚拟机上进行操作. 首先安装对应版本的编译工具链. 下面进行编译和安装. 1.首先解压源码. 2.使用cp命令把解压之后的源码复制到 /usr/src目录中 例如:cp -r linux-2.6.32.60  /usr/src/ ====================================== 注:如果是首次编译内核,无需执行上面1,2但是需要在内核源码目录下执行make mrproper命令来删除之前已编译的.o和.config文件

arm-linux-gcc4.4.3编译s3c2410平台linux内核

写在前面:2.6.14版本的内核用arm-linux-gcc4.4.3没有编译成功,下载2.6.37版本的内核用arm-linux-gcc4.4.3编译通过. 一.首先下载linux内核: linux-2.6.14.tar.bz2 下载地址:http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2 二.解压linux-2.6.14.tar.bz2: tar -jxvf linux-2.6.14.tar.bz2 三.配置Mak

马哥教育第十四天内核编译、lftp、内核编译安装

内核参数配置 /proc: 内核映像:许多参数(读写,只读),/proc:把内核参数net.ipv4.ip_forward虚拟成文件系统:net/ipv4/ip_forward 只读文件:输出统计信息 读写文件:设定内核工作特性,不允许使用文本编辑器打开进行编写,而只能使用重定向的方式或使用专用的工具 几个常用参数: kernel.hostname:设定主机名 vm.drop_caches:回收虚拟内存中buffers.cache中的空间.例如: echo 1 > /proc/sys/vm/dr

20135239 益西拉姆 linux内核分析 跟踪分析Linux内核的启动过程

回顾 1.中断上下文的切换——保存现场&恢复现场 本节主要课程内容 Linux内核源代码简介 1.打开内核源代码页面 arch/目录:支持不同CPU的源代码:其中的X86是重点 init/目录:内核启动相关的代码基本都在该目录中(比如main.c等) start_kernel函数就相当于普通C程序的main函数 kernel/目录:Linux内核核心代码在kernel目录中 README 介绍了什么是Linux,Linux能够在哪些硬件上运行,如何安装内核源代码等 构造一个简单的linux系统m

Linux内核(16) - 高效学习Linux内核

世界悲结束了,章鱼哥也退役了,连非诚勿扰中的拜金女也突然的少了很多.这本<Linux内核修炼之道>在卓越.当当.china-pub上也已经开卖了,虽然是严肃文学,但为了保证流畅性,大部分文字我还都是斟词灼句,反复的念几遍才写上去的,尽量考虑到写上去的每段话能够让读者产生什么疑惑,然后也都会紧接着尽量的去进行解释清楚,中间的很多概念也有反复纠结过怎么解释能够更容易的理解,力求即使对于初学者也可以有很少阻碍的一气读完.同时我也把书中一部分自己的感悟抽出来整理了精华版,share出来.当然水平有限,

给linux系统添加系统调用

实验环境 debian-9.8.0-amd64 步骤一 准备内核源代码 1 wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.20.14.tar.xz 或者使用国内镜像以加快下载速度 1 wget https://mirror.tuna.tsinghua.edu.cn/kernel/v4.x/linux-4.20.14.tar.gz 使用tar -xvf 命令解压 步骤二 修改系统调用表 cd linux-4.20.14nano

linux内核makefile概览

linux内核makefile概览 本博客参照内核官方英文文档 linux的内核makefile主要用于编译整个内核源码,按照用户的需求生成各种目标文件,对于用户来说,编译内核时非常简单的,只需要几个指令就可以做到,但是对于一个驱动开发者而言,了解内核源码的编译机制是非常必要的. make 和 makefile 需要了解的是:make是linux下的一个程序软件,makefile相当于针对make程序的配置文件,当我们执行make命令时,make将会在当前目录寻找Makefile文件,然后根据M