Linux(06)之获取内核代码

news2024/11/26 8:17:59

Linux(06)之获取内核代码

Author:OnceDay Date:2023年1月5日

漫漫长路,有人对你微笑过嘛…

参考文档:

  • 《Linux内核设计和实现》

1.概述

linux内核的基本架构如下:

在这里插入图片描述

所以每个处理器运行的地方只有以下可能:

  • 运行于用户空间,执行用户进程。
  • 运行于内核空间,处于进程上下文,代表某个特定的进程执行。
  • 运行于内核空间,处于中断上下文,于任何进程无关,处理某个特定的中断。

内核设计一般有两种,单内核和微内核。Linux基于单内核设计,但同时吸收了微内核设计的模块化思想。Linux内核运行在单独的内核地址空间上 ,同时支持抢占式内核、支持内核线程、动态装载内核模块的能力。

Linux内核支持对称多处理机制(SMP),对待线程和进程一视同仁,线程就像一些能够共享资源的进程。

Linux内核有多种版本,有一些版本是LTS(长期支持),这类版本一般用于工业生产中,另外一些就是处于开发之中的版本。命名规则如下:

在这里插入图片描述

主版本号+从版本号用于描述内核系列。如上,就是5.15版内核系列。

2. 获取linux内核源码

获取linux源码非常简单,直接在官方网站获取即可,但是下载速度有限:

  • The Linux Kernel Archives

可以考虑从国内镜像网站下载:

  • linux-kernel安装包下载_开源镜像站-阿里云 (aliyun.com)

此外,也可以使用git下载,源代码在github上:

  • https://github.com/torvalds/linux

但是同样下载很慢,因此使用gitee码云来加速下载:

  • Linux Kernel: Linux 内核源码镜像 (gitee.com)

可以使用以下方式直接下载:

git clone https://gitee.com/mirrors/linux_old1.git

注意,最好在linux环境下安放源码,window下可能遇到文件系统不兼容的问题。

内核源码一般由以下目录组成:

目录描述
arch特定体系结构的源码
block块设备I/O层
crypto加密API
Documentation内核源码文档
drivers设备驱动程序
firmware使用某些驱动程序而需要的设备固件
fsVFS和各种文件系统
include内核头文件
init内核引导和初始化
ipc进程间通信代码
kernel像调度程序这样的核心子系统
lib通用内核函数
mm内存管理子系统
samples示例,示范代码
scripts编译内核所用的脚本
sound语音子系统
usr早期用户空间代码(所谓的initramfs)
tools在Linux开发中有用的工具
virt虚拟化基础结构

除了上面文件夹外,还有一些许可证和其他的配套文件。

2.1 阅读linux源码

这里采用VScode + gtags的方法。

首先是直接通过下面命令在linux服务器上克隆整个linux kernel源码:

git clone https://gitee.com/mirrors/linux_old1.git

内核源码仓库很大,大小有3.5G,实际占用空间4~5G。

然后vscode使用ssh远程连接到Linux服务器上,vscode会自动安装vscode-server。

离线安装可参考下面文章,linux服务器能联网,安装很简单,请自行百度。

  • 离线安装vscode_Once_day的博客-CSDN博客_vscode 离线安装

vscode需要安装以下插件:

  • C/C++ ,必备插件。
  • c/c++ Extension Pack,扩展包。
  • c/C++ GNU Global,支持gtags。
  • GitLens,用于查看git commit记录和相关操作,非常好用。

此外Linux服务器需要安装global,这是gnu提供的一个解析代码的工具。生成二进制的数据库,对于大型代码工程非常有帮助。

对于ubuntu系统,直接apt install global即可。其他linux系统仿照如此即可。

使用vscode连接ssh打开服务器上的内核代码文件夹。

设置配置文件(没有就新建)如下.vscode/settings.json:

{
"editor.tabSize": 8,
"C_Cpp.default.intelliSenseMode": "linux-gcc-x64",
"C_Cpp.intelliSenseCacheSize": 51200,
"search.followSymlinks": false,
"C_Cpp.workspaceParsingPriority": "high",
"C_Cpp.default.browse.limitSymbolsToIncludedHeaders": true,
"C_Cpp.intelliSenseEngine": "disabled"
}

"search.followSymlinks": false很关键,内核代码有些文件是符号链接文件,可能造成循环引用,这会导致cpptool直接cpu占用拉满。当然,最关键的是

在这里插入图片描述

这个地方,必须要手动暂停解析,这个解析再进行到一定文件之后就会卡死循环,所以干脆不要了。

其他配置字段的含义,可以自行百度,网上介绍非常多。

接下来是使用global生成代码解析文件,直接在vscode里面按下F1,然后搜索global

在这里插入图片描述

第一个命令是建立数据库,执行一次即可,如果代码改变,也可以再执行一次。

这个过程会在后台一直运行,大概几分钟,等着就好。如果运行正常,目录下面会出现三个文件:

-rw-r--r--   1 ubuntu ubuntu        17M Jan  5 23:27 GPATH
-rw-r--r--   1 ubuntu ubuntu       534M Jan  5 23:27 GRTAGS
-rw-r--r--   1 ubuntu ubuntu       708M Jan  5 23:27 GTAGS

可以看到,数据是非常大的,然后就可以正常在代码使用跳转等功能了。

更多有关的信息可以自行去收集,此外c也可以使用langd工具。

2.2 内核代码开发的特点

内核代码的开发和用户空间有一些独特之处,主要如下:

  • 内核编程不能访问C库或者标准的C头文件。
  • 内核编程必须使用GNU C。
  • 内核编程时缺乏像用户空间这样的内存保护机制。
  • 内核编程难以执行浮点运算。
  • 内核给每个进程只有一个很小的定长堆栈。
  • 内核支持SMP、抢占、异步中断,所以必须时刻注意同步和并发。
  • 考虑可移植的重要性。

首先,内核不能链接使用标准C函数库。主要原因是这些库都太大了,效率也底下。不过大部分的C库函数都在内核中已经实现了。

在内核中没有内存保护机制,如果一个用户试图进行一次非法的内存访问,内核就会发现这个错误,发送SIGSEGV信号,并结束整个进程。如果内核这么操作,会导致oops发生(一种内核的错误警告,包含错误的信息)。

内核里面也不要进行浮点数操作,这是因为浮点数的实现方式各异,需要人工保存和恢复浮点寄存器之类的操作。

内核的栈大小是受限的,根据体系不同值也不同,一般由4KB,8KB,16KB等,64位机器一般比32位要多。

内核的抢占、SMP、异步中断等过程都可能产生竞争条件,因此需要并发的访问共享数据,如RCU机制。

Linux是一个可移植的系统,因此,字节序、64位对齐,字长和页面长度等不应该假定。

此外,内核代码还用了很多GNU C的扩展语法支持。

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

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

相关文章

带你玩转指针——指针进阶(二)

上次我们说到了函数指针,对于函数指针大家还不太清楚的参考,指针进阶(一)http://t.csdn.cn/z5cjM函数指针数组数组是存放相同类型的空间,前面我们已经学习了指针数组int* arr[10] 每个元素是int*那么我们把函数的地址存…

grpc实现c++异步非阻塞stream

grpc实现c异步非阻塞stream 参考文章 Non-blocking single-threaded streaming C servergRPC C async api doc and sample codegrpc异步stream server端demo 序言 原来一直是用着同步阻塞的grpc stream。由于不想再创建新的线程来监听grpc stream的新消息了,所以就…

怎么提高程序设计能力?可以参考程序-设计原则,程序-设计模式

怎么提高程序设计能力? 简单说下我的方式方法: 【程序架构】 借鉴设计模式和设计原则 【程序业务】 多理解客户需求,理解后,做竞品逻辑分析,分析出其逻辑结构,和数据结构 ; 再根据客户需求…

自己有工厂,怎样接外贸订单?

很多做外贸的小工厂和小型加工厂,除了传统的营销渠道外,也不知道如何做、才能接到外贸订单。小工厂想获得外贸订单,可通过以下7个方法:1、注册一些外贸B2B平台,发布产品,等待客户询盘外贸B2B平台太多了&…

商务车改装之奔驰威霆改装

今天来看看这台车的改装效果,首先外观改成GLS的一个包围。同时大灯换了一个三道杠的运动大灯。运动大灯加上包围,是不是时尚了很多。再来看看威霆内饰,白红相间的色彩搭配,仪表台换成一个大连屏的仪表台,带着飞机一样的…

4路DI开关检测计数器NPN/PNP输入,Modbus TCP协议,WiFi模块YL160频率测量 计数器

特点:● 4路开关量输入,支持NPN和PNP输入● DI每一路都可用作计数器或者频率测量● 支持Modbus TCP 通讯协议● 可以设置每转脉冲数用于转速测量● 内置网页功能,可以通过网页查询电平状态● 可以通过网页设定输出状态● 宽电源供电范围&…

OPC Expert v8.1.2211 Crack

像专业人士一样解决您的 OPC 和 DCOM 连接问题 [无需经验] 快速修复 OPC 和 DCOM 错误 使用 OPC Expert,您无需任何经验即可解决和修复 OPC 连接问题。OPC Expert 为您完成繁重的工作,以快速自动诊断 OPC 和 DCOM 问题……Ω578867473而且还不止于此。OP…

基于Java+SpringBoot+vue+element实现餐厅点餐系统平台

基于JavaSpringBootvueelement实现餐厅点餐系统平台 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录基于JavaSpringBo…

ATGM336H-5N定位导航模块介绍

ATGM336H-5N定位导航模块简介ATGM336H-5N系列模块是9.7X10.1尺寸的高性能BDS/GNSS全星座定位导航模块系列的总称。该系列模块产品都是基于中科微第四代低功耗GNSSSOC 单芯片—AT6558,支持多种卫星导航系统,包括中国的BDS(北斗卫星导航系统&am…

基于Java+SpringBoot+vue+element实现火车订票平台管理系统

基于JavaSpringBootvueelement实现火车订票平台管理系统 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取…

足球视频AI(五)——球员与球的对象跟踪

一、基础概念 在之前的四节中,我们尝试解决: 1,球员识别、足球识别、裁判识别; 2,队伍的分类 3,平面坐标的换算 存在关键的问题是:每一帧的画面,每次都是重新识别,无…

【OpenCV】数字图像的表示 | 图像IO操作接口 | 图像混合操作

Ⅰ. 数字图像的表示 0x00 位数 计算机采用0/1编码的系统,数字图像也是利用0/1来记录信息。 我们平常接触的图像都是8位数图像,包含0~255灰度。 0:代表最黑 1:表示最白0x01 二值图像 一幅二值图像的二维矩阵仅由0、1…

VTK-vtkAbstractTransform及其子类

前言:本博文主要研究vtkAbstractTransform及其子类的实现原理,以及由此扩展的类。 目录 vtkAbstractTransform vtkGeneralTransform vtkGeoSphereTransform(9.0.3中没有该接口) vtkGeoTransform(9.0.3中没有该接口) vtkHomogeneousTransform vtkId…

企业微信客户联系自定义工具栏开发

一、问题说明:企业微信中私聊微信客户,在聊天输入框上面有一行快捷工具,这边怎么自定义开发?如下图,我们可以点击快捷发送,然后弹出一个页面,页面中有我们需要发送给当前会话的各种资源&#xf…

Maven高级-聚合-继承

多模块构建维护 作用&#xff1a;聚合用于快速构建maven工程&#xff0c;一次性构建多个项目/模块。 制作方式&#xff1a; 创建一个空模块&#xff0c;打包类型定义为pom <packaging>pom</packaging>定义当前模块进行构建操作时关联的其他模块名称 <modules&g…

2021年MathorCup高校数学建模挑战赛—大数据竞赛B题信息流智能推荐算法中的序列评估问题求解全过程文档及程序

2021年MathorCup高校数学建模挑战赛—大数据竞赛 B题 信息流智能推荐算法中的序列评估问题 原题再现&#xff1a; 随着互联网信息的蓬勃发展&#xff0c;用户在使用互联网应用时面临着信息过载的问题。推荐算法的出现&#xff0c;满足了用户个性化的内容消费需求&#xff0c;…

分布式任务调度系列 - XXL-JOB

一、前言 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 二、传统的定时任务 1. 概念 1.1、定时任务的基本概念 程序为解决一个信息处理任务而预先编制的工作执行方案&#xff0c;这就是定时任务&#xff0c;核心组成如下&#xff1a; 执行器&#…

28个数据可视化图表的总结和介绍

数据可视化本身就是一种通用语言。我们这里通用语言的意思是&#xff1a;它能够向各行各业的人表示信息。它打破了语言和技术理解的障碍。数据是一些数字和文字的组合&#xff0c;但是可视化可以展示数据包含的信息。 “数据可视化有助于弥合数字和文字之间的差距”——Brie E…

C++入门——引用

1.概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用的变量共用同一块内存空间 类型& 引用变量名(对象名) 引用实体&#xff1b; 而引用类型必然要与引用实体的类型一致。 …

下载微信小程序中的视频

工具准备&#xff1a;Fiddler 我这里用的5.0的版本。&#xff08;这个用来抓取视频下载地址&#xff09;Internet Download Manager&#xff08;idm&#xff09;版本6.37&#xff08;这个用来下载视频&#xff09;步骤&#xff1a;打开Fiddler如下图配置后抓包2.登录PC版微信&a…