Linux内核0.11体系结构——《Linux内核完全注释》笔记打卡0 总体介绍
⼀个完整的操作系统主要由4部分组成:硬件、操作系统内核、操作系统服务和⽤户应⽤程序,如图0.1所⽰。操作系统内核程序主要⽤于对硬件资源的抽象和访问调度。
图0.1 操作系统组成部分
内核的主要作⽤是为了与计算机硬件进⾏交互,实现对硬件部件的编程控制和接⼝操作,调度对硬件资源的访问,并为计算机上的⽤户程序提供⼀个⾼级的执⾏环境和对硬件的虚拟接⼝。
1 Linux内核模式
操作系统内核的结构模式主要可分为整体式的单内核模式和层次是的微内核模式。Linux 0.11采⽤了单内核模式。
如图1.2所⽰,单内核操作系统所提供的服务流程为:应⽤主程序使⽤指定的参数值执⾏系统调⽤指令(int x80),使CPU从⽤户态切换到核⼼态,然后操作系统根据具体的参数值调⽤特定的系统调⽤服务程序,这些服务程序根据需要再调⽤底层的⼀些⽀持函数以完成特定的功能。完成服务后,系统使CPU从核⼼态回到⽤户态,执⾏后续的指令。
图1.1 单内核模式的简单模型结构
2 Linux内核系统体系结构
Linux内核主要由5个模块构成,分别为:进程调度模块、内存管理模块、⽂件系统模块、进程间通信模块和⽹络接⼝模块。模块之间的依赖关系如图2.1所⽰,虚线部分表⽰0.11版本内核中未实现部分(所有的模块都与进程调度模块存在依赖关系)。
图2.1 Linux内核系统模块结构及相互依赖关系
从单内核模式结构模型出发,Linux 0.11内核源代码的结构将内核主要模块分配如图2.2所⽰。(除了硬件控制⽅框,其他粗线分别对应内核源代码的⽬录组织结构)
图2.2 内核结构框图
3 Linux内核对内存的管理和使⽤
对于机器中的物理内存,Linux 0.11内核中,系统初始化阶段将其划分的功能区域如图3.1所⽰。
图3.1 物理内存使⽤的功能分布图
虚拟地址:(virtual address)由程序产⽣的由段选择符合段内偏移地址两个部分组成的地址。(虚拟地址空间由GDT和LDT映射的地址空间组成,最⼤空间16384*4G=64T)
逻辑地址:(logical address)由程序产⽣的与段相关的偏移地址部分。(Intel保护模式下就是程序执⾏代码段限长内的便宜地址)
线性地址:(linear address)虚拟地址到物理地址变换之间的中间层,是处理器可寻址的内存空间中的地址。
物理地址:(physical address)出现在CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。
虚拟存储/虚拟内存:(virtual memory)指计算机呈现出要⽐实际拥有的内存⼤得多的内存量。
保护模式下,虚拟地址到物理地址的变换过程如图3.2所⽰。
图3.2 虚拟地址(逻辑地址)到物理地址的变换过程
内存分段机制:Intel CPU使⽤了段的概念对程序进⾏寻址。在保护模式下,段寄存器中存放的是⼀个段描述符表中某⼀描述符项在表中的索引值。(索引的段描述符项中有该段描述符选项中指定的段基地址、段长度和段的访问特权级等信息——GDT/IDT/LDT)
在Linux 0.11中,中断描述符表IDT保存在内核代码段中。程序逻辑地址到线性地址的变换过程使⽤了CPU的全局段描述符表GDT和局部段描述符表LDT。由GDT映射的地址空间称为全局地址空间,LDT映射的地址空间称为局部地址空间,两者共同构成了虚拟地址空间,如图3.3所⽰。图中显⽰了两个任务时的情况,每个LDT本⾝也是由GDT中描述定义的⼀个内存段,任务状态段TSS也是由GDT中描述符定义的⼀个内存段。(TSS⽤于在任务切换时CPU⾃动保存或恢复相关任务的当前CPU状态)
图3.3 Linux系统中虚拟地址空间分配图
内存分页管理:基本原理是将CPU整个线性内存区域划分成为4096字节为1页的内存页⾯。对于页⽬录和页表,格式基本相同,都占⽤4个字节,每个页⽬录表或页表必须只能包含1024个页表,⼀个页⽬录表或⼀个页表均占1页内存。图3.4为线性地址到物理地址的变换过程⽰意图。
图3.4 线性地址到物理地址的变换⽰意图
Linux 0.11内核设置GDT段描述符项数最⼤为256,2项空闲,2项系统使⽤,每个进程使⽤2项,最多再容纳126个任务,内核规定最⼤任务数64个,每个任务逻辑地址范围为64M。
图3.5 Linux 0.11 线性地址空间的使⽤⽰意图
对于Linux 0.11 内核代码和数据,初始化操作中,对其段长度都设置为16MB,都是从线性地址的0开始
到地址0xffffff共16MB的段。该范围中含有内核所有的代码、内核段表(GDT、IDT、TSS),页⽬录表和内核的⼆级页表、内核局部数据以及内核临时堆栈。(将被⽤作任务0的⽤户堆栈)内核的虚拟地址空间、线性地址空间和物理地址空间的关系如图3.6所⽰。
图3.6 内核代码和数据段在三种地址空间中的关系
linux完全安装Intel 80x86 cpu共分为4个保护级,Linux 0.11操作系统使⽤了cpu的0级和3级,内核代码本⾝由系统中
所有任务共享。当⼀个任务(进程)被中断程序中断时,此时⽤户程序也可以象征性的称为处于进程的内核态,因为中断程序使⽤当前进程的内核栈。多任务结构⽰意图如图3.7所⽰。
图3.7 多任务系统
任务0是系统中⼀个⼈⼯启动的第⼀个任务,代码段和数据段长度被设置为640KB(TSS0也是⼿⼯预设置好的,任务包含在内核代码中,不需要再为其分配内存页)。任务1也是⼀个特殊任务,系统创建任务1时,为存放任务1的⼆级页表在主内存区申请了⼀页内存来存放,并复制了⽗进程(任务0)的页⽬录和⼆级页表项,它占⽤的线性空间范围64MB-128MB(实际64MB-64MB+640KB)。对于创建的从任务2开始的其他任务,其⽗进程都是init(任务1)进程,从任务2开始,任务在线性地址空间中的起始位置为任务号*64MB,图3.8为任务2原先复制任务1的代码和数据被shell程序的代码段和数据段替换后的情况。
图3.8 其他任务地址空间中的对应关系
内核以页⾯为单位分配和映射物理内存,malloc()函数具体记录⽤户程序使⽤了⼀页内存的多少字节,剩余的容量保留给程序再申请内存时使⽤。当⽤户使⽤内存释放函数free()动态释放申请的内存块时,C库中的内存管理函数会把释放的内存块标记为空闲,在这个过程中内核为该进程分配的这个物理页⾯不
会被释放,只有进程结束时才全⾯回收已分配和映射到该进程地址空间范围的所有物理内存页⾯。
4 Linux系统的中断机制

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。