汇编学习笔记

来源:互联网 发布:淘宝累积消量是多久的 编辑:程序博客网 时间:2024/06/07 06:47

1、8086的内存分配

8086可以访问1MB内存。其中高64K(F0000-FFFFF)是BIOS提供的,低640K(00000-9FFFF),中间的320K(A0000-EFFFF),是外设的。PC机默认进入80×25的文本模式,所以(B8000-BFFFF)是显卡文本模式的。


2、32位时的

16位时,把段基址写道对应的段寄存器中,这个段就算定义好了。

32位时,不但要告诉cpu段的基址,还有段的长度,这个段的访问权限。

因此,定义一个段,需要8个字节。不可能放到寄存器中了,需要放到内存中。多个段定义(即段描述符)连续存放,形成一个段描述符表,另外,需要一个寄存器指向这个段描述符表的首地址。

因此就有了GD,GDT,GDTR --全局描述符

一个GDTR 48位,低16位表示每个GD在GDT中的起始位置,高32位表示GDT的起始地址。因此,GDT表最长可以保存(2exp16)/ 8字节=8192个GD

GD每个位的含义,在《x86汇编语言-从实模式到保护模式》中讲的很细致。

应用程序的GD,是OS分配并填写到内存中的,所以应用程序只能访问自己的内存空间,无法访问别人的内存空间。


3、多任务需要新增LDT(本地描述符表)和TSS(任务状态段)

多任务,也就是多进程,不但可以运行多个程序,而且一个程序,还可以运行多个实例。多个实例的数据段肯定是需要独立的。

所以,每个任务要建立自己的LDT,而不能使用GDT。指向LDT的寄存器是LDTR,但是LDT是有多个的,每个任务都有一个LDT,所以LDTR指向的只是当前任务的LDT。任务切换时,操作系统要重新给LDTR赋值。

处理器要求在GDT中安装每个LDT的描述符. 当要使用这些LDT时, 可以用它们的选择子来访问GDT, 如果不这样, 处理器将没有机会来做存储器和特权级的保护工作.


每个任务的有很多状态信息需要保存,靠压栈是不行的,因为可能随时需要切换到任何一个任务。不像实模式的函数调用,有一定的次序,一定是栈顶的数据。

因此,需要增加TSS,每个任务一个TSS。TR(寄存器)指向当前的TSS,任务切换时,操作系统要重新给TR赋值。

和局部描述符表(LDT)一样, 也必须在GDT中安装TSS的描述符. 这样做, 一方面是为了对TSS进行段和特权级的检查; 另一方面, 也是执行任务切换的需要. 当call far和jmp far指令的操作数是TSS描述符选择子时, 处理器执行任务切换操作.


4、从程序员的角度来看, 任务的全局空间包含了操作系统的段, 是由别人开发的, 但是他可以调用这些段的代码, 或者获取这些段中的数据; 任务局部空间的内容是由程序员自己创建的. 通常, 任务会在自己的局部空间运行,当它需要操作系统提供的服务时, 转入全局空间执行.

0 0
原创粉丝点击