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

发布时间 - 2025-04-18 00:00:00    点击率:

这本书是学习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./link/6868e581382cc1c0d24e352a4e262ac0

应用程序、内核和硬件之间的关系?应用程序使用库提供的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的所有指令中,有些指令是非常危险的,如果错用,将导致系统崩溃,比如清内存、设置时钟等。

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

图来源:https://www./link/13d763a5838ca85acd2d4ff824ab03ea

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

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

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

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

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

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

2、内存数据隔离;

3、内存数据安全;

4、内存使用监控;

通过MMU的访存

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

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

ARM的MMU页表格式

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

节:1MB的存储器块

大页:64KB的存储器块

小页:4KB的存储器块

微页:1KB的存储器块

页表的级别

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

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

第二级表:

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

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

MMU/Cache line

CPU L1/L2高速缓存

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

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

理解了这张图,可能就真正理解了用户态和内核态是怎么回事了!

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

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

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

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

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

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

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

5、任何内存映射文件;

6、任何共享内存段;

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


# linux  # 操作系统  # 处理器  # ai  # 区别  # linux操作系统  # 为什么  # asic  # html  # 全局变量  # 指针  # 数据结构  # 接口  #   # 线程  # copy  # 对象  # https  # 虚拟化  # 应用程序  # 主存储器  # 加载  # 几个  # 多个  # 句柄  # 运行于  # 内存管理 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  音响网站制作视频教程,隆霸音响官方网站?  Android okhttputils现在进度显示实例代码  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  Laravel如何使用withoutEvents方法临时禁用模型事件  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  如何在云虚拟主机上快速搭建个人网站?  如何选择PHP开源工具快速搭建网站?  如何在阿里云虚拟主机上快速搭建个人网站?  高端企业智能建站程序:SEO优化与响应式模板定制开发  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  如何生成腾讯云建站专用兑换码?  jQuery中的100个技巧汇总  浅析上传头像示例及其注意事项  Laravel如何实现数据库事务?(DB Facade示例)  Firefox Developer Edition开发者版本入口  如何在万网自助建站平台快速创建网站?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  高防服务器租用指南:配置选择与快速部署攻略  Laravel怎么使用Intervention Image库处理图片上传和缩放  如何确保FTP站点访问权限与数据传输安全?  Laravel如何使用模型观察者?(Observer代码示例)  轻松掌握MySQL函数中的last_insert_id()  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  C++时间戳转换成日期时间的步骤和示例代码  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  LinuxShell函数封装方法_脚本复用设计思路【教程】  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  详解vue.js组件化开发实践  如何快速登录WAP自助建站平台?  Laravel怎么在Controller之外的地方验证数据  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  专业商城网站制作公司有哪些,pi商城官网是哪个?  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  装修招标网站设计制作流程,装修招标流程?  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  如何在阿里云服务器自主搭建网站?  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  如何快速搭建个人网站并优化SEO?  敲碗10年!Mac系列传将迎来「触控与联网」双革新  Laravel如何集成Inertia.js与Vue/React?(安装配置)  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  使用C语言编写圣诞表白程序