Linux编译实时内核和打补丁

目录

  • 1.Linux内核
  • 2.实时内核
  • 3.编译实时内核
    • 3.1 准备
    • 3.2 获取内核源码
    • 3.3 编译
    • 3.4 设置GRUB确保启动到实时内核
  • 4.给内核打补丁
  • 5.安装新的内核

1.Linux内核

https://github.com/torvalds/linux

Linux内核是Linux操作系统的核心部分,它是操作系统的基本组成部分,负责管理系统资源、文件系统、设备驱动程序和提供系统调用接口等功能。Linux内核的作用主要包括以下几个方面:

  • 系统资源管理:Linux内核负责管理系统的内存、CPU、磁盘空间等资源,以确保它们被合理分配和有效利用。

  • 文件系统管理:Linux内核提供了对文件系统的支持,包括文件的创建、读写、删除等操作,以及对文件系统的管理和维护。

  • 设备驱动程序管理:Linux内核包含了大量的设备驱动程序,用于管理和控制各种硬件设备,如网络接口、磁盘驱动器、USB设备等。

  • 进程管理:Linux内核负责管理系统中运行的进程,包括进程的创建、调度、终止等操作,以确保系统的稳定运行。

  • 网络支持:Linux内核提供了对网络协议栈的支持,包括TCP/IP协议栈、网络设备驱动程序等,以实现网络通信功能。

  • 安全性管理:Linux内核通过访问控制、权限管理等机制,确保系统的安全性和稳定性。

总之,Linux内核是整个Linux操作系统的核心,它负责管理系统的各种资源和提供各种功能,是整个操作系统的基础和核心。

2.实时内核

Linux实时内核是一种专门设计用于处理实时任务的内核,它可以确保任务在规定的时间内得到及时处理。与普通内核相比,Linux实时内核有以下区别:

  • 响应时间:实时内核可以保证任务在规定的时间内得到处理,响应时间更加可预测和稳定。

  • 优先级调度:实时内核支持更加灵活的任务优先级调度,可以确保高优先级任务优先得到处理。

  • 中断处理:实时内核对中断处理进行了优化,可以更快地响应硬件中断。

  • 时间管理:实时内核提供更加精确的时间管理,可以满足实时任务对时间精度的要求。

总的来说,Linux实时内核在处理实时任务方面更加可靠和高效,适用于对任务响应时间有严格要求的应用场景。

3.编译实时内核

Linux内核源码: https://mirrors.edge.kernel.org/pub/linux/kernel/

举例:在Xubuntu16.04系统中编译4.14.195的实时内核
假设这里以linux-4.14.195.tar.gz 实时内核源码为例:
在这里插入图片描述

3.1 准备

  • 要构建内核,需要在系统中提供几个可用的工具,使用安装它们
$ sudo apt-get install build-essential bc ca-certificates gnupg2 libssl-dev wget gawk flex bison
  • 在下载实时内核的源代码之前,请检查当前安装的内核版本:
$ uname -r
4.15.0-62-generic 
  • 要继续实时内核编译,需要创建一个临时文件夹并导航到其中,由于提取的内核源占用了大量空间,因此那里应该有足够的空间(约25GB),安装新内核后,可以再次删除此文件夹。
    在本例中,我们将在主文件夹中使用一个临时文件夹:
$ mkdir -p ${HOME}/rt_kernel_build
$ cd ${HOME}/rt_kernel_build

PS:后面所有的命令都在rt_kernel_build文件夹中执行。

3.2 获取内核源码

要构建实时内核,首先需要获得内核源代码和实时补丁。

上面已经确定当前Xubuntu16.04系统中安装了4.15内核,实时修补程序仅存在于选定的内核版本。这些可以在linuxfoundation wiki上面找到。

在本例中,我们将选择一个4.14内核,选择一个接近的内核版本安装在系统上。

继续下载内核源代码、补丁源代码及其签名文件:

$ wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patch-4.14.195-rt94.patch.xz
$ wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patch-4.14.195-rt94.patch.sign
$ wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.14.195.tar.xz
$ wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.14.195.tar.sign

解压缩下载的文件:

$ xz -d linux-4.14.195.tar.xz

3.3 编译

  • 编译之前,我们需要解压源码,并且打实时补丁
$ tar xf linux-4.14.195.tar
$ cd linux-4.14.195
linux-4.14.195$ xzcat ../patch-4.14.195-rt94.patch.xz | patch -p1 
  • 接下来需要配置内核
$ make oldconfig
  • 这将要求提供内核选项。对于其他所有内容,优先购买模型将使用默认值(只需按Enter键)或根据您的偏好进行调整。对于抢占模型,请选择“Fully Preemptible Kernel”:
Preemption Model
  1. No Forced Preemption (Server) (PREEMPT_NONE)
> 2. Voluntary Kernel Preemption (Desktop) (PREEMPT_VOLUNTARY)
  3. Preemptible Kernel (Low-Latency Desktop) (PREEMPT__LL) (NEW)
  4. Preemptible Kernel (Basic RT) (PREEMPT_RTB) (NEW)
  5. Fully Preemptible Kernel (RT) (PREEMPT_RT_FULL) (NEW)
choice[1-5]: 5
  • 现在开始构建内核,这可能会花一点时间。。。
$ make -j `getconf _NPROCESSORS_ONLN` deb-pkg
  • 构建完成后,将linux-headerslinux-image安装在父文件夹中(仅限于名称中没有-dbg的文件)
$ sudo apt install ../linux-headers-4.14.195-rt94_*.deb ../linux-image-4.14.195-rt94_*.deb

3.4 设置GRUB确保启动到实时内核

要使新内核成为系统每次引导到的默认内核,必须更改/etc/default/grub中的grub配置文件。
(PS:这适用于ubuntu,但可能不适用于其他linux系统)

  • 可以使用列出所有可用的内核
$ awk -F\' '/menuentry |submenu / {print $1 $2}' /boot/grub/grub.cfg

menuentry Ubuntu
submenu Advanced options for Ubuntu
    menuentry Ubuntu, with Linux 4.15.0-62-generic
    menuentry Ubuntu, with Linux 4.15.0-62-generic (recovery mode)
    menuentry Ubuntu, with Linux 4.15.0-60-generic
    menuentry Ubuntu, with Linux 4.15.0-60-generic (recovery mode)
    menuentry Ubuntu, with Linux 4.15.0-58-generic
    menuentry Ubuntu, with Linux 4.15.0-58-generic (recovery mode)
    menuentry Ubuntu, with Linux 4.14.195-rt94
    menuentry Ubuntu, with Linux 4.14.195-rt94 (recovery mode)
menuentry Memory test (memtest86+)
menuentry Memory test (memtest86+, serial console 115200)
menuentry Windows 7 (on /dev/sdc2)
menuentry Windows 7 (on /dev/sdc3)
  • 上面已存在了4.14.195-rt94内核,将其设置为开机后默认使用的内核,同时更新grub菜单条目
$ sudo sed -i 's/^GRUB_DEFAULT=.*/GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 4.14.195-rt94"/' /etc/default/grub
$ sudo update-grub
  • 重启电脑
    执行完上述步骤后,重新启动电脑,它应该会自动引导到正确的内核中。

4.给内核打补丁

https://github.com/pagxir/linux-patch/commit/819ac8cc0a4fdee32f2b9a881bced045a671af73
要在Linux中打入上面链接给的补丁,需要按照以下步骤进行:

  • 下载补丁文件:在终端中使用wget命令下载补丁文件,例如:
wget https://github.com/pagxir/linux-patch/commit/819ac8cc0a4fdee32f2b9a881bced045a671af73.patch
  • 切换到需要打补丁的目录:在终端中使用cd命令切换到需要打补丁的目录,例如:
cd /usr/src/linux
  • 打入补丁:在终端中使用patch命令打入补丁,例如:
patch -p1 < /path/to/819ac8cc0a4fdee32f2b9a881bced045a671af73.patch

注意,命令中的-p1参数表示要去掉补丁文件中的一级目录,如果补丁文件中包含多级目录,需要相应地修改参数。

  • 编译内核:在终端中使用make命令重新编译内核,例如:
make && make modules_install && make install

注意,这一步可能需要一些时间,具体时间取决于系统配置和内核大小。

  • 重启系统:在终端中使用reboot命令重启系统,注意,重启后需要选择新安装的内核版本才能生效。

5.安装新的内核

linux-headers-5.15.137-rt71实时内核链接:https://download.csdn.net/download/qq_45445740/88788240

  • 下载已经编译好了的5.15内核,apt install安装内核
    linux-headers-5.15.137-rt71_5.15.137-rt71-1_amd64.deb
    linux-image-5.15.137-rt71_5.15.137-rt71-1_amd64.deb
    linux-image-5.15.137-rt71-dbg_5.15.137-rt71-1_amd64.deb
  • 安装:
sudo apt install ./linux-headers-5.15.137-rt71_5.15.137-rt71-1_amd64.deb ./linux-image-5.15.137-rt71_5.15.137-rt71-1_amd64.deb ./linux-image-5.15.137-rt71-dbg_5.15.137-rt71-1_amd64.deb
  • 查看内核是否已升级:
awk -F\' '/menuentry |submenu / {print $1 $2}' /boot/grub/grub.cfg
  • 修改当前系统使用的内核:
sed -i 's/^GRUB_DEFAULT=.*/GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.15.137-rt71"/' /etc/default/grub
  • sudo update-grub
  • reboot

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

研发日记,Matlab/Simulink避坑指南(七)——数据溢出钳位Bug

文章目录 前言 背景介绍 问题描述 分析排查 解决方案 总结归纳 前言 见《研发日记&#xff0c;Matlab/Simulink避坑指南(二)——非对称数据溢出Bug》 见《研发日记&#xff0c;Matlab/Simulink避坑指南(三)——向上取整Bug》 见《研发日记&#xff0c;Matlab/Simulink避坑…

棋盘(来源:第十四届蓝桥杯省赛JavaA/C/研究生组 , 第十四届蓝桥杯省赛PythonC组)

小蓝拥有 nn大小的棋盘&#xff0c;一开始棋盘上全都是白子。 小蓝进行了 m 次操作&#xff0c;每次操作会将棋盘上某个范围内的所有棋子的颜色取反(也就是白色棋子变为黑色&#xff0c;黑色棋子变为白色)。 请输出所有操作做完后棋盘上每个棋子的颜色。 输入格式 输入的第…

Qt扩展-QXlsx读写Excel配置使用

QXlsx读写Excel配置使用 一、概述1. 功能概述2. 其他维护 二、安装1. 下载源码2. 配置项目3. 测试代码4. 运行结果 一、概述 项目介绍&#xff1a;https://qtexcel.github.io/QXlsx/Example.html GitHub&#xff1a;https://github.com/QtExcel/QXlsx/tree/master QXlsx 是一个…

【算法】闇の連鎖(树上差分,LCA)

题目 传说中的暗之连锁被人们称为 Dark。 Dark 是人类内心的黑暗的产物&#xff0c;古今中外的勇者们都试图打倒它。 经过研究&#xff0c;你发现 Dark 呈现无向图的结构&#xff0c;图中有 N 个节点和两类边&#xff0c;一类边被称为主要边&#xff0c;而另一类被称为附加边…

C++设计模式介绍:优雅编程的艺术

物以类聚 人以群分 文章目录 简介为什么有设计模式&#xff1f; 设计模式七大原则单一职责原则&#xff08;Single Responsibility Principle - SRP&#xff09;开放封闭原则&#xff08;Open/Closed Principle - OCP&#xff09;里氏替换原则&#xff08;Liskov Substitution …

【C++修行之道】STL(初识list、stack)

目录 一、list 1.1list的定义和结构 以下是一个示例&#xff0c;展示如何使用list容器: 1.2list的常用函数 1.3list代码示例 二、stack 2.1stack的定义和结构 stack的常用定义 2.2常用函数 2.3stack代码示例 一、list 1.1list的定义和结构 list的使用频率不高&#…

常见的核函数

在机器学习中&#xff0c;特别是在支持向量机&#xff08;SVM&#xff09;和其他基于核的方法中&#xff0c;核函数是一种用来计算数据点在高维空间中相对位置的方法。核函数能够使得算法在不显式地映射数据到高维空间的情况下&#xff0c;仍然能够处理线性不可分的数据。常见的…

RPC教程 6.负载均衡

1.负载均衡策略 假设有多个服务实例&#xff0c;而每个实例都提供相同的功能&#xff0c;为了提高整个系统的吞吐量&#xff0c;每个实例部署在不同的机器上。客户端可以选择任意一个实例进行调用&#xff0c;获取想要的结果。那如何选择呢&#xff1f;取决于负载均衡的策略。…

【WPF.NET开发】WPF中的双向功能

本文内容 FlowDirectionFlowDocumentSpan 元素非文本元素的 FlowDirection数字替换 与其他任何开发平台不同&#xff0c;WPF 具有许多支持双向内容快速开发的功能&#xff0c;例如&#xff0c;同一文档中混合了从左到右和从右到左的数据。 同时&#xff0c;WPF 也为需要双向功…

JVM基础知识汇总篇

☆* o(≧▽≦)o *☆嗨~我是小奥&#x1f379; &#x1f4c4;&#x1f4c4;&#x1f4c4;个人博客&#xff1a;小奥的博客 &#x1f4c4;&#x1f4c4;&#x1f4c4;CSDN&#xff1a;个人CSDN &#x1f4d9;&#x1f4d9;&#x1f4d9;Github&#xff1a;传送门 &#x1f4c5;&a…

企业计算机中了360后缀勒索病毒怎么办,360后缀勒索病毒解密流程

企业计算机服务器在生产运营过程中发挥着巨大作用&#xff0c;为企业带来极大便利&#xff0c;存储着企业的重要核心数据&#xff0c;但同时也成为众多勒索病毒攻击的目标。近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的计算机服务器遭到了360后缀勒索…

多文件开发

当所有的类都写在main.m这个源文件之中、将不利于后期的维护和团队开发 推荐的方式 把1个类写在1个模块之中&#xff0c;而1个模块至少包含两个文件 h头文件 1.写的类声明因为要用到Foundation框架中的类NS0 bject所以在这个头文件中要引入 Foundationa 2.框架的头文件 3.然后…

qemu搭建arm64 linux kernel环境

一、环境准备 ubuntu 22.04 内核源码&#xff1a;linux-6.6.1 &#xff08;直接上最新版&#xff09; 下载链接&#xff1a;The Linux Kernel Archives 交叉编译工具链&#xff1a; sudo apt-get install gcc-12-aarch64-linux-gnu 具体能用的版本gcc-XX-arch64-linux-gnu…

python_ACM模式《剑指offer刷题》链表2

题目&#xff1a; 例如 面试tips&#xff1a; 询问有无时间复杂度或空间复杂度的限制。 思路&#xff1a; 本题的本质就是复杂链表的深拷贝 1. 暴力解法 → 第一次遍历原链表时构建一个复制了next的新链表&#xff0c;第二次遍历原链表&#xff0c;对每个原链表的节点的ran…

幻兽帕鲁服务器多少钱?4核16G支持32人在线吗?

4核16G服务器是幻兽帕鲁Palworld推荐的配置&#xff0c;阿里云和腾讯云均推出针对幻兽帕鲁的4核16G服务器&#xff0c;阿里云4核16G幻兽帕鲁专属服务器32元1个月、66元3个月&#xff0c;腾讯云4核16G14M服务器66元1个月、277元3个月、1584元一年。云服务器吧yunfuwuqiba.com分享…

一、MongoDB、express的安装和基本使用

数据库【Sqlite3、MongoDB、Mysql】简介&小记 Sqlite3&#xff1a; SQLite3是一个轻量级的数据库系统&#xff0c;它被设计成嵌入式数据库。这意味着它是一个包含在应用程序中的数据库&#xff0c;而不是独立运行的系统服务。适用场景&#xff1a;如小型工具、游戏、本地…

node.js Redis SETNX命令实现分布式锁解决超卖/定时任务重复执行问题

Redis SETNX 命令背后的原理探究 当然&#xff0c;让我们通过一个简单的例子&#xff0c;使用 Redis CLI&#xff08;命令行界面&#xff09;来模拟获取锁和释放锁的过程。 在此示例中 获取锁: # 首先&#xff0c;设置锁密钥的唯一值和过期时间(秒) 127.0.0.1:6379> SET …

ChatGPT 官方中文页面上线

根据页面显示&#xff0c;OpenAI 现已推出 ChatGPT 的多语言功能 Alpha 版测试&#xff0c;允许用户选择不同语言的界面进行交互。 如下图所示&#xff0c;ChatGPT 会检测系统当前所使用的语言&#xff0c;并提示用户进行语言切换。 用户也可通过设置页面选择其他语言。目前&a…

企业转型:虚拟化对云计算的影响

虚拟化被认为是IT行业最优秀的技术之一。虚拟化提供的灵活性和效率&#xff0c;有助于企业根据不断变化的需求扩展其IT基础设施。虚拟化是云基础设施的基础&#xff0c;允许按需动态分配和管理计算资源。这种适应性对于满足现代企业的多样化需求至关重要&#xff0c;因为现代企…

深度学习之处理多维特征的输入

我们首先来看一个糖尿病的数据集&#xff1a; 在数据集中&#xff0c;我们称每一行叫做sample&#xff0c;表示一个样本&#xff0c;称每一列是feature&#xff0c;也就是特征在数据库里面这就是一个关系表&#xff0c;每一行叫做记录&#xff0c;每一列叫做字段。 每一个样本都…