汇编学习笔记
来源:互联网 发布:淘宝累积消量是多久的 编辑:程序博客网 时间: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、从程序员的角度来看, 任务的全局空间包含了操作系统的段, 是由别人开发的, 但是他可以调用这些段的代码, 或者获取这些段中的数据; 任务局部空间的内容是由程序员自己创建的. 通常, 任务会在自己的局部空间运行,当它需要操作系统提供的服务时, 转入全局空间执行.
- 破解/汇编学习笔记
- 汇编学习笔记(一)
- 汇编学习笔记(1)
- 汇编学习笔记~1
- 汇编学习笔记
- 汇编学习笔记
- ARM汇编学习笔记
- 汇编学习笔记
- 汇编学习笔记 (1)
- windows汇编学习笔记
- 汇编学习笔记【1】
- 汇编学习笔记【2】
- 汇编学习笔记【3】
- 汇编学习笔记1
- 汇编学习笔记1
- 汇编学习笔记一
- ARM汇编学习笔记
- 汇编学习笔记
- Java HttpClient 网络爬虫怎么使用
- uva 10491 概率
- HDU 4850 Wow! Such String! 欧拉回路
- Android使用procrank和dumpsys meminfo分析内存占用情况
- 隐私保护——笔记
- 汇编学习笔记
- hdu(5495)——LCS
- 天地图专题三:根据标注点的范围确定天地图的中心点和缩放级别
- UIKit学习笔记1
- AntTweakBar with OpenGL
- hdu 5131(2014 广州—模拟)
- 使用Spring配置事务时遇到的问题
- 设计模式之ChainOfResponsibility:过滤Request和Response
- UI 动画之CALayer+CAAnimation 之 CAKeyframeAnimation