GDT/LDT、FAT、动/静态链接

  1. 什么是实模式,什么是保护模式?

    实模式就是可以用基地址+偏移量就直接获得物理地址的模式;反之不能直接拿到物理地址、需要进行地址转换的模式就是保护模式

  2. 什么是选择子?

    选择子存放在段寄存器中,高13位就相当于页式存储管理里面的页号一样,是段描述符表的索引(项数最多是2的13次方),第三位(索引为2)表示这个段描述符表是全局的还是局部的,然后到这个表的对应索引处取出基址,再加上偏移量就构成了物理地址;低两位表示请求特权级

  3. 什么是描述符?

    实模式下,任意的内存地址都可以被访问、被读写,非常不安全;所以在保护模式下,需要描述一个段的基地址是多少,限长是多少,是什么类型的段(数据段、代码段、系统段),这样的结构就被称为段描述符

  4. 什么是GDT,什么是LDT?

    GDT:全局描述符表,全局唯一,存放一些公用的描述符、包含各进程局部描述符表首地址的描述符

    LDT:局部描述符表,每个进程都可以有一个,存放本进程使用的描述符

  5. 请分别说明GDTR和LDTR的结构

    GDTR:48位寄存器,高32位放置GDT首地址,低16位放置GDT限长(决定了可寻址的大小)

    LDTR:16位寄存器,放置一个特殊的选择子,用于查找当前进程的LDT首地址

  6. 请说明GDT直接查找物理地址的具体步骤

    • 给出选择子(段寄存器内)+偏移量(?盲猜逻辑地址内 !对的,逻辑地址就是某个段内的偏移量
    • 若选择子的第2位TI为0,说明是采用的GDT方式
    • 从GDTR中的高32位获得GDT的起始地址
    • 用选择子内高13位做索引去查GDT表,获得对应的描述符
    • 如果合法且有权限,描述符中的BYTE2、3、4、7构成段首地址,再加上给定的偏移量就是线性地址(和物理地址的关系看最后!!!)
  7. 请说明通过LDT查找物理地址的具体步骤

    • 给出选择子(段寄存器内)+偏移量
    • 若选择子的第2位TI为1,说明采用的是LDT方式
    • 从GDTR中获得GDT的首地址,用LDTR中的偏移量做偏移,拿到GDT中的描述符1
    • 从描述符1中获取LDT的首地址,用选择子中的13位做偏移,拿到LDT中的描述符2
    • 如果合法且有权限,用描述符2中的段首地址加上偏移量就是线性地址
  8. 根目录区大小一定么?扇区号是多少?为什么?

    • 不一定,得看Boot区的0x11处(BPB_RootEntCnt),表示根目录文件数的最大值;
    • 开始扇区是19,占用的簇的数量为(BPB_RootEntCnt*32)/512,余数不为0还要加1,多占一个簇;
    • 1(Boot)+9(FAT1)+9(FAT2)
  9. 数据区第一个簇号是多少?为什么?

    • 2;
    • FAT前3个字节固定0xF0、0xFF、0xFF,也就是序号为0、1的FAT表项固定,所以对应的簇就没有存在的意义了
  10. FAT表的作用?

    每个表项序号都是与簇号对应的;其中的值代表文件的下一个簇号,用来判断文件是否在FAT序号对应的簇下结束

  11. 解释静态连接的过程

    在编译阶段直接把静态库加入到可执行文件中

    假设hello.o文件里面调用了库函数printf,而printf函数在libc.a文件中,那么静态链接时直接将整个libc.a和hello.o都链接生成可执行程序

  12. 解释动态链接的过程

    链接阶段仅仅只加入一些描述信息,程序执行时再从系统中把相应动态库加载到内存中

    假设现在有两个程序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的虚拟地址空间中,从而进行链接(这个链接过程和静态链接类似)形成可执行程序。

  13. 静态连接相关PPT为什么使用ld链接而不是gcc

    gcc默认是动态链接,需要通过ld来链接生成静态库

  14. Linux下可执行文件的虚拟地址空间默认从哪里开始分配

    ???

  15. BPB指定字段的含义

    • 0x0B:每个扇区的字节数
    • 0x0D:每个簇的扇区数
    • 0x0E:引导区占用扇区数
    • 0x10:FAT数量
    • 0x11:根目录文件数最大值
    • 0x13:扇区数
    • 0x16:每一个FAT表的占用扇区数
  16. 如何进入子目录并输出(说明方法调用)

    递归,以当前目录为“根目录”进行递归

  17. 如何获得指定文件的内容,即如何获得数据区的内容(比如使用指针等)

    使用指针,ifstream的seekg和read方法来移动指针和获得从指定位置开始的指定大小的内容

  18. 如何进行C代码和汇编之间的参数传递和返回值传递

    通过栈来传递,默认汇编中的参数存放在eax寄存器中

  19. 汇编代码中对I/O的处理方式,说明指定寄存器所存值的含义

    • 输出
    • 输入
    • 改变流的颜色

逻辑地址、线性地址、物理地址、虚拟地址的区别与异同

逻辑地址=虚拟地址,是一个段内偏移量,通过GDT/LDT可以转换成一个线性地址

如果不采用分页方式的话,这个线性地址就是物理地址

如果采用,那么还需要转换成物理地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值