Linux内核分析学习路线总结(内核人员必看)

Linux内核分析学习路线总结(内核人员必看)

2023年8月2日发(作者:)

Linux内核分析学习路线总结(内核⼈员必看)1、Linux体系架构(⽂末附上学习思维导图)如上图所⽰,从宏观上来看,Linux操作系统的体系架构分为⽤户态和内核态。  内核从本质上看是⼀种软件——控制计算机的硬件资源,并提供上层应⽤程序运⾏的环境。  ⽤户态即上层应⽤程序的活动空间,应⽤程序的执⾏必须依托于内核提供的资源,包括CPU资源、存储资源、I/O资源等。⽤户态的应⽤程序可以通过三种⽅式来访问内核态的资源:1)系统调⽤2)库函数3)Shell脚本这三种⽅式也在上图中有所体现。⼆、Linux内核的启动过程从该图可以看出,start_kernel是初始化内核的起点,该函数在init⽬录下的main.c⽂件⾥。start_kernel函数做了⼤量的初始化,⽐如CPU、内存等各种硬件设备进⾏初始化⽽它的最后⼀项初始化rest_init函数,会对进程空间做初始化,⾄此,Linux内核就启动起来了。三、进程管理进程是已启动的可执⾏程序的运⾏实例,进程有以下组成部分:· 已分配内存的地址空间;· 安全属性,包括所有权凭据和特权;· 程序代码的⼀个或多个执⾏线程;· 进程状态进程的⽣命周期进程的状态Linux的进程总共有6种状态1、new(初始状态,刚创建的⼀个进程,需要等待被调度)2、Runnable(就绪状态)3、RUNNING(可执⾏状态)4、Sleeping(睡眠状态)5、STOPPED(暂停状态)6、ZOMBIE(退出状态,进程成为僵⼫进程)它们之间的切换如下:有了这么多状态,⾃然就少不了进程切换⽐如说⼀个进程执⾏完了进⼊僵死状态,CPU就会重新从就绪队列⾥取出⼀个进程让其进⼊运⾏状态,⼜或者⼀个进程缺少资源进⼊睡眠状态,需要等待它需要的资源到来等等进程切换本质上说有两步组成:1.切换页全局⽬录以安装⼀个新的地址空间。2.切换内核态堆栈和硬件上下⽂。四、中断管理  前⾯说了⽤户态和内核态,那肯定也少不了⽤户态和内核态的切换,  ⽐如说C函数库中的内存分配函数malloc(),它具体是使⽤sbrk()系统调⽤来分配内存,当malloc调⽤sbrk()的时候就涉及⼀次从⽤户态到内核态的切换,类似的函数还有printf(),调⽤的是wirte()系统调⽤来输出字符串,等等  到底在什么情况下会发⽣从⽤户态到内核态的切换,⼀般存在以下三种情况:  1)即上⾯说的⽤户态到内核态的切换的三种⽅式:库函数、系统调⽤或者shell命令。  2)异常事件: 当CPU正在执⾏运⾏在⽤户态的程序时,突然发⽣某些预先不可知的异常事件,这个时候就会触发从当前⽤户态执⾏的进程转向内核态执⾏相关的异常事件,典型的如缺页异常。  3)外围设备的中断:当外围设备完成⽤户的请求操作后,会像CPU发出中断信号,此时,CPU就会暂停执⾏下⼀条即将要执⾏的指令,转⽽去执⾏中断信号对应的处理程序,如果先前执⾏的指令是在⽤户态下,则⾃然就发⽣从⽤户态到内核态的转换。  其实说⽩了就是通过中断(系统调⽤也是⼀种中断,软中断的陷阱)  CPU级别的中断信号处理过程如下:    1、确定与中断或异常相关联的向量 i    2、读取 idtr 寄存器的值,找到 IDT 的基址,通过查询 IDT,找到 第 i 项对应的内容。    3、从 gdtr 寄存器获得 GDT的基地址,并在 GDT 中查找,以读取 IDT 表项中的段选择符所标识的段描述符。    4、确定中断是由授权的发⽣源发出的。      中断:需要⽐较 CPL 和 GDT中的 DPL。中断处理程序的特 权不能低于引起中断的程序的特权。      编程异常:需要⽐较 CPL 和 IDT中的 DPL。    5、检查是否发⽣了特权级的变化,⼀般指的是⽤户态陷⼊内核 态。      如果是⽤户态陷⼊内核态,控制单元要使⽤新的特权级堆栈。      保存 ss和 esp,并⽤新的堆栈的值填充。    6、如果是故障,⽤引起故障的指令修改 cs 和 eip,以便异常处理 后再次执⾏。    7、在堆栈中保存 eflags/cs/eip 的内容。    8、如果有硬件出错码,则保存。    9、使⽤ IDT 中第 i 项中的段描述符和偏移量填充 cs 和 eip。五、时钟管理时钟⼀般分为两个部分:实时时钟和计时器/定时器。实时时钟: ⼀般靠电池供电,即使系统断电,也可以维持⽇期和时间。 实时时钟独⽴于操作系统,所以也被称为硬件时钟,为整个系统提供⼀个计时标准。定时器/计数器: 实时内核需要⼀个定时器作为系统时钟(或称 OS 时钟),并由实时内核控制系统时钟⼯作。 ⼀ 般情况下,系统时钟的最⼩粒度是由应⽤和操作系统的特点决定的。实时时钟是系统时钟的时间基准,实时内核通过读取实时时钟来初始化系统时钟,此后⼆者保持同步运⾏,共同维系系统时间。当时钟初始化(即tick_init、Time_init)后,系统就会周期性的调⽤tick_periodic这个函数,该函数的功能为:更新⾃系统启动以来所经过的时间(Jiffies)更新时间和⽇期(RTC)确定当前进程的执⾏时间,考虑是否要抢占更新资源使⽤统计计数检查到期的软定时器六、⽂件系统  Linux系统启动时,⾸先挂载根⽂件系统,之后可以⾃动或⼿动挂载其他的⽂件系统,这些⽂件系统要挂载到挂载点上,与虚拟⽂件系统(Virtual File System)和通⽤块设备层(General Block Device Layer)建⽴联系。因此,⼀个系统中可以同时存在不同的⽂件系统。  虚拟⽂件系统VFS的作⽤即屏蔽底层各个⽂件系统之间的实现差异,给⽤户提供统⼀的接⼝。  它的主要数据结构如下:超级块对象:保存⽂件系统信息⽂件对象:保存已打开的⽂件和进程的交互信息。⽬录项对象:存放⽬录项和⽂件链接的信息。索引结点对象:存放具体⽂件的⼀般信息。在磁盘中的数据结构:引导控制块:操作系统的初始引导块盘控制块:磁盘信息等⽂件控制块:⽂件属性。⽬录结构:组织管理⽂件。在内存中的数据结构:系统打开⽂件表进程打开⽂件表  ⽂件打开流程:    1、打开⽂件即使⽤ open 函数,它⾸先通过按名查找,看在⾼速缓存中有没有查找的 inode,如果有那么对其进⾏引⽤并加 1。如果没有将创建新的 vfs的 inode 对象和⽬录项对象等。    2、 Open 函数调⽤的系统服务例程是 sys_open 函数,其接受的参数为⽂件⽬录和访问的模式。如果⽂件存在则返回⼀个⽂件描述符fd,如果不存在则返回-1.    3、 Read 和write 函数分调⽤的服务例程是 sys_read 和 sys_write,接受三个参数。分别是⼀个⽂件描述符 fd,⼀个对数据缓存的地⽅buf,和需要传输的数据的多少 count。Read 对将⽂件读⼊缓存区。Write 则相反。  ⽂件关闭流程:    1、⽤户程序通过close ( )系统调⽤关闭打开的⽂件,该函数接收的参数为要关闭⽂件的⽂件描述符。    2、内核调⽤sys_close ( )函数。七:学习思维导图以及Linux内核相关学习视频,清晰版导图可以点击: 获取

发布者:admin,转转请注明出处:http://www.yc00.com/web/1690958655a473042.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信