Linux学习55 Linux内核模块功能定制

一、概述

  1、内核的组成部分:kernel,kernel object,ramdisk

    kernel:uname

    kernel object:lsmod,modinfo,modprobe,insmod,rmmod,depmod

    ramdisk:mkinitrd,dracut

  2、启动流程

    POST --> BootSequence(BIOS) --> Bootloader(MBR) --> kernel(ramdisk)-->rootfs(switch_root) --> /sbin/init (/etc/inittab,/etc/init/*.conf,/usr/lib/systemd/system/)--> 设定默认运行级别,系统初始化,关闭及启动服务,启动终端(启动图形终端)

  3、grub

    1st stage:mbr

    1_5 stage:mbr之后的扇区

    2nd stage:/boot/grub/

      加密:编辑,内核

二、编译内核

  1、程序包的编译安装:

    ./configure,make,make install 

  2、前提:开发环境(开发工具,开发库),头文件:/usr/include

  3、开源:源代码 --> 可执行格式

    发行版:以“通用”的目标

  4、编译内核的前提

    a、准备好开发环境

    b、获取目标主机上硬件设备的相关信息

    c、获取到目标主机系统功能的相关信息,例如要启用的文件系统

    d、获取内核源代码包:www.kernel.org

  5、准备开发环境:

    a、CentOS6.7

      包组

      (1)、Development Tools

      (2)、Server Platform Development

    b、CentOS7

      包组

      (1)、Development Tools

      (2)、Server Platform Development

    c、在这之前我们需要确保我们安装了ncurses这个rpm包

  6、获取目标主机上硬件设备的相关信息

    a、CPU

      (1)、可通过查看/proc/cpu文件信息获取

      (2)、可通过lscpu命令查看CPU信息

      (3)、可通过x86info -a 命令查看

    b、PCI设备

      (1)、可通过lspci命令查看

          lspci -v[-vv]

      (2)、lsusb

      (3)、lsblk

    c、了解全部硬件设备信息

      (1)、hal-device

三、内核编译过程

  1、获取源码

    www.kernel.org

  2、解压并软连接

    

    

  3、我们看到里面有许多文件

    a、arc:与平台相关的源代码

    b、block

    c、crypto:相应的加密算法

    d、Documentation:相应的说明文档

    e、firmware:固件设备驱动

    f、fs:文件系统

    g、init

    h、ipc:进程间通信

    i、lib:相应的库

    j、mm:内存管理

    k、net:网络协议栈

    l、samples:示例

    m、security:安全相关的

    n、sound:声卡设备

    o、tools:内核自带的一些工具

    p、virt:虚拟化,可以看到支持kvm虚拟化,因为kvm是内核级虚拟化,因此他有一个专门的目录来存放kvm

      

   4、内核编译

    a、make,我们可以使用make help查看相应的选项

    b、我们可以通过make menuconfig命令去打开一个文本界面,不过前提是我们需要安装刚刚我们说的ncurses包。打开文本界面后就可以通过空格键进行需要编译项的选定。我们前面说过,如果选项是*表示编译进内核,如果选项是M表示编译成模块,没选的话表示不编译不启用此功能。

  

  5、相应步骤归纳

    a、步骤

      tar -xf linux-3.10.67.tar.xz -C /usr/src

      cd /usr/src

      ln linux-3.10.67 linux

      cd linux

      make menuconfig #配置内核

      make [-j #] #开始编译,-j的意思是同时启动几个线程进行编译

      make modules_install #安装内核模块

      make install #安装内核,安装后他会自动帮你生成一个grub的选项

      如果编译过程中断开了怎么办呢?因此我们可以把make 编译命令运行在screen上

    b、screen命令

      (1)、运行在终端上打开一个屏幕,我们在我们的远程终端上敲screen时其实我们是打开了一个桌面,或者说是一个屏幕,这个屏幕和刚刚的终端是分离的。

      (2)、我们可以通过screen -ls 命令查看我们拆除了哪些屏幕

        

       (3)、我们可以通过screen -r id好连回我们拆除的桌面

        

       (4)、我们的远程终端连接如果断开了也不会影响我们screen的运行

       (5)、相应命令总结

        1)、打开screen: screen

        2)、拆除screen:同时按住Ctrl+a然后按d键

        3)、列出screen: screen -ls

        4)、连接至screen:screen -r SCREEN_ID

        5)、关闭screen:screen中敲exit即可

     c、模板配置文件制作

      (1)、我们可以基于当前系统上的模板选项来进行编译配置项的选择,因此在我们需要先将我们 /boot/config-3.10.0-229.el7.x86_64文件复制到我们/usr/src/linux目录下,我们的红帽为了让我们操作系统使用者了解内核在编译时到底启用了哪些选项,他把他内核编译时的配置文件直接放在了/boot目录下,注意此配置文件并不是所有发行版都有的,只是红帽或centos有,他把这个文件放在/boot目录下用来我们将来编译内核时作为模板使用。有些发行版直接会在/proc/config.gz中提供。因此我们可以把这个文件复制出来展开直接用,他也是内核配置模板。因此此时我们将boot目录下的文件复制到源码目录中取名为 .config

    

      (2)、然后我们使用make menuconfig命令进行相应配置项的选择(相应的内核选项翻译可以百度金步国,非计算机专业非科班出身的大佬)

      (3)、然后我们可以打开screen然后敲make命令进行编译

      (4)、接下来我们执行make modules_install命令,然后我们就可以在我们/lib/modules目录下看到相应的目录和文件

        

        

      (5)、接下来我们来安装内核,我们可以看到在我们/usr/src/linux/arch/x86_64/boot目录下有一个bzImage文件,这个文件是个链接文件,他指向/usr/src/linux/arch/x86/boot目录下的这个文件的,因此我们所说64位平台是兼容32位的。

        此时我们来执行make install命令。

     

        此时他还会在/boot目录下去生成ramfs文件和我们的vmlinuz文件。

         我们还会在/boot/grub2中生成相应的文件,grub2的配置文件在/etc/grub2.cfg,我们可以看到此配置文件中也多了相应的内容

         我们还可以设置谁成为默认的启动菜单,对grub2而言他是在/etc/default/grub文件中编辑的

        然后我们重启后选择使用新版内核即可

         

  6、相应编译流程

    a、配置内核选项

      (1)、支持"更新"模式进行配置:在已有的.config文件的基础之上进行"修改"配置。

        1)、make config:基于命令行以遍历的方式去配置内核中可配置的每个选项

        2)、make menuconfig:基于cureses的文本配置窗口

        3)、make gconfig:基于GTK开发环境的窗口界面;包组"桌面平台开发"

        4)、make xconfig:基于QT开发环境的窗口界面

      (2)、支持"全新配置"模式进行配置

        1)、make defconfig:基于内核为目标平台提供的"默认"配置为模板进行配置

        2)、make allnoconfig:所有选项均为"no"

    b、编译

      (1)、多线程编译:make [-j #]

      (2)、编译内核中的一部分代码

        1)、只编译某子目录中的相关代码

          cd /usr/src/linux

          make path/to/dir/

        2)、只编译一个特定的模块

          cd /usr/src/linux

          make path/to/dir/file.ko

      (3)、如何交叉编译

        1)、目标平台与当前编译操作所在的平台不同

          make ARCH=arch_name

        2)、要获取特定目标平台的使用帮助

          make ARCH=arch_name help

    c、如何在执行过编译操作的内核源码树上做重新编译操作

       (1)、事先清理操作

        1)、make clean:清理编译生成的绝大多数文件,但会保留config,及编译外部模块所需要的文件

        2)、make mrproper:清理编译生成的所有文件,包括配置生成的config文件及某些备份文件

        3)、make distclean:相当于mrproper,额外清理各种patches以及编译器备份文件

       

   

 

原文地址:https://www.cnblogs.com/Presley-lpc/p/12554865.html