• 0.00-050613_ZC_Chapter4_20151230


    1、

    32位 保护模式 段选择符 --> 段描述符(段描述符表) --> 段基地址

                + 偏移量

               ==> 线性地址(ZC: 这个地址就是段的开始地址)

    1.2、

    段限长字段LIMIT(Segment limit field)

      ... ... 。如果 G=0,则段长度Limit范围可从 1字节到1MB字节,单位是字节。如果G=1,则段长度Limit范围可从 4KB到4GB,单位是4KB。

      ZC: 也就是说:

        ZC: (1)、G=0时,Limit=0 --> 1字节; ... ...; Limit=0x0FFFFF --> 1MB。1048576个项正好一一对应。

        ZC: 1048576 = 1024*1024 = 0x100000=1M。

        ZC: (2)、G=1时,Limit=0 --> 4KB; ... ...; Limit=0x0FFFFF --> 4GB。1048576个项正好一一对应。

        ZC: 4*1024*1024*1024=4G; (4*1024*1024*1024)/(4*1024)=1024*1024。

    段描述符 中 颗粒度标识G(Granularity)[该标志不影响段基地址的颗粒度,基地址的颗粒度总是字节单位]

        为 0   --> 段限长值的 单位是字节。

        不为0 --> 段限长值使用 4KB单位。[此时 当使用段限长来检查偏移值时,并不会去检查偏移值的 12位最低有效位。例如,当 G=1时,段限长为0 表明有效偏移值为 0到4095。]

        ZC: 这里 之前不明白,后来想了一下,大概明白了:当 G=1时,段限长值的单位是4KB,段限长为0的话 段的长度就是4KB,∴ 偏移值的高20位就只能是全0 低12位不检查,∴ 低12位 的范围就是 0到4095(4K-1),于是 整个偏移值的范围也就是 0到4095 。

    1.3、

    “而全局显示数据段被设置成:基地址为 0xB8000;段限长为 0x0002,所以实际段长度为 8KB,对应到显示内存区域上。”

    ZC: 这里的“显示数据段”和“显示内存区域”,应该指的就是 用于显示 字符A 和 字符B 的 数据段 和 内存区域。

    ZC: 这里我有理解错误(20151230),我将 段长度(段限长) 和 偏移量范围 搞混了。

    2、

    帖子:http://bbs.csdn.net/topics/391884878

    http://edu.csdn.net/course/detail/1340

    3、(下面的这段,字体是宋体,字体大小15px)

    0x00c09a00000007ff ==> 0000 0000,1100 0000,1001 1010,0000 0000 | 0000 0000,0000 0000,0000 0111,1111 1111

    0x00c09200000007ff ==> 0000 0000,1100 0000,1001 0010,0000 0000 | 0000 0000,0000 0000,0000 0111,1111 1111

    0x00c0920b80000002 ==> 0000 0000,1100 0000,1001 0010,0000 1011 | 1000 0000,0000 0000,0000 0000,0000 0010

    段限长 分别为:0x7ff / 0x7ff / 0x02

    基地址 分别为:0x00 / 0x00 / 0xb8000

    3.1、

    lss指令 ==> 加载堆栈段      lds、les 可类推

    3.2、

    章节“4.6.1 异常和中断向量”里面提到 NMI:“NMI中断分配的向量”、“NMI中断源”,NMI 是什么??

      NMI(非屏蔽中断请求) ??

    章节“4.6.2.1 中断源”中提到,“当引脚 NMI 接收到信号时,就产生一个非屏蔽中断。它使用固定的中断向量号 2。”

    3.3、

    章节“4.6.8 IDT描述符”中,“任务门描述符中含有一个任务TSS段的选择符,该任务用于处理异常和/或中断。”

    ZC: 图4-27 中任务门里面的“段选择符”应该就是指 TSS段选择符。

    3.4、

    章节“4.6.9 异常与中断处理”

    ZC: 异常与中断处理 都是通过 IDT(中断描述符表) 来完成的。

    ZC: (1)、索引值 指向 中断门 或 陷阱门

      ==> 处理器使用与 CALL指令操作 调用门 类似的方法 调用 异常或中断 处理过程

    ZC: (2)、索引值 指向  任务门

      ==> 处理器使用与 CALL指令操作 任务门 类似的方法 进行 任务切换,执行异常 或 中断的处理任务

    4、源码中

    4.1、

    pdf.P136,head.s 源码中 第18~23行 说是“在改变了 GDT 之后重新加载所有段寄存器”

    ZC: 这里的“所有段寄存器”就只有 ds、es、fs、gs、esp这5个?而且 为何前4个只设置了低16位,高16位保持原有的值??

    5、

    章节“4.7.3.3”,讲 “指令 LTR 和 STR 分别用于加载和保存任务寄存器的可见部分,即 TSS 段的选择符。”

    ZC: 貌似 在视频教程里面 有专门讲 "不可见寄存器" 的部分,不知是否是同一种东西?

    6、

    7、

  • 相关阅读:
    mybatis:mybatis再总结
    shiro:RememberMe
    shiro:session管理
    shiro:缓存管理
    shiro:授权管理
    shiro:密码加密(加密、加盐加密)
    spring:spring再总结(ioc、aop、DI等)
    SpringBoot:整合layui、退出功能
    layui:内置模块(日期与时间、数据表格)
    nuxtjs中配置配置env
  • 原文地址:https://www.cnblogs.com/CodeSkill/p/5087800.html
Copyright © 2020-2023  润新知