Never too late to learn.

0%

Linux 内核设计 学习笔记

Linux内核设计 学习笔记

从开机加电到执行main函数之前的过程

启动BIOS,准备实模式下的中断向量表和中断服务程序->加载操作系统内核程序并为保护模式做准备->开始向32位模式转变,为main函数的调用做准备

实模式(Real Mode)是Intel 80286和之后的80x86兼容CPU的操作模式。实模式的特性是一个20位的存储器地址空间(2^20 = 1048576,即1MB的存储器可被寻址),可以直接软件访问BIOS以及周边硬件,没有硬件支持的分页机制和实时多任务概念。

CS(Code Segment Register): 代码段寄存器,存在于CPU中,只想CPU当前执行代码在代码中的区域
IP/EIP(Instruction Pointer): 指令指针寄存器,存在于CPU中,记录将要执行的指令在代码段内的偏移地址,和CS组合即为将要执行的指令的内存地址。

计算方式是CS左移4位加上IP

打开A20地址线,意味着CPU可以进行32位寻址,最大寻址空间为4GB。

设备环境初始化及激活进程0

开始执行main()函数,其为用C语言编写的操作系统内核代码,包括硬件初始化、为内核及进程的正确运行所作的初始化、激活进程0

硬件初始化分为两类:
一类是与主机有关的硬件初始化,包括规划内存格局、设置及初始化缓冲区、设置及初始化虚拟盘、初始化mem_map、初始化缓存区管理结构等;
另一类是与外设有关的初始化,包括设置根设备、初始化软盘、初始化硬盘等。

进程0是Linux操作系统中运行的第一个进程,也是Linux操作系统父子进程创建机制的第一个父进程

初始化进程0->设置时钟中断->设置系统调用总入口

系统调用函数是操作系统对用户程序的基本支持。在操作系统中,依托硬件提供的特权级对内核进行保护,不允许用户进程直接访问内核代码。但进程中有大量的像读盘、创建子进程之类的具体事务处理需要内核代码的支持。为了解决这个矛盾,操作系统的设计者提供了系统调用的解决方案,提供一套系统服务接口。

Linux操作系统规定,除进程0之外, 所有进程都要由一个已有进程在3特权级下创建。进程0在正式创建进程1之前,通过调用move_touser_mode()函数,模仿终端返回动作,实现进程0的特权级从0转变为3。

进程1, 2的创建及执行

在Linux操作系统中创建新进程的时候,都是由父进程调用fork函数来实现的。

task_struct是操作系统表示、管理进程的最重要的数据结构,每一个进程必须具备只属于自己的、唯一的task_struct。

Linux0.11 的进程调度机制中,通常有一下两种情况可以产生进程切换。

  • 允许进程运行的时间结束:进程在创建时,都被赋予了有限的时间片,以保证所有进程每次都只执行有限的时间,一旦进程的时间片被削减为0,立即切换到其他进程去执行,实现多进程轮流执行。
  • 进程运行停止:当一个进程需要等待外设提供的数据,或等待其他程序的运行结果,或进程已经执行完毕时。

进程1第一次执行,设置硬盘信息、格式化虚拟盘、加载根文件系统。

文件操作

操作系统对文件的一切操作,都可以分为两个方面:对super_block, d_super_block, m_inode, d_inode, i节点位图,逻辑块位图,这类文件管理信息的操作以及对文件数据内容的操作。新建,打开,关闭,删除文件属于对文件管理信息的操作。读文件,写文件和修改文件则主要是操作文件数据内容。

用户进程和内存管理

线性地址的保护->分页->进程调度->页写保护

缓冲区和多进程操作文件

不同进程之间共享缓冲区中的数据。
要想通过缓冲区的设计提高操作系统读写文件的整体效率,就应该尽可能多的共享缓冲区中的数据,而其最有效、最直接的方法就是让缓冲区中的数据在缓冲区中停留的时间尽可能的长。

进程间通信

Linux 0.11中不允许进程跨越边界去访问其他进程的代码、数据,这是操作系统保护模式的核心内容。而进程间往往需要协同工作、交互信息,因此Linux中设计了两套机制来提供服务:一套是“管道机制”, 另一套是“信号机制”。

管道机制

操作系统在内存中为每个管道开辟一页内存,给这一页内存赋予了文件的属性。这一页有两个进程共享,但不会分配给任何进程,只由内核掌控。每个管道允许两个进程交互数据,一个进程向管道中输入数据,一个进程从管道中输出数据。该机制实现了进程间通讯,同时又不需要非法跨越进程间边界。

信号机制

信号机制是Linux 0.11为进程提供的一套“局部的类中断机制”,即在进程执行的过程中,如果系统发现某个进程接收到了信号,就暂时打断进程的执行,转而去执行该进程的信号处理程序,处理完毕后,再从进程“被打断”之处继续执行。

参考:

《Linux 内核设计的艺术》

Coffee? ☕