松垮垮 松垮垮
首页
  • GPU并行编程
  • 图形学
  • 归并算法
  • 计算机视觉
  • css
  • html
  • JavaScript
  • vue
  • 压缩命令
  • cmdline
  • Docker
  • ftrace跟踪技术
  • gcov代码覆盖率测试
  • GDB
  • git
  • kgdb
  • linux操作
  • markdown
  • systemtap
  • valgrind
  • 设计模式
  • 分布式
  • 操作系统
  • 数据库
  • 服务器
  • 网络
  • C++
  • c语言
  • go
  • JSON
  • Makefile
  • matlab
  • OpenGL
  • python
  • shell
  • 正则表达式
  • 汇编
  • GPU并行编程
  • mysql
  • nginx
  • redis
  • 网络
  • 计算机视觉
  • 进程管理
  • linux调试
  • 【Python】:re.error bad escape i at position 4
  • 搭建ai知识助手
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

松垮垮

c++后端开发工程师
首页
  • GPU并行编程
  • 图形学
  • 归并算法
  • 计算机视觉
  • css
  • html
  • JavaScript
  • vue
  • 压缩命令
  • cmdline
  • Docker
  • ftrace跟踪技术
  • gcov代码覆盖率测试
  • GDB
  • git
  • kgdb
  • linux操作
  • markdown
  • systemtap
  • valgrind
  • 设计模式
  • 分布式
  • 操作系统
  • 数据库
  • 服务器
  • 网络
  • C++
  • c语言
  • go
  • JSON
  • Makefile
  • matlab
  • OpenGL
  • python
  • shell
  • 正则表达式
  • 汇编
  • GPU并行编程
  • mysql
  • nginx
  • redis
  • 网络
  • 计算机视觉
  • 进程管理
  • linux调试
  • 【Python】:re.error bad escape i at position 4
  • 搭建ai知识助手
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 分布式

  • 操作系统

    • cpu结构
    • cpu页表
    • Linux内核同步机制原理与实现
    • per
    • protocol buffer
    • 内存分配器
    • 内核编译
      • 内核驱动模型、内核模块LKM:
      • 基础

      • 段表
      • 系统调用
      • 进程
    • 数据库

    • 服务器开发

    • 网络编程

    • 系统
    • 操作系统
    songkuakua
    2025-02-15
    目录

    内核编译

    # 内核编译

    Owner: -QVQ-

    第一步:下载源码,根据自己系统对应的内核版本下载源码(uname -a查看)

    • 内核版本信息

      内核版本号的格式通常是x.y.z,其中x表示主版本号,y表示次版本号,z表示补丁级别,Ubuntu版本号的格式通常是x.y.z-数字,其中x表示Ubuntu系统的主版本号,y表示次版本号,z表示补丁级别,数字表示Ubuntu系统的版本号。

      例如:5.19.0-38-generic

      这个版本号是 Linux 内核的版本号,其中 5 表示主版本号,19 表示次版本号,0 表示补丁级别,38 表示 Ubuntu 系统的版本号,generic 表示使用的内核类型。

      补丁级别指内核的修补程序版本。每个版本的内核都可能有不同的 bug 和安全漏洞,因此内核维护者会定期发布修改程序来修复这些问题。补丁级别指的是这些修补程序的版本号。在这个版本号中,补丁级别为 0 表示没有修补程序。

      内核版本的代码下载:

      官网下载:

      (opens new window)

      在tag中选择合适的版本下载(【……】展开全部)

      官网下载太慢,推荐用镜像下载

      Index of /kernel/linux/kernel/v5.x/ (opens new window)

      git下载:

      git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

      make -j8要看自己电脑性能决定用哪个

      下下来的代码不要在Windows下解压,在linux用tar -zxvf 压缩文件名.tar.gz 被压缩文件名解压

    第二步:配置

    在下下来的代码路径下, 简便操作, 重用系统的config文件cp /boot/config-5.19.0-38-generic ./

    然后在这个路径执行make oldconfig 使用现有的配置文件,也可以使用make menuconfig设置配置项

    • 当执行make oldconfig 时出现/bin/sh: 1: ./scripts/pahole-flags.sh: Permission denied

      用如下命令开启权限

      chmod +x scripts/*.sh

    • 当执行make oldconfig 时出现make[1]: *** [scripts/Makefile.host:95: scripts/basic/fixdep] Error 127

      解决方法:分别安装词法解析器flex,和语法解析器bison:

      apt install flex

      apt install bison

    第三步:编译内核

    准备:

    apt-get install kernel-package

    • apt-get install 软件时出现Package kernel-package is not available, but is referred to by another package.

      https://blog.csdn.net/thanklife/article/details/125496134 (opens new window)

    apt-get install libssl-dev

    不然会报错:fatal error: openssl/opensslv.h: No such file or directory

    apt-get install libelf-dev

    不然会报错:atal error:gelf.h:No such file or directory

    apt-get install dwarves

    将当前目录下的.config文件里CONFIG_SYSTEM_TRUSTED_KEYS参数设置为"”

    apt-get install zstd

    编译:

    make-kpkg clean

    make-kpkg --initrd kernel-headers kernel_image

    上面两个命令我没成功

    用的

    make bzImage -j8

    用8线程编译内核,注意如果虚拟机没有8线程可以改成其他线程数

    • 如果报错Failed to create a ./debian directory: No such file or directory,

      则需要先make-kpkg clean一下

    • 编译指令时加上的initrd

      起因:

      系统启动时一个重要的任务就是mount根文件系统(存放了大部分系统程序位于磁盘上),而这必需要要有磁盘的驱动程序和文件系统驱动程序,对于建立在IDE硬盘上的ext文件系统,内核映像通常都包含有IDE硬盘驱动和ext文件系统驱动,但是对于其他设备、其他文件系统,内核映像就不一定有相应的驱动

      由于硬件和兼容性的限制,内核映像的大小不能太大Linux需要尽可能多地支持各种各种的硬件设备,但是由于内核映像大小受限,不能随便把硬件设备驱动程序放入内核映像中

      可能的解决方法:

      1.发行商提供预先编译好的支持各种设备的不同内核,用户安装时选择不同的内核。一一硬件总类、组合太多,不可行

      2.让用户根据自己机器的配置情况,自己制作启动盘加载根文件系统一一太麻烦

      现行方法:

      显然上面的方法不太行,因此我门可以将各种硬件设备、文件系统的驱动程序模块化

      发行商提供内核映像、系统安装程序

      系统安装过程中,会根据当前硬件配置情况,选出系统启动需要的驱动程序,并据此制作成initrd

      initrd相当于一个临时的根文件系统,其中存放了系统启动必须的各种驱动程序构建于内存盘之上

    • No rule to make target ‘debian/canonical-certs.pem‘, needed by ‘certs/x509_certificate_list‘

      修改路径下.config文件

      CONFIG_SYSTEM_TRUSTED_KEYS 项置空

      CONFIG_SYSTEM_REVOCATION_KEYS项置空

    • kernel/rcu/tree.o: No such file or directory

      cp /boot/config-5.19.0-38-generic ./

      最好是复制带有补丁的配置文件

    • fixdep: error opening file,: .min_addr.o.d: No such file or directory

      重新解压,重新编译

    如果编译的文件夹/arch/x86/boot/bzImage存在,则编译成功

    第四步:编译内核模块

    内核模块需要单独编译安装

    编译:

    make modules

    • 遇到的问题:drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c:25:10: fatal error: aux.h: No such file or directory

      在https://elixir.bootlin.com/ (opens new window)网站中找到自己的版本,直接下载aux.h和aux.c 两个文件到自己的目录里

      推测可能是包在下载解压的时候损坏了,补上这两个文件即可

    • 编译编到一般,电脑断电休眠了,再编时出现*No rule to make target 'net/netfilter/xt_DSCP.o', needed by '__build'.

      修改makefile文件vim scripts/Makefile.build

      $(subdir-ym) := $(subst xt_DSCP.c,xt_dscp ,$(subdir-ym))

    安装:

    make modules_install

    • 如果存储空间不够大,需要扩展虚拟机磁盘

      VMware虚拟机扩展磁盘容量_再__努力1点的博客-CSDN博客 (opens new window)

      VMware Ubuntu使用gparted工具扩容,显示Unable to resize read-only file system_Mi Manchi_34的博客-CSDN博客 (opens new window)

    安装

    上一步的编译会在上层目录生成两个.deb文件

    dpkg -i *deb

    reboot

    第五步:

    make install #安装内核

    其中做了更改grub的配置文件,把新内核的相关信息添加到配置中

    • 出现Warning: os-prober will not be executed to detect other bootable partitions

      vim /etc/default/grub

      在其中增加如下内容

      GRUB_DISABLE_OS_PROBER=false
      GRUB_SAVEDEFAULT=true
      GRUB_DEFAULT='Advanced options for Ubuntu>Ubuntu, with Linux <你的版本号,一直到generic>'
      
      1
      2
      3

      保存后退出,更新grub文件

      update-grub

    reboot重启电脑,长按shift可以进入选择系统的模式

    按e,再按ctrl+x进入选择模式,选择自己编译的那个内核版本

    此时在**/usr/src**路径下生成一个linux-headers-5.19.0文件,其中存放了编译内核模块的文件,也包括完整的内核代码,如果修改了代码就需要重新编译

    • /include 包含了头文件
    • /lib/modules中生成一个5.19.0文件,其中包含两个符号连接(build、source)指向这里编译出来的路径,其中kernel放了编译好的内核模块
    • /root下生成config-5.19.0 和initrd.img-5.19.0和sysyem.map-5.19.0(符号表信息)和vmlinuz-5.19.0(内核映像、可以理解成内核编译好后的可执行程序)
    • /boot/grub/ 下增加了grub.cfg存放grub各种启动时的菜单选项
    • config-x.x.x文件是内核的配置文件,
    • initrd.img-x.x.x是初始化ram磁盘文件,
    • vmlinuz-x.x.x是内核映像文件。

    安装完后,原本的代码和编程出来的文件可以删除,但建议保留内核映像文件(vmlinuz)和初始化ram磁盘文件(initrd.img)因为它们是内核编译生成的可执行文件和根文件系统,可以在需要时用于引导计算机。

    例如可以使用以前的内核映像文件启动计算机,以便回滚到以前的版本。

    同样,如果需要在计算机上安装另一个操作系统,可以使用initrd.img文件引导计算机并安装新操作系统。

    # 卸载内核

    make /usr/src/uninstall

    rm -rf /lib/modules/版本号

    上次更新: 2025/02/21, 14:57:10
    内存分配器
    内核驱动模型、内核模块LKM:

    ← 内存分配器 内核驱动模型、内核模块LKM:→

    最近更新
    01
    搭建ai知识助手
    02-23
    02
    边缘检测
    02-15
    03
    css
    02-15
    更多文章>
    Theme by Vdoing | Copyright © 2025-2025 松垮垮 | MIT License | 蜀ICP备2025120453号 | 川公网安备51011202000997号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 纯净模式