操作系统第二次问答
PPT
1、什么是实模式,什么是保护模式
实模式就是用基址加偏移量就可以直接拿到物理地址的模式
- 缺点:实模式非常不安全
保护模式就是不能直接拿到物理地址的模式
- 需要进行地址转换
- 从80386开始,是现代操作系统的主要模式
2、什么是选择子
- 选择子共16位,放在段选择寄存器里
- 低2位表示请求特权级
- 第3位表示选择GDT方式还是LDT方式
- 高13位表示在描述符表中的偏移
3、什么是描述符
与 “被描述物” 相关联的一组数据或数据结构, 多是用来记录被描述物的 “属性”的,描述符由选择子确定。
4、什么是GDT,什么是LDT
- GDT:全局描述符表,是全局唯一的。存放一些公用的描述符和包含各进程局部描述符表首地址的描述符。
- LDT:局部描述符表,每个进程都可以有一个。存放本进程内使用的描述符。
5、请分别说明GDTR和LDTR的结构
- GDTR:48位寄存器,高32位放置GDT首地址,低16位放置GDT限长(限长决定了可寻址的大小,低16位放的不是选择子)
- LDTR:16位寄存器,放置一个特殊的选择子,用于查找当前进程的LDT首地址。
6、请说明GDT直接查找物理地址的具体步骤
- 给出段选择子(放在段选择寄存器里)+偏移量
- 若选择了GDT方式,则从GDTR获取GDT首地址,用段选择子中的13位做偏移,拿到GDT中的描述符
- 如果合法且有权限,用描述符中的段首地址加上第一步中的偏移量找到物理地址。寻址结束。
7、请说明通过LDT查找物理地址的具体步骤
- 给出段选择子(放在段选择寄存器中)+偏移量
- 若选择了LDT方式,则从GDTR获取GDT首地址,用LDTR中的偏移量做偏移,拿到GDT中的描述符1
- 从描述符1中获取LDT首地址,用段选择子中的13位做偏移,拿到LDT中的描述符2
- 如果合法且有权限,用描述符2中的段首地址加上第一步中的偏移量找到物理地址。寻址结束。
8、根目录区大小一定么?扇区号是多少?为什么?
不一定,根目录区由若干个目录条目组成,依赖BPB_RootEntCnt,根目录区文件最大数。 开始扇区号为19,第0个扇区为引导扇区,FAT1占据1-9扇区,FAT2占据10-18扇区
9、数据区第一个簇号是多少?为什么
2,数据区紧跟第二个FAT表
10、FAT表的作用?
用来记录文件所在位置的表格,专门用一块空间记录各个文件对于簇的使用情况
11、解释静态链接的过程
空间和地址的分配
每个.o文件都有自己的段属性,比如.text、.data等等这些,链接的第一步就是将这些段属性合并在一起。
符号解析与重定位
链接脚本
12、解释动态链接的过程
动态链接器自举
动态链接器本身也是一个不依赖其他共享对象的共享对象,需要完成自举。
装载共享对象
将可执行文件和链接器自身的符号合并成为全局符号表,开始寻找依赖对象。加载对象的过程可以看做图的遍历过程;新的共享对象加载进来后,其符号将合并入全局符号表;加载完毕后,全局符号表将包含进程动态链接所需全部符号。
重定位和初始化
链接器遍历可执行文件和共享对象的重定位表,将它们GOT/PLT中每个需要重定位的位置进行修正。完成重定位后,链接器执行.init段的代码,进行共享对象特有的初始化过程
转交控制权
完成所有工作,将控制权转交给程序的入口开始执行。
13、静态链接相关PPT中为什么使用ld链接而不是gcc
所谓的gcc叫做gcc工具链,这个工具链包括很多工具,其中用于链接的叫做ld。用 gcc链接时会根据选项不同调用用不同的工具,如果到了链接阶段就会调用ld这个工具,就是说gcc是工具的入口,实际上执行连接的还是ld。
14、linux下可执行文件的虚拟地址空间默认从哪里开始分配
实验
1、BPB指定字段含义
标识 | 偏移量 | 大小 | 说明 |
---|---|---|---|
0 | 3 | 跳转指令 | |
BS_OEMName | 3 | 8 | OME字符串 |
BPB_BytePerSec | 11 | 2 | 每扇区字节数 |
BPB_SecPerClus | 13 | 1 | 每簇占用扇区数 |
BPB_RsvdSecCnt | 14 | 2 | 保留扇区数即MBR所占扇区数 |
BPB_NumFATs | 16 | 1 | FAT表的记录数 |
BPB_RootEntCnt | 17 | 2 | 最大根目录文件数 |
BPB_TotSec16 | 19 | 2 | 逻辑扇区总数 |
BPB_Media | 21 | 1 | 媒体描述符 |
BPB_FATSz16 | 22 | 2 | 每个FAT占用的扇区数 |
BPB_SecPerTrk | 24 | 2 | 每个磁道扇区数 |
BPB_NumHeads | 26 | 2 | 磁头数 |
BPB_HiddSec | 28 | 4 | 隐藏扇区数 |
BPB_TotSec32 | 32 | 4 | 如果BPB_TotSec16为0,则使用次数扇区总数 |
2、如何进入子目录并输出(说明方法调用)
输出使用Node类,Node类内置vector用于存储下一级文件,以RootEntCnt的值进行遍历,每次读取一个Entry,若entry项Attr值为0x20则表明是文件项。建立子节点,子节点获得名称与路径,将子节点存入Node父节点类的vector里,同时父节点的文件计数加一,接着调用函数读取该文件的内容,若为目录项,建立子节点,子节点获得名称与路径,将子节点存入Node父节点的vector之后,需要额外将名称为.和..的新的子节点存入子节点的vector中,之后调用方法继续递归读取目录项。
输出时只需要遍历Node节点即可
3、如何获得指定文件的内容,即如何获得数据区的内容
首先传入当前文件的第一个簇号,定义当前簇号和暂时簇号两个变量,若暂时簇号小于0xFF8则循环,同时将暂时簇号赋值为下一个簇号,若为0xFF7则为坏簇,定义动态char数组,接着根据簇号从数据区读取数据,同时对指针赋值。
4、如何进行C代码和汇编之间的参数传递和返回值传递
传输的参数会放入栈中
5、汇编代码中对I/O的处理方式,说明指定寄存器所存值的含义
esp指向栈顶,首先传入字符串长度,压栈之后esp-4,接着传入字符串,压栈之后esp-8,由于需要使用ebp,因此对ebp进行压栈,此时esp-12,因此获得字符串时esp+8,获得长度时esp+12