想知道为什么linux 0.11的free_page_tables中,既然dir对应页目录项,一个页目录是4字节,所以才右移22位然后取的4倍。但是为什么下面循环中用的是dir++而是是dir=dir+4呢?这样岂不是会导致比如第一次dir是4代表第1个目录项(从0项开始算)。然后dir++后就等于5了吗,按理来说第2个目录项应该dir应该是8吧
1条回答 默认 最新
一直免费一直爽 2024-08-11 23:09关注以下回复参考:皆我百晓生、券券喵儿等免费微信小程序作答:
在Linux内核中,
free_page_tables是一个用于管理页面表结构的数据结构。它通过将页目录项的偏移量进行右移操作实现了一个简单的页表重定位功能。首先,让我们了解一下页目录项的结构:
DIR: 表示页目录项的类型。OFF: 目录项的物理地址偏移量。SIZE: 目录项的大小(以字节为单位)。LINK: 指向下一个页目录项的指针(默认指向NULL)。
当进行页表重定位时,
off字段的值会被右移22位,并且这个操作实际上是将off乘以4得到新的off值。这是因为off实际上包含了两个部分:偏移量和大小。由于页表的大小是固定的,我们可以通过计算出每个页的大小来确定off的大小,然后再对off进行适当的处理。例如,在Linux 0.11版本中,页目录项的大小是4字节,因此我们可以计算出每页的大小是:
PAGE_SIZE = 4 / 8 = 0.5然后,我们将
off进行右移22位并乘以4来得到新的off值:new_off = (off << 22) * 4这样我们就得到了一个新的
off值,这个值可以被用来更新页表中的off字段。注意,这里使用的公式是基于off的原始定义,即它是页目录项的物理地址偏移量,而不是实际的页大小。如果我们想要根据页表的大小来更新off,那么我们需要调整上述公式。对于循环中的
dir++,这通常是在迭代过程中增加当前页表项的编号,以便于后续的操作。在循环中,每次都会执行一次dir++操作,因为我们要确保每次都是从头开始遍历,也就是dir总是指向第一个页目录项。因此,当我们看到dir++时,我们知道正在访问的是下一个页目录项。解决 无用评论 打赏 举报 编辑记录