当前位置: 首页 > news >正文

【Linux驱动开发100问】如何编译Linux内核?

在这里插入图片描述

🥇今日学习目标:如何编译Linux内核?
🤵‍♂️ 创作者:JamesBin
⏰预计时间:10分钟
🎉个人主页:嵌入式悦翔园个人主页
🍁专栏介绍:Linux驱动开发100问

如何编译Linux内核?

    • 一、为什么要编译内核
    • 二、如何编译Linux内核
    • 三、详细步骤
      • 3.1 下载内核源代码
      • 3.2 解压并进入源代码目录
      • 3.3 配置内核
      • 3.4 如何编译Linux内核
      • 3.5 如何安装Linux内核
    • 四、相关知识

一、为什么要编译内核

编译内核是为了定制或优化内核以满足特定的需求,比如添加或移除驱动程序、启用或禁用某些内核功能、加入新的文件系统等。内核编译的主要工作包括:

  1. 生成内核镜像:在内核编译的过程中,编译器将内核源代码编译为机器码,并把它们打包成一个内核镜像文件。内核镜像文件包括内核代码和初始化文件系统的根文件系统映像,是Linux操作系统的核心文件。

  2. 生成内核模块:内核模块是一种可插拔的代码,可以动态地添加到内核中,以扩展内核功能。内核模块可以在内核运行时动态加载和卸载。在内核编译过程中,编译器还将所有的内核模块编译成二进制文件。

  3. 配置内核选项:内核编译的过程中,可以使用配置工具(比如make menuconfig)来选择启用或禁用特定的内核选项。例如,可以选择启用某个驱动程序或禁用某个内核功能。配置工具还可以帮助用户管理内核模块,选择编译特定的文件系统驱动等。

总的来说,编译内核是为了根据用户需要定制Linux内核,以便于满足特定的需求和运行环境。内核编译的结果是一个可用的内核镜像和一系列的内核模块,它们可以被用于更新或者升级Linux系统。

二、如何编译Linux内核

内核编译过程中需要确保系统安装了必要的编译器和工具链,以及必要的开发包和库文件。否则编译过程可能会失败。此外,在编译和安装内核之前,最好备份系统中原有的内核,以免出现意外情况导致系统无法启动。

编译Linux内核可以按照以下步骤进行:

  1. 下载Linux内核源代码:可以从Linux官网上下载最新的Linux内核源代码。

  2. 解压内核源代码:使用tar命令解压下载的内核源代码文件。

  3. 配置内核:进入内核源代码目录,执行make menuconfig命令打开内核配置菜单,配置需要的内核选项,比如添加或删除驱动程序,启用或禁用某些内核功能,添加新的文件系统等。

  4. 编译内核:执行make命令进行内核编译。如果系统有多个CPU核心,可以使用-j选项来加快编译速度。

  5. 安装内核:执行make install命令安装编译好的内核文件到系统中。

  6. 更新引导程序:如果要使用新编译的内核启动系统,需要在引导程序中添加新的内核映像。可以使用grub-mkconfig命令更新引导程序配置文件,然后重启系统。

三、详细步骤

下面简单介绍一下Linux内核编译过程,需要注意如果在步骤中出现错误请自行百度解决,由于内核编译过程中错误步骤众多,不同的错误原因也不尽相同。

3.1 下载内核源代码

从官网 https://www.kernel.org/ 或者其他镜像站点下载想要编译的内核源代码。
在这里插入图片描述
除了通过网站下载压缩包外还可以使用git进行下载,由于直接在网站上下载压缩包较为简单,这里就不过多介绍了,这里详细介绍一下如何通过git进行压缩包的下载。

以下下载步骤及编译步骤都需要在Linux环境下完成。

1、安装git工具
如果系统中没有安装 git 工具,需要先安装 git 工具,例如在 Ubuntu 系统中可以使用以下命令进行安装:

sudo apt-get update
sudo apt-get install git

2、克隆内核源码
使用 git clone 命令克隆内核源码。可以从官方 git 仓库中克隆最新版内核源码:

git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

也可以从其他 git 仓库中克隆指定版本的内核源码。例如,从 github 上的 git 仓库中克隆 Linux 5.12 版本的内核源码:

git clone --depth 1 --branch v5.12 https://github.com/torvalds/linux.git

其中,--depth 1 表示只克隆最近的一个版本,不下载历史版本的记录,可以加快下载速度。--branch v5.12 表示克隆 Linux 5.12 版本的内核源码。

3、切换分支

如果需要切换到其他分支,可以使用 git checkout 命令。例如,切换到 Linux 5.10 版本的分支:

cd linux
git checkout v5.10

4、更新内核源码

如果已经克隆了内核源码并且需要更新源码到最新版,可以使用以下命令:

git pull

以上就是通过 git 工具下载 Linux 内核源码的基本步骤。

3.2 解压并进入源代码目录

解压内核源文件(注意:要先使用cd命令进入压缩包所在目录),可以使用如下命令:

tar -xvf linux-xxx.tar.gz

通过cd命令进入到源代码目录

cd linux-xxx/

在这里插入图片描述

3.3 配置内核

使用命令 make menuconfig 进入内核配置界面,进行内核的配置,包括选择需要编译的模块和功能等。

在这里插入图片描述
以下是一些常见的需要配置的选项:

  1. 处理器架构相关的选项,例如选择处理器的类型和架构。

  2. 内核编译选项,例如开启或关闭调试信息、内核跟踪等。

  3. 设备驱动选项,例如选择需要支持的设备驱动模块、文件系统等。

  4. 网络选项,例如选择网络协议、网卡驱动等。

  5. 安全选项,例如选择安全模块、访问控制等。

  6. 其他选项,例如系统时间、电源管理等。

在进入内核配置界面后,可以根据自己的需要选择需要开启或关闭的选项。配置时,大部分都是使用其默认选项,小部分才根据需要进行选择。配置完成后,需要保存配置并退出界面,即可开始进行内核编译。

配置界面的保存与退出

make menuconfig 进入的内核配置界面中,完成选项的配置后,需要按照以下步骤保存配置并退出:

  1. 按下键盘上的 Esc 键,此时会出现一个提示框,询问是否保存对配置的修改。选择保存并退出。

  2. 如果选择保存并退出,则会提示是否保存配置到 .config 文件中。选择保存即可。

  3. 如果选择不保存,则需要重新配置选项,否则直接退出界面。

完成保存并退出后,即可开始进行内核的编译。

3.4 如何编译Linux内核

在Linux内核编译的时候需要用到make命令,即执行以下指令即可完成内核的编译

$ make modules_install

make modules_install 命令的本质是将编译出来的内核模块安装到指定的目录中。在 Linux 系统中,内核由内核镜像和内核模块两部分组成。内核镜像是一个独立的可执行文件,它包含了操作系统的核心代码和数据。而内核模块则是一些独立的代码文件,它们可以在运行时被动态地加载到内核中,从而扩展内核的功能。

在编译 Linux 内核时,除了生成内核镜像之外,还会生成一些内核模块。这些内核模块需要被安装到指定的目录中,才能被系统正确地加载和使用。

make modules_install 命令就是将编译出来的内核模块安装到系统指定的目录中,通常是 /lib/modules/ 目录下的一个子目录中,这样系统就能够正确地加载和使用这些模块了。

3.5 如何安装Linux内核

编译完Linux内核后如果需要进行内核的安装,需要用到以下指令及步骤:

编译完成后,可以使用以下命令安装模块:

make modules_install

并使用以下命令安装内核:

$ make install

安装完成后,可以使用以下命令重新生成 initramfs

$ update-initramfs -c -k <version>

其中,<version> 是新内核的版本号。

其中initramfs 是 Linux 内核引导过程中使用的一种临时文件系统。在 Linux 系统启动时,内核会首先加载 initramfs 文件系统,该文件系统包含了一些用于系统初始化和启动的文件和工具,例如 init 程序、udevcryptsetup 等等。在 initramfs 文件系统加载完成后,内核会执行 init 程序,进一步初始化系统,并将根文件系统切换到实际的根文件系统。

四、相关知识

学习Linux内核编译还需要掌握以下知识:

  1. 原理和概念:了解Linux操作系统的基本原理和概念,例如进程、线程、文件系统、内存管理、系统调用等。

  2. Linux内核架构:了解Linux内核的结构和模块之间的关系,例如进程管理模块、文件系统模块、网络模块等。

  3. 编译工具链:了解编译工具链的基本原理和使用方法,例如GCC、Make、binutils等。

  4. Linux内核配置:了解Linux内核的配置选项和如何使用make menuconfig命令进行配置。

  5. 内核模块编程:了解Linux内核模块的编写原理和方法,例如模块的初始化和卸载、模块参数的传递、模块的调试等。

  6. Linux启动过程:了解Linux系统的启动过程和各个阶段所做的工作,例如bootloader的引导过程、内核初始化阶段、用户空间的初始化等。

  7. 内核调试:了解Linux内核调试的方法和工具,例如使用gdb进行内核调试、使用printk进行调试信息输出等。

以上是学习Linux内核编译需要掌握的一些其他知识,掌握了这些知识,就可以进行Linux内核的编译、调试和修改等操作。

👇点击下方公众号卡片获取资料👇

相关文章:

【Linux驱动开发100问】如何编译Linux内核?

&#x1f947;今日学习目标&#xff1a;如何编译Linux内核&#xff1f; &#x1f935;‍♂️ 创作者&#xff1a;JamesBin ⏰预计时间&#xff1a;10分钟 &#x1f389;个人主页&#xff1a;嵌入式悦翔园个人主页 &#x1f341;专栏介绍&#xff1a;Linux驱动开发100问 如何编译…...

15、条件概率、全概率公式、贝叶斯公式、马尔科夫链

条件概率定义&#xff1a;设A、B是两个事件&#xff0c;且&#xff0c;P(A) > 0 则称 为事件A发生的条件下事件B的条件概率对这个式子进行变形&#xff0c;即可得到概率的乘法公式&#xff1a;P(A) > 0 时&#xff0c;则P(B) > 0 时&#xff0c;则乍一看&#xff0c;…...

Eureka服务注册与发现

注册中心是分布式开发的核心组件之一&#xff0c;而Eureka是spring cloud推荐的注册中心实现。简单分析一下Eureka的原理。Eureka基础概念与流程1、服务注册在微服务架构中&#xff0c;一个服务提供者本质上也是一个Eureka客户端。启动时&#xff0c;会调用Eureka所提供的服务注…...

20230226 引用类型和指针类型的区别 - chatGPT

绝了&#xff0c;把chatGPT当百度之后真爽&#xff01; 引用类型和指针类型都是C语言中的重要概念&#xff0c;它们都提供了访问和操作内存的方法&#xff0c;但它们之间有几个关键的区别。 1. 定义和初始化方式不同 指针类型的变量定义和初始化的方式是通过使用*符号来声明…...

《操作系统》——第二章 进程与线程

目录 2.1.1进程的概念、组成、特征 2.1.2进程的状态与转换、进程的组织 2.1.3进程控制 2.1.4进程通信 2.1.5线程的概念 2.1.6线程的实现方式和多线程模型 2.2.1调度的概念、层次 2.2.2进程调度的时机、切换与过程、方式 2.2.4调度算法的评价指标 2.2.5调度算法(1) 2…...

网络原理之初识

目录 一. 网络互连 1. 局域网 2. 广域网 二. 网络通信基础 1. IP 地址 2. 端口号 3. 网络协议 4. 协议分层 5. TCP/IP 五层网络模型 &#xff08;简述&#xff09; 6. 网络数据传输的基本流程 一. 网络互连 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&am…...

CAN总线开发一本全(4) - FlexCAN的驱动程序

CAN总线开发一本全&#xff08;4&#xff09; - FlexCAN的驱动程序 苏勇&#xff0c;2023年2月 文章目录CAN总线开发一本全&#xff08;4&#xff09; - FlexCAN的驱动程序引言从MindSDK获取FlexCAN驱动程序数据结构配置通信引擎的结构体类型访问MB的结构体类型配置ID过滤器的…...

如何分析linux tcp/ip 丢包问题

引用手把手教你用Dropwatch诊断问题通过dropwatch定位系统内核丢包Finding out if/why a server is dropping packetsgithub source coed: pavel-odintsov/drop_watchHow to drop a packet in Linux in more ways than one试试Linux下的ip命令&#xff0c;ifconfig已经过时了Ho…...

旅游规划(树型dp)

W 市的交通规划出现了重大问题&#xff0c;市政府下定决心在全市各大交通路口安排疏导员来疏导密集的车流。 但由于人员不足&#xff0c;W 市市长决定只在最需要安排人员的路口安排人员。 具体来说&#xff0c;W 市的交通网络十分简单&#xff0c;由 n 个交叉路口和 n−1 条街道…...

【C++】string类的模拟实现

当你将放弃作为一种习惯&#xff0c;你一辈子也不会有出息… 文章目录一、Default member functions1.Constructor2.Copy constructor&#xff08;代码重构&#xff1a;传统写法和现代写法&#xff09;3.operator&#xff08;代码重构&#xff1a;传统写法和现代写法&#xff…...

笔记(一)——STL容器

容器分类&#xff1a;序列式容器&#xff1a;每个元素都有固定位置&#xff0c;取决于插入的时机和地点&#xff0c;和元素无关&#xff0c;如vector、deque、list、stack、queue。关联式容器&#xff1a;元素位置取决于特定的排序准则&#xff0c;和插入顺序无关&#xff0c;如…...

红黑树

红黑树是一个相对的平衡&#xff0c;减少了旋转的消耗 一个节点不是红的就是黑的根节点是黑的一个节点是红的&#xff0c;孩子是黑的&#xff08;没有连续的红色节点&#xff09;对于每个节点&#xff0c;从该节点到后代节点的简单路径&#xff0c;都包含相同的黑色&#xff0…...

RIP路由协议的更新(电子科技大学TCP/IP第二次实验)

一&#xff0e;实验目的 1、掌握 RIP 协议在路由更新时的发送信息和发送方式 2、掌握 RIP 协议的路由更新算法 二&#xff0e;预备知识 1、静态路由选择和动态路由选择 2、内部网关协议和外部网关协议 3、距离向量路由选择 三&#xff0e;实验原理 RIP 协议&#xff08…...

基于JWT实现用户身份认证

常见场景 账号/密码登录、手机号验证码登录、微信扫码登录 解决方案 基于Session认证方案 什么是session认证方案 服务端生成httpsession认证(内存-sessionId)sessionId写到浏览器cookie浏览器请求的header中自动带sessionId到服务端服务端校验sessionId是否合法 优点 .…...

SaltStack 远程命令执行漏洞(CVE-2020-16846)

目录 (一)漏洞描述 (二)漏洞复现 1、在vulhub上启动docker 2、访问docker靶机 https /ip:8000...

SAP 详细解析成本收集器

成本收集器作为成本对象&#xff0c;主要应用于按期间进行成本核算的情况&#xff0c;在这种情况下会把产品创建为成本收集器&#xff0c;实际成本的收集和差异的结算全部按照成本收集器进行处理&#xff0c;财务的成本分析也针对成本收集器进行。 成本收集器是按期间核算&am…...

Vision Transformer学习了什么-WHAT DO VISION TRANSFORMERS LEARN? A VISUAL EXPLORATION

WHAT DO VISION TRANSFORMERS LEARN? A VISUAL EXPLORATION 文章地址 代码地址 摘要 视觉转换器( Vision Transformers&#xff0c;ViTs )正在迅速成为计算机视觉的事实上的架构&#xff0c;但我们对它们为什么工作和学习什么知之甚少。虽然现有研究对卷积神经网络的机制进…...

一种全新的图像滤波理论的实验(三)

一、前言 2023年02月22日&#xff0c;我发布了滤波后&#xff0c;为针对异常的白色和黑色像素进行处理的实验&#xff0c;本次发布基于上下文处理的方案的实验&#xff0c;目的是通过基于加权概率模型滤波后&#xff0c;在逆滤波时直接修复大量的白色和黑色的异常像素&#xf…...

CV——day79 读论文:基于小目标检测的扩展特征金字塔网络

Extended Feature Pyramid Network for Small Object DetectionI. INTRODUCTIONII. RELATED WORKA. 深层物体探测器B. 跨尺度特征C. 目标检测中的超分辨率III. OUR APPROACHA. 扩展特征金字塔网络B. 特征纹理传输C. 交叉分辨蒸馏IV. EXPERIMENTSA. Experimental Settings1&…...

智能家居项目(五)测试串口功能

目录 一、写一个单独测试串口的demo 二、直接运行上一篇智能家居的代码 一、写一个单独测试串口的demo 1、TTL串口与树莓派的连接方式 &#xff08;1&#xff09;TTL的RXD和TXD针脚连接到树莓的TXD和RXD上&#xff08;T–>R R–>T&#xff09;&#xff0c;交叉连&…...

2023年全国最新道路运输从业人员精选真题及答案7

百分百题库提供道路运输安全员考试试题、道路运输从业人员考试预测题、道路安全员考试真题、道路运输从业人员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 71.根据《中华人民共和国安全生产法》&#xff0c;生产经营单位…...

python的所有知识点(含讲解),不看就亏死了

目录 简介 特点 搭建开发环境 版本 hello world 注释 文件类型 变量 常量 数据类型 运算符和表达式 控制语句 数组相关 函数相关 字符串相关 文件处理 对象和类&#xff0c;注&#xff1a;不是那个对象&#xff01;&#xff01;&#xff01;&#xff01;&…...

【Servlet篇】Response对象详细解读

文章目录Response 继承体系Response 设置响应数据设置响应行数据设置响应头数据设置响应体数据Response 重定向Response 响应字符数据Response 响应字节数据Response 继承体系 前面说到&#xff0c;我们使用 Request 对象来获取请求数据&#xff0c;使用 Response 对象来设置响…...

SAP FICO期初开账存货导入尾差

一、问题 1.AFS物料网格级别库存导入先除再乘有尾差&#xff1a; 旧系统数据迁移自两个系统&#xff1a;一个管理数量账&#xff08;网格级别&#xff09;&#xff0c;一个管理金额账&#xff08;物料级别&#xff09; 2.MB52分工厂与MB5L分工厂统计差异&#xff1a; M…...

微信商城小程序怎么做_分享实体店做微信商城小程序制作步骤

各行各业都在用微商城小程序开店&#xff0c;不管是餐饮店还是便利店&#xff0c;还是五金店。都是可以利用微信小程序开一个线上店铺。实现线上跟线下店铺更加全面的结合。维护好自己的老客户。让您的客户给您拉新&#xff0c;带来新客户。小程序经过这几年的快速发展和不断升…...

【moment.js】时间格式化插件

Moment.js 用于在JavaScript中解析&#xff0c;验证&#xff0c;操作和显示日期和时间。是一款在项目中使用频率极高的时间格式化工具&#xff0c;Ant Design Vue 组件中就是使用它来处理时间的。 安装 npm install moment --save # npm yarn add moment # Ya…...

微信小程序开发【壹】

随手拍拍&#x1f481;‍♂️&#x1f4f7; 日期: 2023.02.24 地点: 杭州 介绍: 2023.02.24上午十点&#xff0c;路过学院的教学楼时&#x1f3e2;&#xff0c;突然看见了一团粉红色。走进一看是一排梅花&#x1f338;&#xff0c;赶在它们凋零前&#xff0c;将它们定格在我的相…...

2 k-近邻算法

0 问题引入 想一想&#xff1a;下面图片中有三种豆&#xff0c;其中三颗豆品种未知&#xff0c;如何判断他们类型&#xff1f; 1 KNN概述 1.1 KNN场景 电影可以按照题材分类&#xff0c;那么如何区分 动作片 和 爱情片 呢&#xff1f; 动作片&#xff1a;打斗次数更多爱情…...

深入探究文件I/O

目录Linux 系统如何管理文件静态文件与inode文件打开时的状态返回错误处理与errnostrerror 函数perror 函数exit、_exit、_Exit_exit()和_Exit()函数exit()函数空洞文件概念实验测试O_APPEND 和O_TRUNC 标志O_TRUNC 标志O_APPEND 标志多次打开同一个文件验证一些现象多次打开同…...

【LeetCode】剑指 Offer(9)

目录 题目&#xff1a;剑指 Offer 25. 合并两个排序的链表 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 26. 树的子结构 - 力扣&#…...