传统网站有没有建设必要性长春搜索排名提升
news/
2025/9/22 17:12:06/
文章来源:
传统网站有没有建设必要性,长春搜索排名提升,跨境经验分享,廊坊百度快照优化排名首发公号#xff1a;Rand_cs
共享内核空间
我们常说#xff0c;每个进程都有自己的虚拟地址空间#xff0c;但其中内核部分是共享的。
这就有个问题#xff0c;如何共享的#xff1f;
系统启动时创建了一张内核页表#xff0c;里面记录着内核地址空间与物理地址空间的…首发公号Rand_cs
共享内核空间
我们常说每个进程都有自己的虚拟地址空间但其中内核部分是共享的。
这就有个问题如何共享的
系统启动时创建了一张内核页表里面记录着内核地址空间与物理地址空间的映射关系而每次 fork 子进程时都会复制一份内核页表所以说每个进程页表中的内核部分是“相同的”因此可以说共享内核空间。
这里我将最初的内核页表称为“原本”每个进程的内核部分称为“副本”类似副本的设计都会存在存在一个问题——同步意思是说如果某个进程修改了内核空间的映射关系那么需要将这种映射关系的改变同步到其他副本如此才能保证逻辑正确。
最初分析 xv6 的 scheduler 的代码时发现每次返回到调度器时都会切换到内核页表如下所示
void scheduler(void)
{
........swtch((c-scheduler), p-context); switchkvm();
........
}当时我便在想不切换行不行于是将 switchkvm 注释掉发现出了错而且错误还不固定有的是触发 page fault、有的是系统 reset(从 main 函数重新开始执行)未找到明确的复现规律。当时没有细想初步便认为是因为各个进程页表的内核部分也就是“副本”们之间没有同步导致了种种错误。后来重新看代码的时候发现问题应该不在内核页表同步。
xv6 不需要内核页表同步因为 xv6 在启动的时候内核地址空间的映射关系已经建立好了而纵观代码也没有修改内核地址空间映射关系的地方所以内核地址空间的映射关系应是一直不变的。可能有的朋友会觉得 kalloc 函数会更改内核映射其实并没有kalloc 只是分配内存并没有修改映射关系可以仔细看看 kalloc 前后的关于修改映射关系的代码比如说 *pte xxx, *pde xxx这才是修改页表修改映射关系。在 growproc-kalloc 调用链中kalloc 分配的内存映射到了进程的用户空间修改的是进程页表用户态部分的 ptemappages-walkpgdir-kalloc 中分配的内存用作用户页表修改的是进程页表用户态部分的 pde
这就相当于 Linux 中的直接映射区域但是不存在 vmalloc 动态映射区域所以 xv6 其实不需要内核页表的同步。假如说某个进程确实会改动内核映射关系那么应该如何实现内核页表同步。同步内核页表是为了每个进入内核时都能看到相同的内核影响所以
第一种方式不需要同步内核页表每次进程进入内核的时候切换到“原本”内核页表那么每个进程进入内核的时候使用的是同一份页表当然就不需要同步第二种方式那就是老老实实的同步页表也就是说当“原本”或“副本”被修改的同时也就将相关的修改同步到其他“副本”。这部分可以参考 Linux vmalloc 区同步的做法当“原本”修改时调用 sync_global_pgds 主动将修改同步到其他“副本”。当某个“副本”被修改时Linux 先后有三种同步方式最开始在 pagefault 中触发同步但有竟态问题有了第二种主动同步但因为性能问题又增加了第三种干掉同步的方式。Linux 内存管理的部分见 bin的技术小屋 这位大佬写的文章本文不赘述这应该是全网对 Linux 内存管理讲解的最详尽细致的文章了值得一看。
这里在穿插一个问题既然内核里面本来就有一份内核页表那么进程页表何必再拷贝一份内核页表反正进程在用户态时不能访问内核态根本就用不到内核页表。每个进程页表只需要映射它自己的地址空间以及跳转到内核那一小段代码段即可跳转到内核后切换到内核页表在内核办完事儿后再切换回进程页表这个过程似乎没有问题也就是根本就没必要拷贝整个内核页表到进程页表的内核部分那为什么还要这么做呢让内核地址空间和进程用户地址空间在同一张页表共存
我想这个问题应该是和架构强相关在 arm 中有两个页表寄存器ttbr0 存放进程页表ttbr1 存放共享的内核页表访问用户空间地址使用 ttbr0 寄存器访问内核空间地址使用 ttbr1 寄存器。因为 arm 有两个寄存器进程进出内核不需要进行页表切换。
但是 x86 架构只有一个页表寄存器如果将用户页表和内核页表分开那么进出内核势必造成页表切换页表切换刷新 tlb如果没有 ASID/PCID 等机制的话性能损失太多
话说内核页表和用户页表共存也会引发一些安全问题比如之间大爆的 meldown 漏洞以及相应的缓解方案 kpti挺有意思有兴趣的话可以看一下。
回到 xv6 上面来那为什么 scheduler 中需要切换到内核页表很不幸这个问题始终还未能解决写在这里便是和大家讨论一下以及分享一下相关的一些东西另外很有意思的是当我在 ubuntu 虚拟机中跑注释掉 switchkvm 的 xv6 时会引发各种问题但是在 ubuntu 的宿主机上跑便没有问题(已考虑到虚拟机 cpu 核心分配的问题)这便很奇怪想了很久未能弄明白暂时存疑吧。元芳你怎么看
首发公号Rand_cs
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/909762.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!