-
什么是实模式,什么是保护模式?
实模式就是可以用基地址+偏移量就直接获得物理地址的模式;反之不能直接拿到物理地址、需要进行地址转换的模式就是保护模式
-
什么是选择子?
选择子存放在段寄存器中,高13位就相当于页式存储管理里面的页号一样,是段描述符表的索引(项数最多是2的13次方),第三位(索引为2)表示这个段描述符表是全局的还是局部的,然后到这个表的对应索引处取出基址,再加上偏移量就构成了物理地址;低两位表示请求特权级
-
什么是描述符?
实模式下,任意的内存地址都可以被访问、被读写,非常不安全;所以在保护模式下,需要描述一个段的基地址是多少,限长是多少,是什么类型的段(数据段、代码段、系统段),这样的结构就被称为段描述符
-
什么是GDT,什么是LDT?
GDT:全局描述符表,全局唯一,存放一些公用的描述符、包含各进程局部描述符表首地址的描述符
LDT:局部描述符表,每个进程都可以有一个,存放本进程使用的描述符
-
请分别说明GDTR和LDTR的结构
GDTR:48位寄存器,高32位放置GDT首地址,低16位放置GDT限长(决定了可寻址的大小)
LDTR:16位寄存器,放置一个特殊的选择子,用于查找当前进程的LDT首地址
-
请说明GDT直接查找物理地址的具体步骤
- 给出选择子(段寄存器内)+偏移量(?盲猜逻辑地址内 !对的,逻辑地址就是某个段内的偏移量)
- 若选择子的第2位TI为0,说明是采用的GDT方式
- 从GDTR中的高32位获得GDT的起始地址
- 用选择子内高13位做索引去查GDT表,获得对应的描述符
- 如果合法且有权限,描述符中的BYTE2、3、4、7构成段首地址,再加上给定的偏移量就是线性地址(和物理地址的关系看最后!!!)
-
请说明通过LDT查找物理地址的具体步骤
- 给出选择子(段寄存器内)+偏移量
- 若选择子的第2位TI为1,说明采用的是LDT方式
- 从GDTR中获得GDT的首地址,用LDTR中的偏移量做偏移,拿到GDT中的描述符1
- 从描述符1中获取LDT的首地址,用选择子中的13位做偏移,拿到LDT中的描述符2
- 如果合法且有权限,用描述符2中的段首地址加上偏移量就是线性地址
-
根目录区大小一定么?扇区号是多少?为什么?
- 不一定,得看Boot区的0x11处(BPB_RootEntCnt),表示根目录文件数的最大值;
- 开始扇区是19,占用的簇的数量为(BPB_RootEntCnt*32)/512,余数不为0还要加1,多占一个簇;
- 1(Boot)+9(FAT1)+9(FAT2)
-
数据区第一个簇号是多少?为什么?
- 2;
- FAT前3个字节固定0xF0、0xFF、0xFF,也就是序号为0、1的FAT表项固定,所以对应的簇就没有存在的意义了
-
FAT表的作用?
每个表项序号都是与簇号对应的;其中的值代表文件的下一个簇号,用来判断文件是否在FAT序号对应的簇下结束
-
解释静态连接的过程
在编译阶段直接把静态库加入到可执行文件中
假设hello.o文件里面调用了库函数printf,而printf函数在libc.a文件中,那么静态链接时直接将整个libc.a和hello.o都链接生成可执行程序
-
解释动态链接的过程
链接阶段仅仅只加入一些描述信息,程序执行时再从系统中把相应动态库加载到内存中
假设现在有两个程序program1.o和program2.o,这两者共用同一个库lib.o,假设首先运行程序program1,系统首先加载program1.o,当系统发现program1.o中用到了lib.o,即program1.o依赖于lib.o,那么系统接着加载lib.o,如果program1.o和lib.o还依赖于其他目标文件,则依次全部加载到内存中。当program2运行时,同样的加载program2.o,然后发现program2.o依赖于lib.o,但是此时lib.o已经存在于内存中,这个时候就不再进行重新加载,而是将内存中已经存在的lib.o映射到program2的虚拟地址空间中,从而进行链接(这个链接过程和静态链接类似)形成可执行程序。
-
静态连接相关PPT为什么使用ld链接而不是gcc
gcc默认是动态链接,需要通过ld来链接生成静态库
-
Linux下可执行文件的虚拟地址空间默认从哪里开始分配
???
-
BPB指定字段的含义
- 0x0B:每个扇区的字节数
- 0x0D:每个簇的扇区数
- 0x0E:引导区占用扇区数
- 0x10:FAT数量
- 0x11:根目录文件数最大值
- 0x13:扇区数
- 0x16:每一个FAT表的占用扇区数
-
如何进入子目录并输出(说明方法调用)
递归,以当前目录为“根目录”进行递归
-
如何获得指定文件的内容,即如何获得数据区的内容(比如使用指针等)
使用指针,ifstream的seekg和read方法来移动指针和获得从指定位置开始的指定大小的内容
-
如何进行C代码和汇编之间的参数传递和返回值传递
通过栈来传递,默认汇编中的参数存放在eax寄存器中
-
汇编代码中对I/O的处理方式,说明指定寄存器所存值的含义
- 输出
- 输入
-
改变流的颜色
逻辑地址、线性地址、物理地址、虚拟地址的区别与异同
逻辑地址=虚拟地址,是一个段内偏移量,通过GDT/LDT可以转换成一个线性地址
如果不采用分页方式的话,这个线性地址就是物理地址
如果采用,那么还需要转换成物理地址