[OS] 编译 Linux 内核

编译 Linux 内核:详细教程与 Kthreads 入门结合

我们将学习如何编译 Linux 内核,同时结合 Kthreads 的知识来理解各个步骤的目的。对于虚拟环境下的开发环境配置,本文将为你提供逐步指导。

1. 下载内核源代码

首先,我们需要从官方或国内镜像站下载 Linux 内核源代码:

  • 官方网址:http://www.kernel.org

  • 清华大学开源镜像站:https://mirror.tuna.tsinghua.edu.cn/kernel/v5.x/

为什么要下载源代码呢?这是因为我们需要对内核进行自定义,添加我们的内核线程(Kthread)相关功能。内核线程是 Linux 中一个强大的工具,它可以让你创建、管理并行任务,非常适合需要实时处理的系统功能。

  1. 在主机上下载内核源代码:首先从网站下载你需要的内核版本,例如最新的稳定版本 6.11.2。

  2. 将下载的文件移至 Vagrant 虚拟机

    • 可以通过共享文件夹的方式,将下载的 .tar.xz 文件从主机系统移至虚拟机中。
    • 或者使用 scp 命令从主机传输到虚拟机。
  3. 在虚拟机中解压和编译

    • 将文件复制到你的工作目录,比如 /home/seed/work
      mv /home/vagrant/csc3150/linux-5.15.10 /home/seed/work
      

    • 然后解压、配置、编译和安装内核。

共享文件夹的挂载和使用需要在 Vagrant 配置文件(Vagrantfile)中进行配置,比如:

config.vm.synced_folder "path/to/your/local/folder", "/vagrant"

2. 安装依赖和开发工具

在编译内核之前,需要安装必要的依赖包和开发工具。这些工具将帮助我们顺利完成编译过程。

sudo apt-get install libncurses-dev gawk flex bison openssl libssl-dev dkms libelf-dev libudev-  dev libpci-dev libiberty-dev autoconf llvm dwarves

这些工具中的每一个都有特定用途:

  • libncurses-dev:用于支持终端用户界面(TUI),例如菜单配置。

  • flex 和 bison:是词法分析器和语法分析器生成工具,用于构建和解析内核配置。

  • openssl 和 libssl-dev:用于加密功能,确保内核中数据的安全性。

这些工具的安装是内核编译的基础,因为内核编译涉及到大量复杂的配置和依赖,少了其中任何一个都会导致编译失败。

3. 解压内核源代码

将下载的内核源代码解压到工作目录:

cp KERNEL_FILE.tar.xz /home/seed/work
cd /home/seed/work
$sudo tar xvf KERNEL_FILE.tar.xz

在这里,我们将源代码解压到 /home/seed/work,这是为了确保我们的工作环境干净且可控,避免对系统的其他部分产生影响。

4. 复制配置文件

/boot 目录中复制系统当前的配置文件,以作为内核编译的基础配置:Copy config from /boot to /home/seed/work/KERNEL_FILE

这个步骤的目的是使用现有内核的配置,确保我们在编译过程中不会遗漏关键的选项。

§Login root account and go to kernel source directory

$sudo su
$cd /home/seed/work /KERNEL_FILE

5. 开始配置和编译内核

清理之前的设置并重新配置
make mrproper
make clean
make menuconfig
  • make mrproper:清除之前编译留下的临时文件。

  • make clean:删除编译生成的对象文件,确保干净的编译环境。

  • make menuconfig:进入内核配置界面,可以在这里添加我们的模块,例如 Kthreads

  • save the config and exit

对于 Kthreads 入门,我们需要确保内核支持内核线程的调度和管理。因此,在 menuconfig 中检查线程相关的配置非常重要。

6. 编译内核和模块

使用 make bzImagemake modules 来分别编译内核镜像和模块。-j$(nproc) 表示使用所有可用的 CPU 内核来加快编译速度。

make bzImage -j$(nproc)
make modules -j$(nproc)
make –j$(nproc)

这个步骤可能需要较长时间,因为内核编译涉及大量代码。如果你对 Kthreads 有了解,这部分的内容实际上就是内核如何将各个线程(包括我们创建的内核线程)组织到内核模块中。

7. 安装模块和内核

编译完成后,安装模块和内核:

make modules_install
make install

这些命令会把编译好的内核和模块安装到系统中,以便在重启时加载新的内核版本。

8. 重启并选择新内核

重启系统并选择新编译的内核版本:

reboot

在重启过程中,你需要在引导菜单中选择新编译的内核版本,以确保加载我们新加入的 Kthreads 模块。

9. 验证内核版本

验证当前运行的内核版本:

uname -r

这样可以确认我们是否成功运行了刚刚编译的内核。

编译过程中常见问题

  • 文件或目录不存在

    • 确保在 Linux 环境中解压源代码,而不是在 Windows 或 macOS 中解压。不同的操作系统可能对文件名大小写敏感性处理不同,可能导致文件找不到。

  • 磁盘空间不足

    • 内核源代码较大,编译过程需要大量的磁盘空间,建议将源代码移动到有足够空间的目录下再继续编译。

  • 共享文件夹的问题

    • 如果你使用虚拟机进行开发,确保共享文件夹正确挂载,避免由于共享文件夹的问题导致编译失败。

EXPORT_SYMBOL 的使用

在实现 Kthreads 的过程中,我们可能需要使用一些内核函数,这些函数需要通过 EXPORT_SYMBOL() 导出,才能被其他模块使用。例如,do_wait() 函数是用于等待子进程结束的常用函数,需要先在源码中进行导出。

代码示例

编译内核的完整命令流程
  1. 下载并解压内核源代码

  2. 复制配置文件

  3. 清理设置并开始配置

  4. 编译内核镜像和模块

  5. 安装内核模块和内核

  6. 重启系统并选择新内核

  7. 验证内核版本

构建内核对象

在进行内核模块的加载和测试时,我们还需要构建内核对象。以下是一个构建内核对象的 Makefile 示例:

  • KM 是内核对象的名称。

  • 使用 make 命令来构建内核对象。

  • 使用 make clean 命令可以清除所有构建文件,只保留原始的 .c 文件和 Makefile。

当你在虚拟环境中进行开发时,使用这些命令来构建和清理内核模块可以帮助你保持代码的整洁,并确保每次构建都是从干净的环境开始。

插入和移除内核模块

在构建内核对象之后,我们需要将其插入内核进行测试,并在不需要时将其移除。

插入内核模块

在插入内核对象之前,你需要以 root 用户身份登录:

然后使用以下命令插入内核模块:

列出插入的模块

要列出当前插入的模块,可以使用以下命令:

这样可以确认我们的模块是否已经成功插入内核。

移除内核模块

在不需要使用模块时,记得将其移除:

这可以释放系统资源,确保内核的稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/441196.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第 1 章 MyBatis快速入门

1.1 ORM简介 ORM(Object Relational Mapping,对象——关系映射)框架的主要功能是根据映射配置文件,完成数据在对象模型与关系模型之间的映射,同时出屏蔽了连接数据库、创建 Statement 对象、执行 SQL、读取 ResultSet…

(Linux驱动学习 - 8).信号异步通知

一.异步通知简介 1.信号简介 信号类似于我们硬件上使用的“中断”,只不过信号是软件层次上的。算是在软件层次上对中断的一种模拟,驱动可以通过主动向应用程序发送信号的方式来报告自己可以访问了,应用程序获取到信号以后就可以从驱动设备中…

【技术】Jaskson的序列化与反序列化

文章目录 概念解释1.Jasksona.JSONJSON 的基本特点JSON 的基本结构JSON 示例 b.ObjectMapper类 2.序列化与反序列化a.序列化对象序列化集合序列化ListSetMap b.反序列化反序列化单个对象反序列化集合对象 概念解释 1.Jaskson Jackson 是一个用于处理 JSON 数据的 Java 库,所以…

k8s实战-1

k8s实战-1 一、资源创建方式1.命令行2.yaml 二、命名空间三、Pod总结 一、资源创建方式 1.命令行 就是直接通过命令的方式创建,比如我要创建namespace, kubectl create namespace hello删除: kubectl delete -f hello2.yaml 简单来说&am…

用java编写飞机大战

游戏界面使用JFrame和JPanel构建。背景图通过BG类绘制。英雄机和敌机在界面上显示并移动。子弹从英雄机发射并在屏幕上移动。游戏有四种状态:READY、RUNNING、PAUSE、GAMEOVER。状态通过鼠标点击进行切换:点击开始游戏(从READY变为RUNNING&am…

无人机单目+激光+IMU复杂弧形(隧道)退化场景SLAM技术详解

无人机在复杂弧形(如隧道)退化场景中的SLAM(同时定位与地图构建)技术,结合单目相机、激光雷达(LiDAR)和惯性测量单元(IMU)时,能够显著提升定位与建图的准确性…

在忘记密码的情况下重新访问手机?5种忘记密码解锁Android手机的方法

无需密码即可访问Android手机。 即使你忘记了密码,你也可以解锁你的Android手机,但你通常需要将手机恢复出厂设置。 您可以通过执行出厂恢复或使用“查找我的设备”网站解锁大多数Android手机。 如果你不再有密码,这里有五种解锁安卓手机的…

E37.【C语言】动态内存管理练习题

目录 1. 答案速查 分析 源代码分析 反汇编代码分析(底层) 2. 答案速查 分析 3. 答案速查 分析 VS逐步调试 1. 求下列代码的执行结果 #include <stdio.h> char* GetMemory(void) {char p[] "hello world";return p; }void Test(void) {char* str…

分层解耦-03.IOCDI-入门

一. IOC&DI入门 二.控制转移注解Component 因为dao和service接口的实现类对象需要传入到service和controller中&#xff0c;因此需要将dao和service代码加上Component注解&#xff0c;使之实现控制反转&#xff0c;将实现类对象交给IOC容器管理&#xff0c;成为IOC容器中…

Web安全 - 阶段性总结回顾_风险评估

文章目录 OWASP 2023 TOP 10用户数据的威胁评估密码盗窃XSS 漏洞SQL 注入CSRF 漏洞 资产数据的威胁评估SSRF 漏洞反序列化漏洞插件漏洞后门 认证和授权的安全防护检测与过滤加强认证补丁管理 进一步防护手段最小权限原则WAFIDS 小结 OWASP 2023 TOP 10 OWASP Top 10 概述 OWASP…

数据结构与算法——动态规划算法简析

1.初步了解动态规划 由于本篇博客属于动态规划的初阶学习&#xff0c;所以大多都是简单的表示&#xff0c;更深层次的学术用语会在之后深度学习动态规划之后出现&#xff0c;本文主要是带各位了解一下动态规划的大致框架 1.1状态表示 通常的我们会开辟一个dp数组来存储需要表示…

C++ WebDriver扩展

概述 WebDriver协议基于HTTP&#xff0c;使用JSON进行数据传输&#xff0c;定义了client与driver之间的通信标准。无论client的实现语言&#xff08;如Java或C#&#xff09;&#xff0c;都能通过协议中的endpoints准确指示driver执行各种操作&#xff0c;覆盖了Selenium的所有功…

【C语言】预处理指令详解

目录 一、预定义符号 二、#define 定义常量 三、#define 定义宏 &#xff08;1&#xff09;宏定义的使用 &#xff08;2&#xff09;带副作用的宏参数 &#xff08;3&#xff09;宏替换的规则 &#xff08;4&#xff09;宏与函数对比 &#xff08;5&#xff09;#和## …

基于单片机的书库环境监测

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DHT11湿度传感器检测湿度&#xff0c;DS18B20温度传感器检测温度&#xff0c; 采用滑动变阻器连接数模转换器模拟二氧化碳和氧气浓度检测&#xff0c;各项数值通过lc…

SQL第12课——联结表

三点&#xff1a;什么是联结&#xff1f;为什么使用联结&#xff1f;如何编写使用联结的select语句 12.1 联结 SQL最强大的功能之一就是能在数据查询的执行中联结&#xff08;join)表。联结是利用SQL的select能执行的最重要的操作。 在使用联结前&#xff0c;需要了解关系表…

免费高可用软件

高可用软件是指那些能够提供高可用性、高可靠性的软件&#xff0c;它们在各种应用场景下都能确保系统的稳定运行。以下是四款免费的高可用软件&#xff0c;它们在不同领域都表现出色&#xff0c;能够满足各种高可用性需求。 一、PanguHA PanguHA是一款专为Windows平台设计的双…

使用正则表达式删除文本的奇数行或者偶数行

用智谱清言和kimi搜出来的结果都没法在notepad生效&#xff0c;后面在overflow上找到的答案比较靠谱。 查找&#xff1a;^[^\n]*\n([^\n]*) 替换&#xff1a;\1 删除偶数行 查找&#xff1a;^([^\n]*)\n[^\n]* 替换&#xff1a;\1 代码解释 ^&#xff1a;这个符号代表字符…

RabbitMQ 集群

文章目录 集群搭建使用 Docker-Compose 镜像队列搭建步骤工作原理镜像策略主从同步 同步延迟 集群搭建 参考&#xff1a; docker中安装并启动rabbitMQ Docker中搭建RabbitMQ集群 使用 Docker-Compose 这里提供一个脚本来使用 docker-compose 完成RabbitMQ集群的配置及启动…

机器学习-树模型算法

机器学习-树模型算法 一、Bagging1.1 RF1.2 ET 二、Boosting2.1 GBDT2.2 XGB2.3 LGBM 仅个人笔记使用&#xff0c;感谢点赞关注 一、Bagging 1.1 RF 1.2 ET 二、Boosting 2.1 GBDT 2.2 XGB 2.3 LGBM LightGBM&#xff08;Light Gradient Boosting Machine) 基本算法原理…

基于单片机的烧水壶系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52RC单片机&#xff0c;采用四个按键&#xff0c;通过DS18B20检测温度&#xff0c;开机显示实时温度 第一个按键为切换功能按键&#xff0c;按下后&#xff0c;可以设置烧水温度的大小&…