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

2016-09-28 09:45:55 +08:00
 kindjeff
今天看操作系统课本里面有一段话:
>例如,对于一个具有 32 位逻辑地址空间的分页系统,规定页面大小为 4KB 即 2^12B ,则在每个进程页表中的页表项可达 1 兆个之多。又因为每个页表项占用一个字节,故每个进程仅仅页表就要占用 1MB 的内存空间,而且还要求是连续的。

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

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

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

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

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

要不要试试写写 JOS ?
http://blog.csdn.net/cinmyheart/article/details/45150461
kindjeff
2016-09-28 10:33:08 +08:00
@EOF 用的西安电子科技大学出版社的《计算机操作系统》第三版。我才疏学浅啊,只能先观望一下。
hitmanx
2016-09-28 13:04:00 +08:00
我记得我以前看的书里提到页表项每条是 4 字节,所以单级页表一共是 4 * 2^20 = 4MB

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/309437

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX