【GNU/Linux kernel源码分析】刨根问底,速览,对初学者友好的底层理解,让你对内核不再迷茫

简介: 【GNU/Linux kernel源码分析】刨根问底,速览,对初学者友好的底层理解,让你对内核不再迷茫

1. Linux kernel


1. 源代码目录结构分析


1、Linux 内核源代码包括三个主要部分


1)内核核心代码:包括linux内核整体架构分析笔记描述的各子系统和子模块,以及其他支撑子系统,如:电源管理、linux初始化等。


2)非核心代码:例如库文件(因为 Linux 内核是一个自包含的内核,即内核不依赖其它的任何软件,自己就可以编译通过)、固件集合、

KVM(虚拟机技术)等。


3)编译脚本、配置文件、帮助文档、版权说明等辅助性文件。

1668319022256.jpg


include/ :内核头文件,需要提供给外部模块(例如用户空间代码)使用。

kernel/ : Linux 内核的核心代码,包含了 进程调度子系统,以及和进程调度相关的模块。

mm/ :内存管理子系统

fs/ ---- VFS 子系统。虚拟文件系统(Virtual File System,简称 VFS)是 Linux 内核的子系统之一

net/ ---- 不包括网络设备驱动的网络子系统。

ipc/ ---- IPC(进程间通信)子系统。

arch// ---- 体系结构相关的代码,例如 arm, x86 等等。

arch//mach- ---- 具体的 machine/board 相关的代码。

arch//include/asm ---- 体系结构相关的头文件。

arch//boot/dts ---- 设备树( Device Tree)文件。

init/ ---- Linux 系统启动初始化相关的代码。

block/ ---- 提供块设备的层次。

sound/ ---- 音频相关的驱动及子系统,可以看作“音频子系统”。

drivers/ ---- 设备驱动

lib/ ---- 实现需要在内核中使用的库函数,例如 CRC、 FIFO、 list、 MD5 等。

crypto/ ----- 加密、解密相关的库函数。

security/ ---- 提供安全特性( SELinux)。

virt/ ---- 提供虚拟机技术( KVM 等)的支持。

usr/ ---- 用于生成 initramfs 的代码。/usr不是user的缩写,其实usr是Unix Software Resource的缩写, 也就是Unix操作系统软件资源所放置的目录,而不是用户的数据;所有系统默认的软件都会放置到/usr, 系统安装完时,这个目录会占用最多的硬盘容量

firmware/ ---- 保存用于驱动第三方设备的固件。

samples/ ---- 一些示例代码。

tools/ ---- 一些常用工具,如性能剖析、自测试等。

Kconfig, Kbuild, Makefile, scripts/ ---- 用于内核编译的配置文件、脚本等。

COPYING ---- 版权声明。

MAINTAINERS —-维护者名单。

CREDITS ---- Linux 主要的贡献者名单。

REPORTING-BUGS ---- Bug 上报的指南。

Documentation, README ---- 帮助、说明文档。


2. linux内核模块编程入门


这里的printk就是print kernal,意思是输出到内核,输出到日志文件


当模块插入执行初始化lkp__init()函数


当模块卸载执行退出函数lkp__exit()

代码示例:


//任何模块都要包含的三个头文件
#include <linux/module.h>    //(module<n>模块; 功能块)包含了对模块的版本控制
#include <linux/kernel.h>    //包含了常用的内核函数
#include <linux/init.h>    //包含了宏__init(告诉编译程序仅初始化的函数和变量)和__exit()
/*
    模块的初始化函数lkp_init()
    __init是用于初始化的修饰符
*/
static int __init lkp_init(void)    //加载函数的入口函数 相当于 main(void)
{
    printk("<1>Hello,world!from the kernel space...\n");//Linux内核下内核编程不能使用c的库
}
/*   
    模块的退出和清理函数lkp_exit()    //入口相对的出口
*/
static void __exit lkp(void)
{
    printk("<1>Goodbye,world!leaving kernel space...\n");
}
/*
    调用函数
*/
module_init(lkp_init);
module_exit(lkp_exit);
/*
    模块的许可证声明GPL
*/
MODULE_LICENSE("GPL");


3. 如何编译内核模块


内核模块的编译需要与常规用户空间应用程序略有不同。 以前的内核版本要求我们关注这些设置,这些设置通常存储在Makefile中。 虽然按层次结构组织,但许多冗余设置在次级Makefile中累积并使它们变大并且难以维护。 幸运的是,有一种新方法可以做这些事情,称为kbuild,外部可加载模块的构建过程现在完全集成到标准内核构建机制中。 要了解有关如何编译不属于官方内核的模块的更多信息(例如本指南中的所有示例),请参阅文件

linux / Documentation / kbuild / modules.txt 。


那么,让我们看一个简单的Makefile来编译一个名为hello-1.c的模块:

obj-m += hello-1.o
all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean


核心思想:告诉哪个头文件放在哪些地方


在这个文件里定义了三个变量


路径的变量


内核版本号变量


内核源代码所在路径变量


1668319117032.jpg


内核模块插入到内核里

超级用户的权限插入


#insmod + 模块名.ko

1668319136647.jpg

1668319147639.jpg



4. 源码在线阅读的网站


源码在线阅读

源码在线阅读2

linux内核编程入门


参考原文


linux内核源码分析笔记


2. 内核常用数据结构


Linux 内核代码中广泛使用了数据结构和算法,其中最常用的两个是链表和红黑树。

linux内核源码分析笔记


3. TTY


在 Linux 中,TTY也许是跟 终端 有关系的最为混乱的术语。. TTY是TeleTYpe的一个老缩写。. Teletypes,或者teletypewriters,原来指的是 电传打字机 ,是通过串行线用打印机键盘通过阅读和发送信息的东西,和古老的 电报机 区别并不是很大。. 之后,当计算机只能以 批处理 方式运行时(当时穿孔卡片 阅读器 是唯一一种使程序载入运行的方式),电传打字机成为唯一能够被使用的“实时”输入/ 输出设备 。. 最终,电传打字机被键盘和显示器终端所取代,但在终端或TTY接插的地方,操作系统仍然需要一个程序来监视 串行端口 。. 一个getty“Get TTY”的处理过程是:一个程序监视物理的TTY/终端接口。.


4. 晶振


晶振是一个被加了电压就会产生稳定节拍的东西,我们只需要找一个东西去记录节拍,便可以达到作为一个时钟信号的产生器。

1668318951288.jpg

相关文章
|
3月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
184 67
|
1月前
|
存储 负载均衡 算法
Linux2.6内核进程调度队列
本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。
39 0
|
3月前
|
存储 Linux
Linux内核中的current机制解析
总的来说,current机制是Linux内核中进程管理的基础,它通过获取当前进程的task_struct结构的地址,可以方便地获取和修改进程的信息。这个机制在内核中的使用非常广泛,对于理解Linux内核的工作原理有着重要的意义。
141 11
|
3月前
|
Linux C语言
Linux读写锁源码分析
本文分析了读写锁的实现原理与应用场景,基于glibc 2.17源码。读写锁通过读引用计数、写线程ID、条件变量等实现,支持读优先(默认)和写优先模式。读优先时,写锁可能饥饿;写优先时,读线程需等待写锁释放。详细解析了`pthread_rwlock_t`数据结构及加解锁流程,并通过实验验证:2000个读线程与1个写线程测试下,读优先导致写锁饥饿,写优先则正常抢占锁。
81 19
|
4月前
|
自然语言处理 监控 Linux
Linux 内核源码分析---proc 文件系统
`proc`文件系统是Linux内核中一个灵活而强大的工具,提供了一个与内核数据结构交互的接口。通过本文的分析,我们深入探讨了 `proc`文件系统的实现原理,包括其初始化、文件的创建与操作、动态内容生成等方面。通过对这些内容的理解,开发者可以更好地利用 `proc`文件系统来监控和调试内核,同时也为系统管理提供了便利的工具。
167 16
|
5月前
|
安全 Linux 开发者
Debian GNU/Linux
Debian是Linux发行版之一,其起源可以追溯到1993年,由Ian Murdock创立。Debian的名字来源于其创始人Ian Murdock的女友的名字Deb和Linux的创始人Linus Torvalds的名字的组合,即“Deb”+“ian”。Debian的目标是创建一个自由、开放、安全、稳定的操作系统,为用户提供丰富的软件资源和良好的使用体验。 特点
98 8
Debian GNU/Linux
|
6月前
|
安全 Linux 测试技术
Intel Linux 内核测试套件-LKVS介绍 | 龙蜥大讲堂104期
《Intel Linux内核测试套件-LKVS介绍》(龙蜥大讲堂104期)主要介绍了LKVS的定义、使用方法、测试范围、典型案例及其优势。LKVS是轻量级、低耦合且高代码覆盖率的测试工具,涵盖20多个硬件和内核属性,已开源并集成到多个社区CICD系统中。课程详细讲解了如何使用LKVS进行CPU、电源管理和安全特性(如TDX、CET)的测试,并展示了其在实际应用中的价值。
134 4
|
6月前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
341 15
|
7月前
|
算法 Linux
深入探索Linux内核的内存管理机制
本文旨在为读者提供对Linux操作系统内核中内存管理机制的深入理解。通过探讨Linux内核如何高效地分配、回收和优化内存资源,我们揭示了这一复杂系统背后的原理及其对系统性能的影响。不同于常规的摘要,本文将直接进入主题,不包含背景信息或研究目的等标准部分,而是专注于技术细节和实际操作。
|
7月前
|
缓存 监控 网络协议
Linux操作系统的内核优化与实践####
本文旨在探讨Linux操作系统内核的优化策略与实际应用案例,深入分析内核参数调优、编译选项配置及实时性能监控的方法。通过具体实例讲解如何根据不同应用场景调整内核设置,以提升系统性能和稳定性,为系统管理员和技术爱好者提供实用的优化指南。 ####