1,org XXX: 表示从CS:XXX的地方开始定位
如:
org 1000h
pg0:
org 2000h
pg1:
mov ds,[pg0+0x5] ;表示ds=[cs:1000h+0x5]
寻址的段对应:
存取方式 默认段 偏移地址 段超越
取指令 CS IP - - - - 对应指令:jmp,call,ret,iret,org,XX:
堆栈操作 SS SP - - - -
源串 DS SI CS,ES,SS
目的串 ES DI - - - -
BP SS (EA) CS,DS,ES
一般数据 BX DS (EA) CS,ES,SS 如:mov [1234h],0
2,call = push cs, push eip+x, jmp cs:eip (x为call指令长度+1)
ret = pop eip, pop cs, jmp cs:eip
int n = pushf, push cs, push ip+x, jmp [0x0:n<<2+2]:[0x0:n<<2]
iret = pop eip, pop cs, popf, jmp cs:eip
3,gdt基本址在gdr中,ldt表的基址是一个描述符,在gdt中,而ldr放在gdt中描述符的选择子.
新建进程时需要建ldt和tss并加入到gdt中,ldtr保存当前进程在gdt中的索引,切换进程只需
长跳到gdt中tss段描述符就行了.cpu会借助tr寄存器(原进程选择子)保存原进程状态.
1、RPL 选择子当中的权限位确定的权限
2、CPL 特指CS中的选择子当中的权限位确定的权限
3、EPL EPL=Max(RPL,CPL),即RPL和CPL中数值较大的,或说权限等级较小的
4、DPL 描述符中的权限位确定的权限
5、PL 泛指以上4种特权级
6、任务特权 =CPL
7、I/O特权 由EFLAGS寄存器的位13、14确定的权限
8、一致代码段 一种特殊的代码段,它在CPL>=DPL时允许访问
正常的代码段在CPL=DPL RPL<=DPL时才允许访问
4, 缓冲区就是不会被换出页的内存区
N, LINUX操作系统实现简要步骤(操作系统的本质就是提供一堆服务而避免每个程序重复劳动)
0,Boot(引导程序)被BIOS引导到0x7C00处并运行
1, 装入启动扇取和内核扇区.
2, 从BIOS取得硬件信息.存好供内核使用
3,进入保护模式步骤:
a,关中断
b,设置8259A PIC,屏蔽可屏蔽中断
c,加载idt到idtr,并让idt中每个描述符指向一个缺省门(中段处理)
d,加载gdt到gdtr
e,开分段,设置cr0的pe位(第1位)
f,设置各段寄存器(ds,es,ss,fs,gs)
g,设置页目录和页表并填充每一项
h,开分页,设置cr0的pg位(第31位)
4,可以跳到前面加载到内存的内核了.
5,分配和界定可用的内存
6,初始化内核各个模块
7,将自己移到任务段0中运行,再创建进程1.
8,进程1将进行应用环境初始化.并执行Shell登录程序
6,对分页的理解:首先理解一个概念,就是32位能寻址4GB,不一定直接去寻,所谓平坦其实被后却不平.
设想有个目录,里面放了1024个表的地址,每个表放了1024个页的地址.那么这32位线性地址就被分割
成三个索引了.
[高10位] [中10位] [低12位]
目录项索引 表项索引 页内索引
为什么这么分呢?原因很简单,目录和表的项是确定的,而每项的大小又是固定4BIT,所以只须知道是这1024
项中哪一个项就OK了.固正好用10位够寻1024项. 然而对页内的索引却不然,因为你无法得到每项数据或
指令确切大小(其实这只是个附属原因),页还能再分吗? 这样正好也寻址4GB,页目录的基址由CR3给出.
所以要训练自己对保护模式的理解.看到一个地址,第一个概念就是它被分为三段.
7,理解保护多任务的核心就是每个任务(进程)都有自己的页目录(其实就是拥有自己的整个4G内存),有自己的LDT,
有自己CPU寄存器.其实这些都是虚的.是TSS的数据结构保存了它们,再切换时恢复它们.
另外,多任务下全局或共享页面的状态如换出换入都是页表项中相应位改变,实质只是在改变数据结构.