首页
论坛
课程
招聘
[原创]【Windows内核探索】[保护模式篇]4.段寄存器
2022-6-22 22:24 3077

[原创]【Windows内核探索】[保护模式篇]4.段寄存器

2022-6-22 22:24
3077
  • 上节我们已经了解了内存的分段是怎么回事了,不过依旧存在一些问题。
  • 段的基地址存在哪里?他们真真的不能互相干扰了吗?

段寄存器

  • 想来各位读者对寄存器都有所了解,既然我们需要一个容器来存放段的基地址,寄存器自然是不错的选择。

  • 但是通用寄存器本身数量也不够多,再想腾出来存放段基址,也是心有余而力不足了。

  • 因此,理所当然的,就有了以为名的段寄存器

ds寄存器

  • ds,即data segment,意为数据段
  • 咱们一看就知道,这个东西就是和数据 相关的。
  • 它也十分简单,16位的宽度,作用就是存放数据段的基址

注解

实际在实模式下,物理地址的转换公式略微复杂一些
(ds << 4) + address = 最终的物理地址

昨天的问题

地址 程序 基地址
0x00 ~ 0x7f 提供给程序A 0x00
0x80 ~ 0xff 提供给程序B 0x80
.. .. ..
  • 昨天我们选择让B0x40这个位置存放一些数据
  • 而现在我们有了ds寄存器,只要在程序运行前初始化ds寄存器,就可以做到不破坏A的程序了。

根据段的用途进行划分

  • 但是这样子明显我们还需要小心翼翼,毕竟虽然不会破坏其他程序了,但不代表不会破坏自己的指令序列啊!
  • 代码数据都放在一个段里,是不是不便管理?
  • 如果我们对代码和数据再做进一步的划分,是不是更好?
地址 程序 基地址
0x00 ~ 0x3f 提供给程序A存放数据 0x00
0x40 ~ 0x7f 提供给程序A存放代码 0x40
0x80 ~ 0xcf 提供给程序B存放数据 0x80
0xd0 ~ 0xff 提供给程序B存放代码 0xd0
.. .. ..
  • 为此,自然是可以存在更多的段寄存器

    • cs(code segment)
    • ss(stack segment)
    • ..
  • 还是先前的问题,程序B试图在0x40这个地址存放数据,我们只需要让cpu知道,数据段基址0x80

    • 0x80 + 0x40 = 0xc0
  • 我们只需要划分好各个段,就可以很好的让程序工作了!

CPU对内存的访问

  • 为此,cpu也被设计为,在访问任何汇编指令中显式书写的内存地址时,都会先根据用途选择段寄存器,得到段基地址指令中的地址视作偏移(逻辑地址)运算后得到真正的物理地址,再进行访问

注解

读写内存,可以划分为对数据段的访问
执行指令,可以划分为对代码段的访问
..

新的问题

  • 同类型的段寄存器,自然是只有一个的。
  • 但是类似表格中的情况,如果存在多个程序,应该如何分配呢?
    • 我知道可能会有人存在这种疑问,所以我先替你们问了233
  • 在这里我们先不继续讨论,当我们继续往下深入到线程是如何切换的之后,相信你回来再看这个问题,答案也就显而易见了。

点到为止,耗子尾汁

  • 我们学习的重心并不放在8086汇编上。
  • 至于更多实模式下的知识,建议阅读王爽老师的《汇编语言》,这里就不再深入了。

看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~

最后于 2022-7-3 17:11 被yuyuaqwq编辑 ,原因:
收藏
点赞2
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回