Loading . . .

操作系统第二次问答


操作系统第二次问答

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直接查找物理地址的具体步骤

  1. 给出段选择子(放在段选择寄存器里)+偏移量
  2. 若选择了GDT方式,则从GDTR获取GDT首地址,用段选择子中的13位做偏移,拿到GDT中的描述符
  3. 如果合法且有权限,用描述符中的段首地址加上第一步中的偏移量找到物理地址。寻址结束。

7、请说明通过LDT查找物理地址的具体步骤

  1. 给出段选择子(放在段选择寄存器中)+偏移量
  2. 若选择了LDT方式,则从GDTR获取GDT首地址,用LDTR中的偏移量做偏移,拿到GDT中的描述符1
  3. 从描述符1中获取LDT首地址,用段选择子中的13位做偏移,拿到LDT中的描述符2
  4. 如果合法且有权限,用描述符2中的段首地址加上第一步中的偏移量找到物理地址。寻址结束。

8、根目录区大小一定么?扇区号是多少?为什么?

不一定,根目录区由若干个目录条目组成,依赖BPB_RootEntCnt,根目录区文件最大数。 开始扇区号为19,第0个扇区为引导扇区,FAT1占据1-9扇区,FAT2占据10-18扇区

9、数据区第一个簇号是多少?为什么

2,数据区紧跟第二个FAT表

10、FAT表的作用?

用来记录文件所在位置的表格,专门用一块空间记录各个文件对于簇的使用情况

11、解释静态链接的过程

  1. 空间和地址的分配

    每个.o文件都有自己的段属性,比如.text、.data等等这些,链接的第一步就是将这些段属性合并在一起。

  2. 符号解析与重定位

  3. 链接脚本

12、解释动态链接的过程

  1. 动态链接器自举

    动态链接器本身也是一个不依赖其他共享对象的共享对象,需要完成自举。

  2. 装载共享对象

    将可执行文件和链接器自身的符号合并成为全局符号表,开始寻找依赖对象。加载对象的过程可以看做图的遍历过程;新的共享对象加载进来后,其符号将合并入全局符号表;加载完毕后,全局符号表将包含进程动态链接所需全部符号。

  3. 重定位和初始化

    链接器遍历可执行文件和共享对象的重定位表,将它们GOT/PLT中每个需要重定位的位置进行修正。完成重定位后,链接器执行.init段的代码,进行共享对象特有的初始化过程

  4. 转交控制权

    完成所有工作,将控制权转交给程序的入口开始执行。

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


文章作者: Lhtian
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Lhtian !
  目录