0

0

读书笔记|Linux内核设计与实现

蓮花仙者

蓮花仙者

发布时间:2025-04-18 09:58:20

|

332人浏览过

|

来源于php中文网

原创

这本书是学习linux内核原理的必读推荐书目之一!它对linux内核的设计原理进行了详细的说明,并介绍了具体的实现部分,结合源码可以很好地理解linux内核。

在简单翻阅了一遍之后,我带着以下几个疑问,整理了相关知识点:

1、内核是什么时候加载运行的?

2、应用程序、内核和硬件之间的关系?

3、进程管理、内存管理和进程地址空间?

其实书上的知识还是那些,可能在不同的阶段去理解,原来没什么感觉,现在看来,一切都变得那么清晰起来。所以说,对操作系统的理解和学习是打通任督二脉的事情,也更好的理解了我们所做的事情到底处于什么样的层次,性能调优也有了从源头开始的思路!

内核是什么时候加载运行的?bootloader将压缩的内核复制到内存空间;内核自解压;然后运行内核,流程如下:1、入口在arch/arm/kernel/head-armv.S

2、查找处理器类型

__lookup_processor_type

__lookup_architecture_type

3、初始化页表:__create_page_tables

4、初始化C代码空间

5、跳转到C代码中,start_kernel

start_kernel在init/main.c中,完成内核的启动过程;

start_kernel()-->rest_init()-->kernel_init()-->do_basic_setup()-->do_initcalls()

另外,BIOS->GRUB->INIT程序的启动过程可以参考:https://www.php.cn/link/6868e581382cc1c0d24e352a4e262ac0

应用程序、内核和硬件之间的关系?读书笔记|Linux内核设计与实现应用程序使用库提供的open,read,write函数打开我们的设备文件。库根据open,read,write函数传入的参数执行"swi"指令,这条指令引发CPU异常,进入内核。内核的异常处理函数根据这些参数找到对应的驱动程序,返回一个文件句柄给库,进而返回给应用程序。应用程序得到句柄后,使用库提供的write,ioctl函数发出控制命令。库根据write,ioctl函数传入的参数执行swi指令,引起CPU异常,进入内核。内核的异常处理函数根据这些参数调用驱动程序的相关函数。根据《Linux内核设计与实现》说明,CPU在某个任何特定的时间点上的活动必然概括为下列三种之一:

运行于用户空间,执行用户进程;运行于内核空间,处于进程上下文,代表某个特定的进程执行;运行于内核空间,处于中断上下文,与内核进程无关处理某个特定的终端;驱动程序与应用程序的区别

1、应用程序以main开始,驱动程序没有main,它以一个模块初始化函数作为入口。

2、应用程序从头到尾执行一个任务,驱动程序完成初始化之后不再运行,等待系统调用。

3、应用程序可以使用GLIBC等标准C函数库,驱动程序不能使用标准C库。

Linux设备驱动作为一个Linux内核模块存在,模块都有两个接口函数,模块初始化函数和模块退出函数。

上面提到的驱动程序的注册。一般是由模块初始化函数来实现的。模块退出函数则用于取消内核注册,释放资源。 可见只有运行了驱动的这个模块初始化函数之后,驱动程序才能够被注册,内核才能找到设备驱动。 那么什么时候模块初始化函数才获得运行呢?动态加载时,即运行insmod时。静态加载时模块编译进内核系统初始化时会自动调用这个模块初始化函数。

用户态与内核态

系统运行时一般情况下,分为用户态和内核态,这两种运行态下的数据互不可见。驱动程序是内核的一部分,工作在内核态,应用程序工作在用户态。这样就存在数据空间访问的问题:无法通过指针直接将二者的数据地址进行传递。问题的解决办法是:系统提供一系列函数帮助完成数据空间转换:例如,get_user、put_user、copy_from_user、copy_to_user等函数。

Linux操作系统为什么分为用户态和内核态,简单以一句话来说是为了安全, 在CPU的所有指令中,有些指令是非常危险的,如果错用,将导致系统崩溃,比如清内存、设置时钟等。

系统调用:与内核通信的关键,系统调用包括系统调用号,系统调用的实现,系统调用上下文等;

读书笔记|Linux内核设计与实现图来源:https://www.php.cn/link/13d763a5838ca85acd2d4ff824ab03ea

进程管理描述进程的数据结构,进程的创建,fork、clone等方法创建进程,进程的关系,进程结束;进程调度;进程树;

进程就是运行的程序;进程除了可执行的代码段,还包括打开的文件,挂起的信号,内核内部数据,处理器状态,内存地址空间及一个或多个执行线程、全局变量的数据段等等;线程是在进程中活动的对象,线程是内核调度的对象;

进程的创建、运行、和销毁通常使用到的几个方法:fork()、clone()、exec()、exit();

Linux的进程创建时使用到写时拷贝的技术(copy-on-write)来实现。写时拷贝是一种推迟甚至免除拷贝数据的技术,内核此时并不复制整个进程地址空间,而是让父进程和子进程以只读方式共享同一个拷贝。只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。

内存管理内存管理简单理解是操作系统为了让多个应用程序安全、便捷地使用内存单元,实现的一种内存虚拟化技术!解决的是:

1、多进程使用同一个内存硬件资源;

2、内存数据隔离;

Linux+PHP+MySQL案例教程
Linux+PHP+MySQL案例教程

本书以培养高级网站建设与管理人才为目标,内容循序渐进,由浅入深,通过大量的实例系统全面地介绍了Linux+PHP+MySQL环境下的网络后台开发技术。本书详尽分析了近30个典型案例。包括计数器、网站流量统计、留言板、论坛系统、聊天室、投票与调查、用户管理、新闻发布系统、广告轮播、购物系统等等,力求让读者通过对案例的学习,轻松掌握PHP和MySQL的编程精要,迅速掌握网络后台开发技巧。   本书适

下载

3、内存数据安全;

4、内存使用监控;

通过MMU的访存

MMU会先查找TLB中的虚拟地址表

如果TLB中没有虚拟地址的入口,硬件从主存储器中的转换表中获取转换与访问权限。

ARM的MMU页表格式

MMU支持基于节或者页的存储器访问。

节:1MB的存储器块

大页:64KB的存储器块

小页:4KB的存储器块

微页:1KB的存储器块

页表的级别

存在主存储器内的转换页表有两个级别:

第一级表:存储节转换表与指向第二级表的指针

第二级表:

(1)存储大页和小页的转换表。

(2)存储微页的转换表。

MMU/Cache line

CPU L1/L2高速缓存

页高速缓存:Linux内核实现的磁盘缓存,主要用来减少对磁盘的I/O操作。具体来讲,是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。

进程地址空间进程地址空间由进程可寻址的虚拟内存组成;每个应用程序可见的地址空间是相同的,如下图:

读书笔记|Linux内核设计与实现理解了这张图,可能就真正理解了用户态和内核态是怎么回事了!

一个进程的地址空间和另一个进程的地址空间即使有相同的内存地址,实际上也彼此互不相干。

内存区域可以包括各种内存对象:

1、可执行文件代码的内存映射,成为代码段(text section);

2、可执行文件中的已初始化全局变量的内存映射,称为数据段(data section);

3、包含未初始化全局变量、也就是bss段的零页的内存映射;

4、用于进程用户控件栈的零页的内存映射;

每一个诸如C库或者动态链接程序等共享库的代码段、数据段和bss也会被载入进程的地址空间;

5、任何内存映射文件;

6、任何共享内存段;

7、任何匿名的内存映射,如malloc分配的内存;

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

78

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

96

2025.09.18

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

539

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

28

2026.01.06

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1133

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

213

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1799

2025.12.29

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8万人学习

Git 教程
Git 教程

共21课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号