1.单内核模式的系统中,操作系统所提供的服务流程为:
a.应用主程序使用指定的参数值执行系统调用指令(int x80)
b.CPU从用户态切换到内核态
c.操作系统根据具体的参数值调用特定的系统调用服务程序
d.这些服务程序根据需要再调用底层的一些支持函数以完成特定的功能。
e.完成了所要求的服务之后,操作系统又使CPU从内核态切回到用户态。
因此单内核模式的内核可粗略地分为三层:调用服务的主程序(软中断机制)、执行系统调用的服务层(中断服务程序)和支持系统调用的底层函数(底层驱动)。
2.linux内核主要由5个模块构成:进程调度模块、内存管理模块、文件系统模块、进程间通信模块和网络接口模块。
进程调度模块所采取的策略是各进程能公平合理地访问CPU,同时保证内核能及时执行硬件操作。
3.内存地址空间的概念:进程的虚拟和逻辑地址、CPU线性地址和实际物理内存地址。
虚拟地址:指由程序产生的由段选择符和段内偏移地址两个部分组成的地址。由于该地址需要借助分段地址变换机制来对应到物理内存地址上,因此称为虚拟地址。虚拟地址是由GDT映射的全局地址空间和由LDT映射的局部地址空间组成。段选择符的索引部分13比特,加上区分GDT和LDT的1个比特,共有2^14=16384个段选择符。因此共可寻址16384个段,若每个段长度为4G,那么最大虚拟地址范围是64T。
逻辑地址:指由程序员产生的与段相关的偏移地址部分。相当于虚拟地址中的段内偏移地址。也有书把两者统称为虚拟地址。
线性地址:是虚拟地址到物理地址变换之间的中间层,是处理器可寻址的内存空间(即线性地址空间)中的地址。段地址和段内偏移地址通过一定的计算方法可以得到一个线性地址,如果启动了分页机制,那么线性地址可以再经变换以产生一个物理地址;否则线性地址就是物理地址。
物理地址:是指在CPU外度地址线上寻址的物理内存地址信号,是地址变换的最终结果地址。
虚拟存储(或称虚拟内存)是指计算机呈现出要比实际拥有的内存大得多的内存量。0.11内核中每个进程都划分了总容量为64M的虚拟内存空间,因此程序的逻辑地址范围是0x00000000到0x400000000。他使用二级或者外部存储空间实现。当一个程序需要使用一块不存在的内存时,CPU就需要一种方法来得知这种情况(intel通过页错误异常中断来通知)。此时会把出错的线性地址放到CR2寄存器中。处理中断的过程就是把二级存储空间(如硬盘)上的内容加载到物理内存中。如果物理内存已经全部被占用,可以借助二级存储空间的一部分作为交换缓冲区(swapper)把内存中暂时不使用的页面交换到swapper中,然后把要求的页面调入内存。这个机制在mm/memory.c中实现。
4.内存的分段机制
实模式下,段长度固定为64KB,段地址放在段寄存器中(如ds),段内偏移地址放在寻址寄存器中(如si),段地址和段内偏移地址即可得到物理地址。
保护模式下,段寄存器中存放是段描述符表中某一描述符项在表中的索引值。他所制定的段描述符项中含有需要寻址的段基地址、段长度和段访问特权级别等信息。段基地址与一个段内偏移值组合成线性地址。
描述符表有三种类型:全局描述符表GDT、中断描述符表IDT和局部描述符表LDT。
GDT:是主要的基本描述符表,可被所有程序用语访问一个内存段。
IDT:保存有定义中断或者异常处理过程的段描述符。他直接代替了中断向量表。
LDT:用于多任务系统中,通常每个任务使用一个LDT表。
CPU分别设置GDTR、IDTR、LDTR三个特殊寄存器来存放三个描述符表的基地址。
每个程序都可以有若干个内存段组成,逻辑地址即用语寻址这些段和段内具体地址。GDT映射的地址空间称为全局地址空间,LDT映射的地址空间称为局部地址空间。这两者构成了虚拟地址的空间。
5.内存分页机制
使用分页机制最普通的场景是当系统内存实际上被分成很多凌乱的块时,它可以建立一个大而连续的内存空间映像。它增强了分段机制的性能。
分页机制基本原理:将CPU整个线性内存区域划分成4096字节为1页的内存页面。程序申请使用内存时,系统就以内存页为单位进行分配。80386使用了页目录表和页表,页目录表与页表格式基本相同,都只能包含1024个页表项,每个页表项占4个字节,刚好4096个字节(一页内存)。他们的差别在于一个D比特位不同。
线性地址被分成三部分:页目录表项、页表项和页内偏移地址。分别占32位地址的10比特、10比特和12比特。
由于线性地址到物理地址的映射关系是固定的,因此为了让所有内核和所有任务都互不重叠,他们都必须从虚拟地址空间映射到线性地址空间的不同位置。
分段机制 分页机制
虚拟地址--------------------------->线性地址---------------------------------->物理地址