第七章汇编.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七章汇编

7.4 加载用户程序并创建任务 任务状态段TSS 由于处理器最多可以访问65536个硬件端口,I/O许可位串最多有65536个bit,即8KB。 I/O许可位串中每个比特的取值决定了相应端口是否允许访问,为1时,禁止访问;为0时,允许访问。 如处理器执行out 0x09, al时,处理器将检测I/O许可位串中的第0x09个比特,即第2个字节的第1位。 I/O端口是按字节编址的,所以当执行in ax, 0x3f8时,需要检测I/O许可位串中的第0x3f8和0x3f9两个比特,当它们都为0时,允许访问,否则引发异常中断。 7.4 加载用户程序并创建任务 任务状态段TSS 连续两个许可位可能是跨字节的,为此处理器每次都要从I/O许可位串中读两个连续的字节。但这样可能导致一个问题,即,要检查的比特在最后一个字节中,两个字节的读操作可能越界,为防止这种情况发生,处理器要求I/O许可位映射区的最后必须附加一个额外的字节,并要求它的所有比特都为1,即0xFF。 7.4 加载用户程序并创建任务 任务状态段TSS EFLAGS寄存器的压栈与出栈指令 EFLAGS寄存器中的IOPL位控制任务的I/O特权来说是很重要的,通常IOPL位由内核或者操作系统根据任务的实际需要进行初始化。尽管不存在对EFLAGS寄存器整体写入或读出的指令,但存在标志寄存器入栈和出栈的指令,通过标志寄存器入栈和出栈的指令可以间接修改标志寄存器EFLAGS的各位。 pushf/pushfd popf/popfd 7.4 加载用户程序并创建任务 任务状态段TSS EFLAGS寄存器的压栈与出栈指令 [bit 16] pushf ;编译后是9C,16位操作 pushfd ;编译后是66 9C,32位操作 [bit 32] pushf ;编译后是9C,32位操作 pushfd ;编译后是9C,32位操作 32位模式下,pushf和pushfd是相同的,上述情况,同样适用于popf和popfd。 7.4 加载用户程序并创建任务 任务状态段TSS EFLAGS寄存器的压栈与出栈指令 能够修改EFLAGS寄存器的指令是popf、iret、cli和sti。 如果当前特权级CPL高于,或者和当前I/O特权级IOPL相同,即 CPL≤IOPL 则允许执行以上4条指令,也允许访问所有的硬件端口。否则,执行popf和iret时,会引发处理器异常中断;执行cli和sti时,不会引发异常中断,但不改变标志寄存器的IF位。同时,是否能访问特定的I/O端口,要参考TSS中的I/O许可位映射串。 7.4 加载用户程序并创建任务 创建任务状态段TSS(esi指向TCB) mov ecx,104 ;tss的基本尺寸 mov [es:esi+0x12],cx dec word [es:esi+0x12] ;登记TSS界限值到TCB call sys_routine_seg_sel:allocate_memory mov [es:esi+0x14],ecx ;登记TSS基地址到TCB ;登记基本的TSS表格内容 mov word [es:ecx+0],0 ;反向链=0 mov edx,[es:esi+0x24] ;登记0特权级堆栈初始ESP mov [es:ecx+4],edx ;到TSS中 mov dx,[es:esi+0x22] ;登记0特权级堆栈段选择子 mov [es:ecx+8],dx ;到TSS中 mov edx,[es:esi+0x32] ;登记1特权级堆栈初始ESP mov [es:ecx+12],edx ;到TSS中 7.4 加载用户程序并创建任务 创建任务状态段TSS mov dx,[es:esi+0x30] ;登记1特权级堆栈段选择子 mov [es:ecx+16],dx ;到TSS中 mov edx,[es:esi+0x40] ;登记2特权级堆栈初始ESP mov [es:ecx+20],edx ;到TSS中 mov dx,[es:esi+0x3e] ;登记2特权级堆栈段选择子 mov [es:ecx+24],dx ;到TSS中 mov dx,[es:esi+0x10] ;登记

文档评论(0)

wyjy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档