[OS] 编译 Linux 内核

news2025/1/8 2:26:45

编译 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.coloradmin.cn/o/2196405.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构——栈与队列的实现(全码)

一 栈的概念 栈是一种特殊的线性表,栈内数据遵循先进后出(LIFO)的原则,对于栈,只能在同一侧进行入栈和出栈操作。 入栈操作和出栈操作是在栈的同一侧进行的,如图示: 对于栈这种数据类型,我们可以采用链表或…

自动驾驶系列—揭秘毫米波雷达:自动驾驶的眼睛如何看穿复杂环境?

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

Linux:无法为立即文档创建临时文件: 设备上没有空间

虚拟机磁盘空间不足解决记录 1、问题描述2、问题解决 1、问题描述 在命令行输入命令按Tab键时出现如下报错: 很明显,设备上没有空间,即磁盘空间不足。通过命令查看具体情况如下: df -h2、问题解决 首先想到的是虚拟机扩容。关机虚…

【技术白皮书】内功心法 | 第一部分 | 数据结构与算法基础(数据结构)

数据结构与算法基础 内容简介数据结构数据模型数据结构的表现形式 基本概念数据(Data)数据元素(data element)数据结构的定义物理结构和逻辑结构逻辑结构逻辑结构表现形式二元组模型集合结构模型线性结构模型树结构模型图结构模型…

Python从0到100(六十):机器学习-模型选择与交叉验证

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能…

有限差分方法 - 拉普拉斯算子第二部分

Finite difference method - Laplacian part 2 — ROCm Blogs (amd.com) 2023年1月4日 作者:Justin Chang, Rajat Arora, Thomas Gibson, Sean Miller, Ossian O’Reilly 在之前的拉普拉斯算子文章中,我们开发了一种基于HIP实现的有限差分模板代码&#…

springboot车位预约小程序-计算机毕业设计源码42655

摘要 随着社会发展和人口增加,城市交通压力越来越大,停车位资源的分配和管理成为一个重要问题。传统的停车位和车位预约管理方式存在信息不对称、效率低下等问题,给用户带来不便。而基于微信小程序的车位预约系统可以通过智能化、数字化、便…

布尔莎公式推导

问题的提出 原始的围绕x轴、y轴、z轴进行旋转矩阵的公式为 但是最近需要将船体坐标系转换到相应的世界坐标系之中,在查看相关论文时,看到一个三维点公式转换模型 这里的旋转矩阵为,和我之前见到的旋转矩阵是不一样的。我一开始先是看到的202…

计算机网络-------重传、TCP流量控制、拥塞控制

重传、滑动窗口、流量控制、拥塞避免 重传机制 超时重传 发送方在发送数据时会启动一个定时器,当超过指定的时间之后,还没接收到接收方的ACK确认应答报文,就会重传该数据 快重传 当发送方收到接收方三个连续的ack之后说明发送方发送的报…

蓝牙模块(BT04/HC05)

目录 一、介绍 二、模块原理 1.原理图与外形尺寸 2.引脚描述 3.蓝牙模块基础AT指令介绍 三、程序设计 usart3.h文件 usart3.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 BT04A是一款蓝牙低功耗(Bluetooth Low Energy, BLE)模块&…

华为OD机试 - 奖牌榜排名(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

Python面向对象编程:属性和方法②

文章目录 一、什么是属性和方法1.1 属性1.2 方法 二、定义和使用属性2.1 定义实例属性2.2 访问和修改实例属性2.3 定义类属性2.4 访问和修改类属性 三、定义和使用方法3.1 定义实例方法3.2 调用实例方法3.3 定义类方法3.4 调用类方法3.5 定义静态方法3.6 调用静态方法 四、综合…

ChatGPT背景下,高职人工智能技术应用专业的人才培养

一、引言 ChatGPT,即聊天生成预训练变换器,由美国OpenAI公司开发,自2022年11月首次亮相以来,已成为人工智能领域的一个标志性成就。这款聊天机器人利用先进的人工智能技术,处理自然语言,能够精准把握用户的…

【实战教程】SpringBoot全面指南:快速上手到项目实战(SpringBoot)

文章目录 【实战教程】SpringBoot全面指南:快速上手到项目实战(SpringBoot)1. SpringBoot介绍1.1 SpringBoot简介1.2系统要求1.3 SpringBoot和SpringMVC区别1.4 SpringBoot和SpringCloud区别 2.快速入门3. Web开发3.1 静态资源访问3.2 渲染Web页面3.3 YML与Properti…

ctf.bugku - 本地管理员

题目来源:本地管理员 - Bugku CTF 访问页面 页面的最后返回一个字符串; 结尾 应该是base64 编码; 解码得到 test123 同时,提示信息还有 IP禁止访问,本地管理员登陆; 所以,请求头添加&#x…

“欢迎”相关英语表达柯桥成人商务英语口语学习到蓝天广场

1.某地的欢迎标语 说到欢迎,小编想起了江苏的欢迎标语。 这则标语把“江苏欢迎您”,翻译成了“Jiangsu welcomes you”。 不少小伙伴都觉得这样翻译不对,“欢迎您来某某地方”,应该翻译成“Welcome to XX”。 但其实,一…

超声波气象监测站的工作原理

TH-CQX5超声波气象监测站,顾名思义,是一种通过超声波技术实现气象数据监测的设备。这种监测站的设计理念充分利用了超声波在空气中传播的特性,能够高效、准确地测量风速、风向、温度、湿度等气象要素。超声波气象监测站的构造简洁而高效&…

华为OD机试 - 银行插队 - 队列(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

前端vue-安装pinia,它和vuex的区别

创建一个store的目录,任意一个js文件,再导入pinia,再定义

想走?可以!先买票——迭代器模式

文章目录 想走?可以!先买票——迭代器模式乘车买票,不管你是谁!迭代器模式迭代器实现Java的迭代器实现迭代高手 想走?可以!先买票——迭代器模式 乘车买票,不管你是谁! 时间&#…