Intel体系结构


计算机两大体系统结构:冯诺依曼结构和哈佛结构
操作系统作用:1,对用户提供接口(API接口和终端接口(shell或GUI));2,管理计算器各种资源(进程管理,内存管理,文件管理,IO设备管理等)
Intel的体系结构:
特权级:目标是实现保护,有0-3四个特权级
             规范:低特权级任务不能调用高特权程序,也不能访问高特权级数据
            与特权级相关的概念:DPL,CPL,RPL,EPL,IOPL
DPL是段描述符的域,值是0-3,表示为访问该段所需的CPL最小优先级,例如一个段的DPL是0,那么只有CPL是0的时才能访问。
RPL是段选择子的域(Requested Privilege Level): 请求特权级 ,值是0-3,表示CPU的当前特权级。
段描述符:
根据段描述符中的系统标志(S)位可将段分为系统段和用户段
系统段根据段描述符的类型标识位分为:LDT,TSS,调用门,中断门,陷阱门,任务门
用户段同样可分为:代码段,数据段,堆栈段

每个段都有对应的段描述符,为了方便段描述符的管理和查找,intel体系结构要求将这些描述符组织到一起形成描述符表,一个描述符表最多有8192表记录,每个描述符8字符,所以最大是64k,intel体系结构将描述符表分为全局描述符表(GDT)和LDT

GDT: 有且只能有一个,它不是一个段,故不需要对应的描述符,它是通过GDTR寄存器存放GDT的基地址来访问全局描述表中相应的描述符。
         GDT可以存放的描述符有:代码段,数据段,TSS,LDT,调用门,任务门。中断门和陷阱门不能出现在GDT
LDT: 它是一个段,它相应的描述符存放在GDT中。LDTR寄存器存放当前任务的LDT表的基址。

段选择子:
是用来选择描述符表的索引,它存放在段寄存器中(CS,DS,SS等)。逻辑地址=段选择子+偏移量,线性地址=段基址+偏移量
段基址是一个描述符的一部分,而描述符可以通过段选择子来索引到。

任务状态段:
任务由执行空间和状态段两部分构成。任务执行空间由代码段,数据段,堆栈段组成,它们的描述符在GDT或LDT。任务状态段是描述任务的状态,里面存放当前任务的所有寄存器的值,唯一的LDT的描述符及LDT描述符的段选择子等,这个LDT存放当前任务的代码段描述符,数据段描述符,堆栈段描述符。
TSS的描述符选择子有专用的寄存器TR.
任务切换时,先装入任务选择子到TR,再将TSS中的寄存器信息装入各寄存器,开始执行新任务。

中断分为外中断和内中断,由cpu内部产生的中断为内中断,由cpu外部产生的中断为外中断,
内中断可分为异常和软中断,其中像除数为0,单步中断,Int0指令为异常 ;int指令 为软中断
外中断分为可屏蔽中断和不可屏蔽中断。 
当中断发生时,cpu会收到一个中断类型码(0-255),接下来的中断过程全由cpu硬件自动完成:保存当前cs,ip寄存器的值,保存状态寄存器的值,通过中断类型码到中断向量表得到中断向量(中断处理程序入口地址),将cs,ip设置为中断处理程序入口地址。自定义中断处理程序的最后一行指令必须 是iret, 它会从栈上取出中断前保存的cs,ip值重新设置到cs,ip的寄存器中。

单步中断:类型码为1,处理过程是:当调用int 1时,会将状态寄存器的TF位设置为1,然后转去执行中断处理程序,处理程序会将所有寄存器内容显示出来,然后再等待输入命令。 note:所以每次中断来时,cpu都会将TF,IF位置0,因为TF为1时,有会产生单步中断进而引发死循坏。

cpu只能从三个地方读写数据:寄存器,内存,端口。
内存和端口的读写一致机制一样,往地址总线发送地址,再往控制总线发送是要读还是写的控制指令,最后从数据总线上往目标地址进行读或写。端口的读数据时,先发送读指令,如果外设将数据准备好放在数据端口,会发送外中断通知cpu来读端口数据。

磁盘IO有两种方式读:一种是直接使用In,out指令,out设置要读的扇区号,然后使用in循环检测状态端口的数据有没有准备后,然后再用in指令读取数据端口。另一种方式是使用bios提供的int 13中断子程序

中断和异常:
中断分为硬中断和软中断,硬中断来自外围设备,软中断通过int n指令产生;异常来自处理器执行指令时检测到错误抛出异常。
当发生中断或异常,它们都会转到中断或异常的处理程序去执行。
处理器给每个中断和异常一个标识号(中断向量),其中0-31的中断向量固定给了异常和不可屏蔽中断(NMI)。
IDT是中断描述符表,它一共有256个,描述每个中断向量的中断处理程序段的相关信息,IDT不是一个段,所以没有IDT的描述符,它的基地址存放在IDTR中,它也没有段选择子,它是通过中断向量号来索引到相应的IDT项。
IDT中只能存放中断门,陷阱门,任务门三种门描述符。

门描述符:
门描述符共有四种:调用门,任务门,中断门,陷阱门。它的作用:设计出段是为了很好的封装保护,门就是通过封装的一道门户。操作系统将自己想公开的程序建成门,应用程序可以通过门来调用操作系统的过程。
门描述符描述的是段选择子和目标代码的偏移量及权限控制,这个段选择子是想要调用的目标代码程序的GDT或LDT的索引。
调用门是进入代码段中某些特殊过程的门户。通过CALL/JMP指令调用相应的调用门选择子触发。
中断门和陷阱门是进入中断或异常处理程序的入口。
任务门是进入任务的一道门户。它的描述符主要描述了相应TSS的选择子。通过CALL/JMP指令调用相应的任务门选择子触发。

分页:
段可以再进一步划分为页,页的大小是固定的。Intel体系结构按页目录和页表两级结构组织一个任务的页。
一页的大小是4K, 一个页目录项为4字节,一个页目录是1024个,页表项同理也是1024个,所以一个任务的线性址空间是1024 *  1024 * 4K 即4G.
线性地址=页目录索引(10bit)+页表索引(10bit)+偏移量(12bit)
页目录的物理基址存放在CR3中,CR3存放在TSS中的某个域中。 页目录项存放对应页表基址的物理地址,页表项存放对应页框基址的物理地址。
物理地址:通过CR3获得页目录的物理基址,通过线性地址的 页目录索引找到页目录项,通过项目录项找到项表基址,再通过线性地址的页表索引找到项表项,通过项表项中的地址找到相应的页,再通过线性地址中的偏移量索引到该页的内容即为线性地址对应的物理地址。

寄存器:
通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP
标志寄存器:EFLAGS
段寄存器:CS,DS,SS,ES,FS,GS
管理寄存器:GDTR,IDTR 主要存放描述符表的32位线性基地址。
                   LDTR,TR 主要存放选择子。
控制寄存器:CR0~CR4, 其中CR3,也叫页目录基址寄存器(PDBR),主要存放页目录的物理基地址。
指令寄存器:EIP

TSS是一个段,用来描述一个任务,一个任务包括(代码段,数据段,堆栈段)和各寄存器,TSS即然为一个段,也就需要相应的TSS段描述符,它是系统段,所以放在GDT中,相应的需要段选择子TR.
IDT(256个)和GDT(1024个)它们的描述符数量都是固定的,所以它们都不是段,它们的基地址分别存在IDTR和GDTR中,LDT的描述符数量是动态的,所以是一个段,它的描述符在GDT中。
TR,LDTR存放选择子,GDTR,IDTR存放基地址。
门描述符是用来描述中断或异常的过程或任务
CR3的某个域用来存储页目录的物理基地址。

elf编译规范,要求用户程序的虚拟起始地址是0x8000000,
linux下GDT从第2个索引开始定义了四个描述符,KS_CODE,KS_DATA,US_CODE,US_DATA,因为在linux没有使用Intel的段管理机制,但为了支持或者绕过Intel的段式管理机制,把所有的描述符的段基址都设置为0,
不同的用户程序它的选择子都指向US_CODE描述符,该描述符有意义的只有类型和访问权限信息,但访问权限的检查在页式管理也会进行,所以段式管理的权限检查也可以不要,这样的话逻辑地址转线性地址后没有任何变化。

每次有进程切换时都会改变CR3,里面存有页目录物理基址,CR3会被MMU使用,它会直接访问内存的物理地址
Linux不使用LDT

GDTR存放虚拟地址



对于一致代码段:也就是共享的段.
1.特权级高的程序不允许访问特权级低的数据:核心态不允许调用用户态的数据.
2.特权级低的程序可以访问到特权级高的数据.但是特权级不会改变:用户态还是用户态.

对于普通代码段.也就是非一致代码段:
0.只允许同级间访问.
1.绝对禁止不同级访问:核心态不用用户态.用户态也不使用核心态.


  但将BIOS这段程序放在1M内存的顶部,如果这段程序大小为1K,那么应当从0xFFC00开始放。如果这段程序的大小为2K,那 么应当从0xFF800开始放,对于CPU而言,到底是应当从0xFFC00开始执行还是应当从0xFF800开始执行呢?为了解决这个问题,8086规 定,CPU均从0xFFFF0处开始执行,而在0xFFFF0处,放一条无条件转移指令JMP。如果A厂的BIOS是从0xFFC00开始放的,那么这条 转移指令就跳转到0xFFC00处开始执行。如果B厂的BIOS是从0xFF800开始放的,那么这条转移指令就跳转到0xFF800处开始执行,各个厂 家可以跟据自己所生产的BIOS程序的大小,来决定此转移指令具体跳转到的位置。




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值