zoukankan      html  css  js  c++  java
  • 内核编译与系统调用

    这次实验是内核编译与系统调用,大致流程就是下载一个linux内核源代码,然后对其中的系统调用文件进行添加修改,再进行编译,最后,更换虚拟机的内核,再在其上进行系统调用。通过本实验,使我对系统调用与内核编译机制的理解更加深刻,在本次实验中也遇到了很多问题,好在最后一一解决了。

    前置准备:

    1.确保虚拟机硬盘空间大于40G

    2.内核数大于4

    3.gcc编译时的依赖库文件提前安装好

    sudo apt install build-essential
    sudo apt install libssl-dev
    sudo apt install flex
    

    4.一个和你linux内核版本近似的linux稳定版内核(我下的是5.0.1,因为我的是5.0.0-23)

    并将其拷贝到/usr/src文件夹里,下载解压代码如下:

    wget https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.0.1.tar.xz  //下载内核
    xz -d linux-5.0.1.tar.xz    //解压内核
    tar -xvf linux-5.0.1.tar    
    cp linux-5.0.1 /usr/src    //移动内核文件
    

    实验步骤:

    一:编写系统调用函数

    1.修改sys.c文件

    sudo gedit /usr/src/linux-5.0.1/kernel/sys.c
    

    并在sys.c代码最后加上函数

    asmlinkage int sys_zyq(int number){
    	printk("my number is %d".number);
    	return 5219;
    }
    

    2.修改syscalls.h文件

    sudo gedit /usr/src/linux-5.0.1/include/linux/syscalls.h
    

    在#endif前添加一行函数声明

    asmlinkage int sys_zyq(int number);
    

    3.修改syscall_64.tbl文件

    不同版本,这个文件的位置也不一样,可以用find命令查找

    sudo gedit /usr/src/linux-5.0.1/arch/x86/entry/syscalls/syscall_64.tbl
    

    由于我装的是64位linux,所以修改的是64位文件
    添加系统调用号,如下图

    二:编译内核

    在linux-5.0.1文件夹里输入以下命令

    sudo make mrproper //清除内核的目标文件、附属文件以及配置文件
    sudo make clean //清除内核中的目标文件,并不会删除设置文件
    sudo make oldconfig //设置配置文件,全程回车就好了
    sudo make bzImage //编译内核,耗时半小时左右
    sudo make modules  //编译模块,耗时2小时左右,其中driver模块耗时最久,其次是net模块
    sudo make modules_install  //安装模块
    sudo make install  
    

    三:grub引导

    简单介绍:GNU GRUB(GRand Unified Bootloader简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。

    前边内核编译好后,到这一步就是要变更内核了,而变更内核离不开grub,一般来说虚拟机中grub引导菜单会被隐藏,即使更新内核后你也无法选择进入哪个内核,此时可以修改grub参数。

    sudo gedit /etc/default/grub //修改grub文件
    

    把grub_timeout_style=hidden给删除或者注释掉,把grub_cmdline_linux_default修改为text
    修改完成后我们

    sudo update-grub    //重新更新grub配置
    

    重启虚拟机,在VMware显示界面长按shift进入grub

    打开高级选项

    找到自己编译好的版本,按回车进入

    四:调用系统函数

    1.编写调用函数

    2.输出结果

    最后输出了一串很奇怪的数字,暂时还没找到问题所在...

  • 相关阅读:
    Sql 复习(1)
    记录一次git issue
    JWT自校验框架
    分布式事务分布式锁的常用解决方式
    SpringBoot开发文档
    SpringCloud的使用以及五大核心组件
    SpringMVC
    关于开发中使用AOP的坑
    SpringCloud使用feign远程调用服务注入映射接口失败问题
    springBoot使用Restful跳转路径回显异常问题
  • 原文地址:https://www.cnblogs.com/funmary/p/11725521.html
Copyright © 2011-2022 走看看