Linux内核编译以及新增系统调用函数

实验内容

(作者:Baron_w,禁止转载)
⚫ 编译 Linux 内核
⚫ Linux 启动过程
⚫ Linux 系统调用实现分析
⚫ 增加一个系统调用**

相关知识

  1. dmesg 的用法
    ⚫ 列出加载到内核中的所有驱动
    我们可以使用如‘more’。 ‘tail’ , ‘less ’或者‘grep’文字处理工具来处理‘dmesg’
    命令的输出。由于 dmesg 日志的输出不适合在一页中完全显示,因此我们使用管道(pipe)
    将其输出送到 more 或者 less 命令单页显示。
    dmesg | more
    dmesg | less
    ⚫ 列出所有被检测到的硬件
    要显示所有被内核检测到的硬盘设备,你可以使用‘grep’命令搜索‘sda’关键词,如
    下:
    dmesg | grep sda
    ⚫ 只输出 dmesg 命令的日志
    在‘dmesg’命令后跟随‘head’命令来显示开始几行,‘dmesg | head -20′命令将显示
    开始的前 20 行。
    dmesg(在 dmesg 里我们可以查看到开机信息, printk 产生的信息等。 )
  2. Linux cp 的使用
    Linux cp 命令主要用于复制文件或目录。
    -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。
    其作用等于 dpR 参数组合。
    -d:复制时保留链接。这里所说的链接相当于 Windows 系统中的快捷方式。
    -f:覆盖已经存在的目标文件而不给出提示。
    -i:与-f 选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答"y"时目
    标文件将被覆盖。
    -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
    -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
    -l:不复制文件,只是生成链接文件。
  3. make mrproper
    该命令确保源代码目录下没有不正确的.o 文件以及文件的互相依赖。

Linux 内核编译

**

  1. 首先在虚拟机的终端内键入命令 apt-cache search linux-source 来查适用于自己
    系统的内核版本,如下图:
    Linux内核编译以及新增系统调用函数_第1张图片

  2. 其次查看自己的内核版本,防止下载相同版本的内核进行试验,如下图:
    在这里插入图片描述

  3. 在确定版本后打开 Linux 的内核官网进行内核的下载 www.kernel.org,进入后
    选择 HTTP 协议下的链接,之后依次选择进入/linux/kernel/v4.x/内,然后查找
    相应的内核版本。在这里我选择的是 Linux-4.10.14 版本,复制器链接,然后在
    Ubuntu16.04 终端内进入到 Downloads 目录下(cd Downloads), 输入命令 wget
    https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.10.14.tar.gz 4.10.14 版
    本内核。
    Linux内核编译以及新增系统调用函数_第2张图片

  4. 待内核下载完之后, 继续在该目录下进行操作,键入命令 cp linux-4.10.14.tar.gz
    /usr/src/,将该内核压缩包复制到 usr/src 目录下。

  5. 使用命令 tar -zxvf linux-4.10.14.tar.gz 将压缩包解压。

  6. 之后进入 linux-4.10.14 文件夹(cd linux-4.10.14) 。在开始编译之前,先将一
    些必要的环境安装好,防止出现错误而导致中途退出。

  7. 经搜集总结之后,所需要的依赖包或库有以下几项:
    ⚫ libncurses5-dev :主要是在 make menuconfig 时能够出现图形化的选择菜单
    所依赖的的库
    ⚫ libssl-dev : openssl 的依赖包
    ⚫ build-essential:建立 debian 软件包的工具
    ⚫ openssl :涉及到系统安全的编译过程中的相关程序的依赖库
    ⚫ zlibc :允许运行中的文件能够实现解压缩数据文件的一个工具
    ⚫ minizip :是一个轻量级的支持库,能够支持压缩、提取、查看和操作 ZIP
    文件。该软件包包括 minizip 和 miniunzip 工具
    ⚫ libidn11-dev : 涉及到系统帮助等文档以及软件库等信息的一个软件包
    ⚫ libidn11 : ubuntu 自带
    安装时,只需要在终端键入以下四条命令:
    a) sudo apt-get install libncurses5-dev libssl-dev
    b) sudo apt-get install build-essential openssl
    c) sudo apt-get install zlibc minizip
    d) sudo apt-get install libidn11-dev libidn11
    在这里插入图片描述

  8. 在配置完环境之后,键入命令 make menuconfig。 在 menuconfig 中出现选择
    的图形化界面后,直接按右方向键选择到 exit 退出,退出提示中选择保存,实
    现内核的默认配置。
    Linux内核编译以及新增系统调用函数_第3张图片
    Linux内核编译以及新增系统调用函数_第4张图片

  9. 在开始编译之前可以执行命令查看自己电脑支持最大线程数目,命令为 lscpu。
    Linux内核编译以及新增系统调用函数_第5张图片

  10. 接下来可以开始编译了, 在/usr/src/linux-4.10.14 目录下进行编译,否则会报错。
    键入命令 make -j8 之后等待一段时间。
    Linux内核编译以及新增系统调用函数_第6张图片

  11. 编译完之后输入以下两个命令依次安装内核模块和内核:
    ⚫ sudo make modules_install
    ⚫ sudo make install
    Linux内核编译以及新增系统调用函数_第7张图片

  12. 完成之后利用 reboot 命令来重启电脑。在开机时一直按住 shift 键进入高级启
    动模式。
    Linux内核编译以及新增系统调用函数_第8张图片
    Linux内核编译以及新增系统调用函数_第9张图片

  13. 进入系统后打开终端输入 uname -r 查看内核版本是否为之前所编译安装的内
    核。确认之后内核编译到此结束。
    在这里插入图片描述

新增系统调用

  1. 首先打开文件 syscall_64.tbl 添加自己的系统调用函数以及对应的系统调用编号。 输
    入命令 vim arch/x86/entry/syscalls/syscall_64.tbl 打开该文件可以看出 332 编号系统暂未
    使用,因此在 331 下一行输入自己的函数编号以及函数名字等信息。
    Linux内核编译以及新增系统调用函数_第10张图片
  2. 进入 syscall.h 声明自己的函数。使用命令 vim include/linux/syscalls.h
    打开文件,在文件的末尾加入自己的函数声明。
    在这里插入图片描述
  3. 使用命令 gedit kernel/sys.c 打开 sys.c 加入头文件#include 并在
    末尾加入自己的函数。
    在这里插入图片描述
  4. 接下来编译并安装内核,方法与之前的一样。
    ⚫ sudo make menuconfig
    ⚫ make -j8
    ⚫ make modules_install
    ⚫ make install
  5. 使用命令 reboot 重启系统,进入编译的内核。使用命令 uname -r 查看内核版本。
    编写 C 语言程序 hello.c 调用系统函数进行测试内核
    #include
    int main()
    {
    for(int i=0;i<5;i++)
    {
    printf(“ret=%d”,syscall(332,i));
    }
    return 0;
    }
  6. 编写完之后进行编译 gcc hello.c -o hello。 编译完之后执行 hello 文件./hello。
    随即再输入 dmesg 来查看 printk 所打印的东西。
    Linux内核编译以及新增系统调用函数_第11张图片
    到此新增的系统调用功能实现。

你可能感兴趣的:(操作系统)