V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
kindjeff
V2EX  ›  问与答

操作系统课本里面说页表项占用一个字节是怎么来的?

  •  
  •   kindjeff · 2016-09-28 09:45:55 +08:00 via iPhone · 5083 次点击
    这是一个创建于 2988 天前的主题,其中的信息可能已经有所发展或是发生改变。
    今天看操作系统课本里面有一段话:
    >例如,对于一个具有 32 位逻辑地址空间的分页系统,规定页面大小为 4KB 即 2^12B ,则在每个进程页表中的页表项可达 1 兆个之多。又因为每个页表项占用一个字节,故每个进程仅仅页表就要占用 1MB 的内存空间,而且还要求是连续的。

    “又因为每个页表项占用一个字节”是怎么来的?百思不得其解,搜索也没有得到答案。

    我的想法是,一个 32 位长的逻辑地址,分页大小为 4KB ,那么就有 12 位用来储存页内地址(偏移量),剩下 20 位都是页号,所以有 2^20 即 1 兆个页表项。页表的一项包括 页号 和 块号,至少都是 20bit ,怎么会只占用 1B 呢?书上也没有任何解释。
    6 条回复    2016-09-28 13:04:00 +08:00
    ipwx
        1
    ipwx  
       2016-09-28 10:04:26 +08:00   ❤️ 1
    楼主你教科书这一段确实不太靠谱,但是你理解的也有问题。在 32 位 Linux 中,一个页是 4K ( 12 位地址空间),剩下的 20 位地址空间被二级页表索引,每一级负责 10 位。

    但是页表项除了地址还要存其他很多信息,比如页的访问权限之类的。所以每一个页表项依旧需要 4 个字节。

    那么问题就明朗了,一级页表 1024 项( 10 位地址空间嘛),每个项目 4 字节正好 4K (一页)。二级页表项也是 1024 项,每个项目依旧 4 字节正好 4K 。最后形成的两级页表体系一共能表示 20 位地址空间,补上 12 位页内地址空间正好 32 位。

    楼主你可以继续网上搜索一下 Linux 二级页表的相关内容。需要说明的是二级页表只对 32 位系统有效, 64 位就是其他的做法了。
    ipwx
        2
    ipwx  
       2016-09-28 10:07:24 +08:00   ❤️ 1
    All right ,我又回顾了一下楼主你摘抄的这一段…… 感觉这一段根本就是还没到二级页表的内容,大概就是为了告诉你单级页表存不下那么多地址。。。从教科书的角度出发,你也可以 justify 一个页表项 = 1B 的行为:强制要求所有可以表示的内存地址按照 16 字节对齐( 4 位)不就解决了吗?
    kindjeff
        3
    kindjeff  
    OP
       2016-09-28 10:15:56 +08:00 via iPhone
    @ipwx 是的,这一段之后就是解决它的办法,二级页表。但是我就是在这个地方理解不能了😐。
    EOF
        4
    EOF  
       2016-09-28 10:27:38 +08:00
    用的什么 OS 的教材?

    要不要试试写写 JOS ?
    http://blog.csdn.net/cinmyheart/article/details/45150461
    kindjeff
        5
    kindjeff  
    OP
       2016-09-28 10:33:08 +08:00 via iPhone
    @EOF 用的西安电子科技大学出版社的《计算机操作系统》第三版。我才疏学浅啊,只能先观望一下。
    hitmanx
        6
    hitmanx  
       2016-09-28 13:04:00 +08:00   ❤️ 1
    我记得我以前看的书里提到页表项每条是 4 字节,所以单级页表一共是 4 * 2^20 = 4MB
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2696 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 00:22 · PVG 08:22 · LAX 16:22 · JFK 19:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.