从零开始基于ubuntu给Linux添加一个系统调用

一、目标

修改并安装内核,添加一个系统调用,在内核日志中输出字符串。

二、版本清单

这次实验在win10环境里的ubuntu虚拟机进行。

        

三、具体实施

0. 把内核linux-4.9.229.tar.gz移动到 /usr/src 目录下

    1. 在虚拟机外下载好文件后把文件到Downloads目录下(或者复制然后右键Paste)

报错就选最右边的Retry

 然后按Ctrl+Alt+t 调出终端

移动文件到/usr/src目录下

//初始化root用户
# sudo passwd root
//切换root用户
# su root
//移动文件
# sudo mv /home/r8/Downloads/linux-4.9.229.tar.gz /usr/src

1.工具下载和前期准备工作

  1. 初始化root用户

    # sudo passwd root
  2. 切换root用户

    # su root
  3. 切换内核所在目录 /usr/src

  4. 解压内核文件

    1. # gzip -d linux-4.9.229.tar.gz
    2. # tar -xvf linux-4.9.229.tar
  5. 安装工具:

    1. 安装图形化界面所需工具:

      # sudo apt-get install libncurses5-dev
    2. 安装后续编译内核所需工具:

      1. # sudo apt-get install aptitude
           安装这个全Y就行
      2. # sudo aptitude install libssl-dev
        1. 注意:安装libssl-dev的时候,会询问3次,依次按下 N, Y ,Y

          1. 按了N之后就没有第二第三次重新装Y即可

2.配置内核

  1. 进入解压好的linux-4.9.229目录/usr/src/linux-4.9.229

  2. 指定硬件体系架构:

    # export ARCH=x86
  3. 配置board config:

    # make x86_64_defconfig
  4. 打开内核配置页面进行如下配置:

    # make menuconfig
General setup  --->
​
       ----> [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
​
    Device Drivers  --->
​
       [*] Block devices  --->
​
               <*>   RAM block device support
​
               (65536) Default RAM disk size (kbytes) 

        make menuconfig 时可以将General setup -> Local version - append ... 修改成新的名称,如 “myKernel”。这样后续编译好的内核名字就是myKernel

https://www.bilibili.com/video/BV1Wk4y1m7vy

        这里可以参考这个视频进行配置,在第一集12分钟左右开始。空格操作选择,回车操作进入。上述内容均参考该视频操作。

3.添加系统调用

添加系统调用操作均参考这篇文章:如何给linux添加一个系统调用_linux添加系统调用_带上一无所知的我的博客-CSDN博客

  1. 使用gedit操作sys.c文件加入函数

    # sudo gedit /usr/src/linux-4.9.229/kernel/sys.c
  2. 在末尾添加

asmlinkage long sys_helloworld(void) {
    printk("hello world!");
    return 1;
}

  1. 添加函数声明

        打开函数声明文件:

# sudo gedit /usr/src/linux-4.9.229/arch/x86/include/asm/syscalls.h

        插入声明:

asmlinkage long sys_helloworld(void);

  1. 添加系统调用id

    打开文件:

    # sudo gedit /usr/src/linux-4.9.229/arch/x86/entry/syscalls/syscall_64.tbl
  2. 添加一行内容:

    332 64 helloworld sys_helloworld

4.编译安装内核

  1. 进入目录:

    cd /usr/src/linux-4.9.229
  2. 删除之前编译所生成的文件和配置文件:(第一次编译可以不做 不然会把配置删除

    # sudo make mrproper
  3. 检查是否生成依赖(dependency)信息并清除旧的编译结果:(第一次编译可以不做 不然会把配置删除 要重新make menuconfig

    # sudo make clean
  4. 编译二进制内核映像文件:

    # make bzImage -j2

    ps:编译线程越多,速度越快,我这里是2核。大概用25分钟

  5. 进行模块的编译和安装(用时都比较久):

    1.  # sudo make modules
    2. # sudo make modules_install

  1. 进行内核安装:

    # sudo make install

5.重启虚拟机

重启后点击鼠标进入ubuntu并且迅速长按shift,进入内核选择界面<br />

        选择你的内核并进入系统

6.验证

新建文件输入如下代码

#include <stdio.h>
#include<linux/kernel.h>
#include<sys/syscall.h>
#include<unistd.h>
​
int main()
{
    long int a = syscall(333);
    printf("System call sys_helloworld return %ld\n", a);
    return 0;
}
编译:# sudo gcc -o hello hello.c运行:# ./hello打开另一个终端查看内核日志:# dmesg | tail -4

到这一步就结束了 ,恭喜你完成了 ✺◟(∗❛ัᴗ❛ั∗)◞✺


本文参考:如何给linux添加一个系统调用_linux添加系统调用_带上一无所知的我的博客-CSDN博客https://www.bilibili.com/video/BV1Wk4y1m7vy从源码编译linux-4.9内核并运行一个最小的busybox文件系统(最新整理版) - 哔哩哔哩

猜你喜欢

转载自blog.csdn.net/csdn1940879828/article/details/130898679
今日推荐