LINUX000之旅

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

LINUX0.00之旅g002499182020/5/7目录LINUX0.00与80x861分段与分页机制2中断和异常处理34实时与保护模式5LINUX0.00分析和调试62020/5/7任务管理1。LINUX0.00与80x862020/5/7简介1。LINUX0.00与80x86这里的Linux-0.00由LinusTorvalds写的Linux最初版本,两个进程task0,task1,task0打印A,task1打印B,在时钟中断驱动下以最简单的轮询规则调度进程运行。据说后来linus丢失了这个最初的版本,这里参考赵炯博士写的linux-0.00版本(详见《Linux内核完全剖析--基于0.12内核》),。LINUX0.00与80x86理解CPU架构是理解操作系统低层的关键。本PPT的大部分篇幅都在讲解80x86的基础知识,包括保护模式内存管理,各种保护措施,中断和异常处理,任务管理,保护模式编程初始化。Linux0.00使用了CPU提供的分段管理和任务管理功能,没有使用分页机制。但若能彻低理解Linux0.00的动作机制,对于后续Linux的学习,将不会有大的困难。在学习最新版本的Linux内核代码时将会有拨云见日的感觉。2020/5/71。LINUX0.00与80x862020/5/780x86系统寄存器1。LINUX0.00与80x8680x86系统寄存器:EFLAGSGDTRLDTRIDTRTRCR0~CR32020/5/71。LINUX0.00与80x86EFLAGS:含有IOPL,是否屏蔽硬件中断,任务切换,进位,奇偶溢出等通用标志2020/5/71。LINUX0.00与80x86内存管理寄存器:GDTR,LDTR,IDTR,TR2020/5/71。LINUX0.00与80x86控制寄存器:CR0~CR32020/5/72。分段与分页机制1.内存寻址与地址变换2.LDTGDT3.分页机制公司LOGO2020/5/72.2LDT与GDT每个程序都有自己的LDT,但是同一台计算机上的所有程序共享一个GDT。LDT描述局部于每个程序的段,包括其代码、数据、堆栈等。GDT描述系统段,包括操作系统本身。公司LOGO2020/5/72.2LDT与GDT全局描述符表GDT(GlobalDescriptorTable)在整个系统中,全局描述符表GDT只有一张(一个处理器对应一个GDT),GDT可以被放在内存的任何位置,但CPU必须知道GDT的入口,也就是基地址放在哪里,Intel的设计者门提供了一个寄存器GDTR用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT的入口地址装入此积存器,从此以后,CPU就根据此寄存器中的内容作为GDT的入口来访问GDT了。GDTR中存放的是GDT在内存中的基地址和其表长界限。公司LOGO2020/5/72.2LDT与GDT局部描述符表LDT(LocalDescriptorTable)局部描述符表可以有若干张,每个任务可以有一张。我们可以这样理解GDT和LDT:GDT为一级描述符表,LDT为二级描述符表。公司LOGO2020/5/72.2LDT与GDT段选择子(Selector)由GDTR访问全局描述符表是通过“段选择子”(实模式下的段寄存器)来完成的。为了访问一个段,一个Pentium程序必须把这个段的选择子装入机器的6个段寄存器的某一个中。在运行过程中,CS寄存器保存代码段的选择子,DS寄存器保存数据段的选择子。每个选择子是一个16位数。选择子中的一位指出这个段是局部的还是全局的(它是在LDT中还是在GDT中),其他的13位索引是LDT或GDT的表项编号,表示所需要的段的描述符在描述符表的位置,由这个位置再根据在GDTR中存储的描述符表基址就可以找到相应的描述符,然后用描述符表中的段基址加上逻辑地址(SEL:OFFSET)的OFFSET就可以转换成线性地址。因此,这些表的长度被限制在最多容纳8K个段描述符。公司LOGO2020/5/72.2LDT与GDT段选择子中的TI值只有一位0或1,0代表选择子是在GDT选择,1代表选择子是在LDT选择。请求特权级(RPL)则代表选择子的特权级,共有4个特权级(0级、1级、2级、3级)。任务中的每一个段都有一个特定的级别。每当一个程序试图访问某一个段时,就将该程序所拥有的特权级与要访问的特权级进行比较,以决定能否访问该段。系统约定,CPU只能访问同一特权级或级别较低特权级的段。例如给出逻辑地址:21h:12345678h转换为线性地址a.选择子SEL=21h=0000000000100001b他代表的意思是:选择子的index=4即100b选择GDT中的第4个描述符;TI=0代表选择子是在GDT选择;左后的01b代表特权级RPL=1b.OFFSET=12345678h若此时GDT第四个描述符中描述的段基址(Base)为11111111h,则线性地址=11111111h+12345678h=23456789h公司LOGO2020/5/73.1中断与异常处理公司LOGO2020/5/7中断描述符表(InterruptDescriptorTable,IDT)将每个异常或中断向量分别与它们的处理过程联系起来。与GDT和LDT表类似,IDT也是由8字节长描述符组成的一个数组。与GDT不同的是,表中第1项可以包含描述符。为了构成IDT表中的一个索引值,处理器把异常或中断的向量号乘以8。因为最多只有256个中断或异常向量,所以IDT无需包含多于256个描述符。IDT中可以含有少于256个描述符,因为只有可能发生的异常或中断才需要描述符。不过IDT中所有空描述符项应该设置其存在位(标志)为0。IDT表可以驻留在线性地址空间的任何地方,处理器使用IDTR寄存器来定位IDT表的位置。这个寄存器中含有IDT表32位的基地址和16位的长度(限长)值,如图4-26所示。IDT表基地址应该对齐在8字节边界上以提高处理器的访问效率。限长值是以字节为单位的IDT表的长度。LIDT和SIDT指令分别用于加载和保存IDTR寄存器的内容。LIDT指令用于把内存中的限长值和基地址操作数加载到IDTR寄存器中。该指令仅能由当前特权级CPL是0的代码执行,通常被用于创建IDT时的操作系统初始化代码中。SIDT指令用于把IDTR中的基地址和限长内容复制到内存中。该指令可在任何特权级上执行。3.1中断与异常处理公司LOGO2020/5/7在实地址模式中,CPU把内存中从0开始的1K字节作为一个中断向量表。表中的每个表项占四个字节,由两个字节的段地址和两个字节的偏移量组成,这样构成的地址便是相应中断处理程序的入口地址。在保护模式下,中断向量表中的表项由8个字节组成,中断向量表也改叫做中断描述符表IDT。其中的每个表项叫做一个门描述符(gatedescriptor),“门”的含义是当中断发生时必须先通过这些门,然后才能进入相应的处理程序。3.1中断与异常处理公司LOGO2020/5/7主要门描述符是:·中断门(Interruptgate)其类型码为110,中断门包含了一个中断或异常处理程序所在段的选择符和段内偏移量。当控制权通过中断门进入中断处理程序时,处理器清IF标志,即关中断,以避免嵌套中断的发生。中断门中的DPL(DescriptorPrivilegeLevel)为0,因此,用户态的进程不能访问Intel的中断门。所有的中断处理程序都由中断门激活,并全部限制在内核态。·陷阱门(Trapgate)其类型码为111,与中断门类似,其唯一的区别是,控制权通过陷阱门进入处理程序时维持IF标志位不变,也就是说,不关中断。·系统门(Systemgate)这是Linux内核特别设置的,用来让用户态的进程访问Intel的陷阱门,因此,门描述符的DPL为3。通过系统门来激活4个Linux异常处理程序,它们的向量是3、4、5及128,也就是说,在用户态下,可以使用int3、into、bound及int0x80四条汇编指令。最后,在保护模式下,中断描述符表在内存的位置不再限于从地址0开始的地方,而是可以放在内存的任何地方。为此,CPU中增设了一个中断描述符表寄存器IDTR,用来存放中断描述符表在内存的起始地址。中断描述符表寄存器IDTR是一个48位的寄存器,其低16位保存中断描述符表的大小,高32位保存IDT的基址.4.1任务管理------处理器对多任务的支持公司LOGO2020/5/7任务(TASK)是处理器可以分配,调度,执行和挂起的一个工作单元。它可用于执行程序,任务或进程,操作系统服务,中断或异常处理过程和内核代码。80x86提供了一种机制,这种机制可以用来保存任务的状态,分派任务执行以及从一个任务切换到另一个任务。当工作在保护模式下,处理器所有运行都在任务中。即使是最简单系统也必须至少定义一个任务。更为复杂的系统可以使用处理器的任务管理功能来支持多任务应用。80x86提供了多任务的硬件支持。任务是一个正在运行的程序,或者是一个等待准备运行的程序。通过中断,异常,跳转或调用,我们可以执行一个任务当这些控制转移形式之一和某个描述符表中的指定项的内容一起使用时,那么这个描述符就是一类导致新任务开始执行的描述符。描述表中与任务相关的描述符有两类:任务状态段描述符和任务门。当执行权传给这任务一类描述符时,都会造成任务切换。任务切换很像过程调用,但会保存更多的处理器状态信息。任务切换会把控制权完全转到一个新的执行环境,即新任务的执行环境。这种转移操作几乎要求保存处理器中所有的寄存器的当前内容,名手标志寄存器EFLAGS和所有段寄存器。与过程不同,任务不可重入。任务切换不会把任何信息压入堆栈,处理器的状态信息都被保存在内存中称为任务状态段(TaskStateSegment)的数据结构中。4.1任务管理------任务的结构和状态公司LOGO2020/5/7一个任务由两部分组成:任务执行空间和TSS。任务执行空间包括代码段,堆栈段和一个或多个数据段。如果操作系统使用了处理器的特权保护机制,那么任务执行空间就需要为每个特权级提供一个独立的堆栈空间。TSS指定了构成任务执行空间的各个段,并且为任务状态信息提供存储空间。在多任务环境中,TDD也为任务之间的切换提供了处理方法。一个任务的使用由指向其TSS的段选择符来指定。当一个任务被加载进处理器中执行时,那么该任务的选择符,基地址,段限长以及TSS段描述符属性就会被加载进任务寄存器TR中,如果使用了分布机制,那任务使用的页目录表基地址就会被加载进控制寄存器CR3中。当前执行任务的状态由处理器的以下内容组成:所有通用寄存器和段寄存器标志寄存器EFLAGS,程序指针EIP,控制寄存器CR3,任务寄存器TR和LDTR寄存器段寄存器指向的任务当前执行空间I/O映射位图基地址和I/O位置信息(在TSS中)特权级0,1,2的堆栈指针(在TSS中)链接至前一个任务的指针(在TSS中)4.1任务管理------任务执行公司LOGO2020/5/7软件或处理器可以使用以下方法之一来调度执行一个任务当前任务对GDT中的TSS描述符执行JMP或CALL指令当前任务对GDT或LDT中的任务描述门执行JMP或CALL指令中断或者异常向量指向IDT表中的任务门描述符当EFLAGS中的NT标志置位时当前任务执行IRET指令例#1.ljmp$task_selector,$0#2.lcall$task_selector,$0#3.int0x80#4.iret#int0x80必须跳转到任务门#iret必须将NT设置为1所有这些高度任务的方法都会使用一个指向任务门或任务TSS段的选择符来确定一个任务。当使用CALL或JMP指令调度一个任务时指令中选择符即可以选择任务的TSS也可以择选存放有TSS选择符的任务门。当调度一个任务来处理一

1 / 32
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功