转stackoverflow一个问题,关于内核是如何管理页表(pgd,pud,pmd,pte)本身所占的内存

el/2023/12/3 2:13:13

碎碎念

我今天莫名开始纠结起,关于linux页表方面的问题。然后就想到,
【页表本身也是要占有一部分内存的,所以内核又是如何管理页表本身所占有的这部分内存的呢?】
找了很久,没太满意的答案。甚至都没有具体方向,所以也不太有希望从源码中找到答案。
暂时就以在stackoverflow上找到的这个提问,作为这次疑惑的收尾吧,可能要很久很久之后才能得到圆满的解答了。

回复的大致意思是:
【根据linux内核相关wiki,页表就是常驻在内存中的,不会换出。】
也不知道实际是如何的,还是希望有从动态层面上研究过内核的大神,来救救孩子。

问题

Are page tables always in memory? Would page tables be swapped out?

I think page tables is maintained by Linux kernel, so the memory need for page tables should not be swapped out, for the reason that the kernel do not have page fault thing. But, if the pgd, pmd, pte tables are all in main memory and never swapped out, the meaning of multilevel paging can not save any memory.

So I am confused about the how page tables themselves are managed.

回复

well, according to wikipedia, it is true that page tables aren’t swapped out - but swapping out tables isn’t what makes them memory efficient! lets take an example: our physical memory is 4GB in size, every page is 4KB so we would have needed 4MB size table in order to map every address. the solution to this problem isn’t swapping out part of the table, but creating a hierarchy of tables, so you can allocate only the parts in the hierarchy which you need. it is explained quite thoroughly here: Why using hierarchical page tables?


http://www.ngui.cc/el/4104845.html

相关文章

【INT的内核笔记】Linux内核内存空间布局研究

1.Linux内核映射 从上面的页表设置可以看出: 内核对内核虚拟地址和物理地址之间的转换,是会有需求的。 很容易可以想到最简单的解决方法: 将内核虚拟空间地址,和实际物理空间逐一对应进行线性映射。 在很早期的时候&#xff…

【内核资料】stackoverflow上关于内核为何偏爱kmalloc(),而很少用vmalloc()的讨论

1. 问题 What is the difference between vmalloc and kmalloc? 2. 大致观点 涉及到DMA的话,需要物理上连续的内存;内核之所以偏好分配物理上连续内存,并不是必须的, 而主要是考虑性能: kmalloc()比vmalloc()效率高…

【INT的内核笔记】Linux信号递达过程详解

1. 什么时候执行信号递达 书上是叫递达的,但我个人比较喜欢叫信号处理吧,毕竟明明就是信号的接收进程处理信号的过程╮(╯▽╰)╭,所以文中可能会多处出现信号处理。 一般在从中断或系统调用返回到用户态前,会执行一段逻辑检查T…

【INT的内核笔记】tcp接收端相关实现

1. file_operations 在epoll_ctl(add)中有这样的调用链: 主要涉及了file->f_op和private_data中的socket结构 tfile->f_op->poll(tfile, &epq.pt)|->sock_poll|->sock->ops->poll|->tcp_poll(应该也是类似sk->sk_prot->recvmsg?…

关于char数组的输入与输出

cin一个char数组: 遇到空白符号(空格,tab制表符,回车)时读取停止,空白符号并不会被读入,但是碰到这些空白符号后,字符串末尾会放一个’\0‘ tip:空白字符的读入可以靠getchar() cout…

平衡三进制——Roj_1016

这道题目其实回顾的时候觉得还是挺容易的,但是做的时候还是忍不住看了题解。 这道题给我的主观层面的反思要远远大于客观上的,不要惧怕题目!不要惧怕题目!不要惧怕题目!!!重要的事情说三遍 *注意…

平衡三进制Ⅱ——Roj_1018

前提 平衡三进制Ⅱ就是1016的反过来计算,本来可能想转换的方法可能是这道题目的难点,但是题目直接给出了转换的方法,所以这道题的难点就转移到了如何用代码实现它所提供的方法(没有数学上的难度的 要点 1.最主要的问题&#xff1a…

字串排序——Roj_1020

这道题光看题目好像没有什么难度,但是操作起来发现了如下问题 1.输入这一串数组的方式,我刚开始采取的是多次get()到‘\n’结束,后来发现可能还是一个一个读入比较方便,因为还要考虑数组中是否存在数字(cge…

i-1进制——Roj_1014

思考过程 这道题刚开始搞得时候,毫无头绪,因为一直把abi看成了一个整体,没有想着把a和b分开运算,然后思维上的难度就比较大。然后某大佬给了示范 (刚开始我还没有想到用&1的办法搞成二进制,我刚开始是…

-1+i进制——Roj_1017

1017是1014反过来进行计算 但比较麻烦的点在于要考虑读入的各种情况: 1.是否有实部 2.是否有虚部 3.实部的正负 3.虚部的正负 4.虚部是否为/- 1 5.不是个位数的数字要进行进行运算 综合考虑各种情况,然后进行分类讨论 计算过程中可以拿aib/-1i找出统一的…