Linux 编译内核且增加一个系统调用

文章目录

  • Linux 编译内核且增加一个系统调用
    • 一.在添加系统调用之前需要先编译一个Linux的内核。
      • 解压
      • 安装依赖
      • 编译
      • 安装内核
    • 二.系统调用
      • 声名和定义系统调用函数
        • 声名
        • 定义
      • 添加一个系统调用id
      • 进行编译
      • 可能出现的错误
      • 运行检验

一.在添加系统调用之前需要先编译一个Linux的内核。

下载地址

解压

在下载了源码之后,需要对其进行解压和编译

sudo tar -xavf linux-5.7.tar.xz

解压文件到桌面

安装依赖

这个也是笔者在网上找的在编译时所需要的一些资源,直接安装就可以了。

sudo apt-get install gcc make libncurses5-dev openssl libssl-dev
sudo apt-get install build-essential
sudo apt-get install pkg-config
sudo apt-get install libc6-dev
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install libelf-dev

编译

1.进入刚刚解压的文件里面(此处我是在桌面操作的)

cd linux-5.7

2.复制一份系统自带的config文件(这个需要自己去目录下面找)

sudo cp /boot/config-5.3.0-53-generic .config

3.使用make menuconfig(如果想了解可以去看https://blog.csdn.net/xuyuefei1988/article/details/8635539)

sudo make menuconfig

这个可以直接关闭

4.然后就可以直接开始编译
这里所需要的时间有点长

sudo make -j4  #编译内核,这个时候你可以去吃点东西.......
sudo make modules_install  #安装模块

安装内核

1.由于此时我们编译好的内核还在我们的桌面上,因此首先需要把内核移动到/usr/src目录内,然后切换到该目录下

sudo mv linux-5.7 /usr/src
cd  /usr/src/linux-5.7/

2.安装内核

sudo make installsudo mkinitramfs -o /boot/initrd.img-5.7.0
sudo update-initramfs -c -k 5.7.0 sudo update-grub2


可能大家现在发现了一件事,就是现在的系统内核还是之前的,此时需要重启电脑,然后开机后再次查看

此时的内核版本就已经改为了我们最新安装的。
编译内核到此就结束了。

二.系统调用

因为本文主要介绍怎么操作,因此不会介绍原理,如果大家感兴趣可以自行百度或Goole

声名和定义系统调用函数

声名

1.这个需要注意一下,最好是写在/usr/src/linux-5.7/include/linux 这个文件夹下,要不可能会找不到函数的声名

gedit syscalls.h #你也可以使用vim

定义

此处需要注意一点,就是在最新的里面"The x64_sys*() stubs are created on-the-fly for sys*() system calls"
这个定义和声名最好比接下来要写的系统调用id多上"_x64",要不可能会报错。

sudo vim kernel/sys.c


添加一个系统调用id

注意:id不要和已存在的系统调用重复
此处笔者多写了一个横杠,其实可以不要

sudo vim arch/x86/entry/syscalls/syscall_64.tbl

进行编译

sudo make clean
sudo make oldconfig #仍采用原内核配置文件
sudo make
sudo make modules_install
sudo make install


在编译完成之后 reboot 重启系统

可能出现的错误

1.arch/x86/entry/syscall_64.o:(.rodata+0xdb8):对‘__x64_sys_myno_name’未定义
这个一个可能是你文件路径找错了,根据我说的目录重新找过
还有一个可能就是,你在定义了id之后,把声明函数和定义函数写的和你所添加的一致,我之前也是这个问题,然后发现需要在声明函数和定义函数前**加上"_x64"**才可以
这个错误只适用于5.7版本的,以后会不会变,我也不知道。

2.ubuntu AER: device [8086:9d14] error status/mask=00000001/00002000
解决方法:

vim /etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
pci=nomsi pci=noaer pcie_aspm=off
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pci=nomsi pci=noaer pcie_aspm=off"sudo update-grub

运行检验

#include <linux/unistd.h>
#include <sys/syscall.h>
int main(){syscall(439);
return 0;
}

使用gcc 编译

gcc -o test test.c
./test
dmesg

OK!,结束了。

Linux 编译内核且增加一个系统调用相关推荐

  1. Linux实验 | Ubuntu20.04编译内核并添加一个系统调用

    实验环境 Ubuntu 20.04 LTS VMware Workstation Pro 16 Linux Kernel 5.10.2 存储空间至少留55GB,我第一次做就因为空间不够编译失败,最后编 ...

  2. linux内核打开prntk,操作系统实验一向Linux内核增加一个系统调用.docx

    操作系统实验一: 向Linux内核增加一个系统调用 xx 711103xx 2012年3月18日 一.实验目的 通过实验,熟悉Linux操作系统的使用,掌握构建与启动Linux内核的方法:掌握用 户程 ...

  3. 向Linux增加一个系统调用或内核模块

    向Linux增加一个系统调用或内核模块 配置环境 获取root权限 sudo su 更新系统 sudo apt-get update 安装相关编译程序包 sudo apt-get install li ...

  4. Ubuntu增加一个系统调用(20.04)西电软工OS实验专题二

    title: 西电软工OS实验专题二–增加系统调用 date: 2022-05-14 07:48:48 tags: OS 写在前面: 如果这个过程中你某个地方没有把握,切记使用vm的快照功能,血的教训 ...

  5. 非常好的Linux编译内核详解 - -

    转载: http://blog.chinaunix.net/uid-263488-id-2138150.html 非常好的Linux编译内核详解 - - 一.内核简介  内核,是一个操作系统的核心.它 ...

  6. linux编译内核支持pam,linux编译内核make menuconfig报错解决办法

    linux编译内核时 输入make menuconfig命令 *** Unable to find the ncurses libraries or the *** required header f ...

  7. linux内核编译系统调用,linux编译内核及添加系统调用

    我们都知道系统功能调用是Unix/Linux操作系统向用户程序提供支持的接口,通过这些接口应用程序向操作系统请求服务,控制转向操作系统,而操作系统在完成服务后,将控制和结果返回给用户程序. 系统调用的 ...

  8. 操作系统作业:给linux系统增加一个系统调用

    前不久开了一门<操作系统>,老师上课留下了一个作业--给Linux系统添加一个系统调用.刚开始只能用一脸懵逼来形容,只能硬着头皮做下去.由于刚的新电脑,所以就没敢装双系统.所以我选择了虚拟 ...

  9. 给linux系统增加一个系统调用并测试,超详细含错误锦集

    操作系统:给linux系统内核增加系统调用并测试 实验内容 实验环境 实验过程 1.安装环境 2.给内核增加系统调用 3.编译内核 4.安装内核 5.编辑测试文件 实验内容 1.给linux系统内核增 ...

最新文章

  1. 阿里云首席科学家闵万里:我们为什么敢挑战一百年的制度,因为黑科技能为挽救生命抢来50%的可能性
  2. 五大常用算法之二:动态规划算法
  3. shell脚本 逐行读取文本并且 进行字符串的截取
  4. LeetCode 53. 最大子序和(Maximum Subarray)
  5. 征战蓝桥 —— 2016年第七届 —— C/C++A组第2题——生日蜡烛
  6. cenos 安装 phpredis 扩展
  7. 中石油训练赛 - Bad Treap(数学)
  8. 制作支付页面弹框html,JS实现仿微信支付弹窗功能_蜡烛_前端开发者
  9. 《架构之美》阅读笔记06
  10. Linux学习总结(六十六)打印一串数字的脚本
  11. 那些有实力进入 BAT 的本科生,都做对了什么事?
  12. 分布式存储系统学习笔记(二)—分布式文件系统(1)—Google文件系统GFS
  13. Network 第三篇 - STP生成树协议
  14. python的输入来源包括啥_Python中使用 input 函数来获取输入
  15. CSTAnbsp;【Computer-Supportedamp;n…
  16. koreader下载_Koreader阅读器app免费安装最新版|Koreader阅读器2018手机最新版下载_v1.0_9ht安卓下载...
  17. Macbook Pro 201 装Win10 声卡_直播_个人工作室入门_1K-2k价位录音编曲声卡推荐
  18. kotlin-stdlib 与 kotlin-stdlib-jdk7
  19. 三级网络技术通关指南
  20. ai人工智能开发_面向开发人员的十大人工智能(AI)工具

热门文章

  1. C++ 模板函数 讲解及实现
  2. 网络技术基础知识点整理,计算机基础知识重点笔记
  3. Enigma – Sadness
  4. mt管理器修改域名对接apk壳修改方法反编译白菜视频教程
  5. 如何使用DxO PureRAW 获得更好的RAW文件?
  6. deepdive操作
  7. js获取网络设备类型
  8. 休息休息~~~~Happy一下
  9. 合泰单片机 | HT66F3195 | 个人库开发过程 | 【3】芯片基础属性
  10. 读《自下而上万物进化简史》