xv6 内核空间共享

  • 首发公号: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 分配的内存映射到了进程的用户空间,修改的是进程页表用户态部分的 pte,mappages->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/180965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Peter算法小课堂—高精度减法

给大家看个小视频高精度减法_哔哩哔哩_bilibili 基本思想 计算机模拟人类做竖式计算,从而得到正确答案 大家还记得小学时学的“减法竖式”吗?是不是这样 x-y问题 函数总览: 1.converts() 字符串转为高精度大数 2.le() 判断大小 3.sub() …

【技术干货】宇视IPC音频问题解决步骤

近期技术人员从宇视官网下载sdk进行二次开发时,在启动实时直播,并通过回调函数拿到流数据,发现没有音频流数据。 通过下面的数据发现,codeType此字段一直是28,代表的是H.264数据,但未没发现有音频的数据包…

【C++】define宏定义

define宏定义 define是C语言中的一个宏定义命令&#xff0c;它用来将一个标识符定义为一个字符串&#xff0c;该标识符被称为宏名&#xff0c;被定义的字符串称为替换文本&#xff1b; define <宏名> (<参数表>) <宏体>操作符 # &#xff1a;可将参数转化为…

什么是Geo Trust OV证书

一、GeoTrust OV证书的介绍 GeoTrust OV证书是由GeoTrust公司提供的SSL证书&#xff0c;它是一种支持OpenSSL的数字证书&#xff0c;具有更高的安全性和可信度。GeoTrust是全球领先的网络安全解决方案提供商&#xff0c;为各类用户提供SSL证书和信任管理服务。GeoTrust OV证书…

如何使用ArcGIS实现生态廊道模拟

生态廊道是指一种连接不同生态系统的走廊或通道&#xff0c;其建立有助于解决人类活动对野生动植物栖息地破碎化和隔离化的问题&#xff0c;提高生物多样性&#xff0c;减轻生态系统的压力。在城市化和农业开发不断扩张的背景下&#xff0c;生态廊道对于野生动植物的生存和繁衍…

重生之我是一名程序员 44 ——字符串函数(3)

哈喽啊大家晚上好&#xff01;迄今为止我已近给大家介绍了2个字符串函数&#xff0c;今天呢再给大家带来一个字符串函数——strcmp函数。 首先呢还是先带大家认识一下它。strcmp函数是C语言中的字符串函数之一&#xff0c;用于比较两个字符串是否相等。 该函数原型为&#xf…

mysql中的锁及其作用

在MySQL中&#xff0c;锁是用于控制对数据库对象的并发访问的一种机制。锁可以防止多个事务同时对同一数据进行修改或删除&#xff0c;以确保数据的完整性和一致性。 MySQL中的锁有以下几种类型&#xff1a; 共享锁&#xff08;Shared Lock&#xff09;&#xff1a;也称为读锁&…

短视频运营常用的ChatGPT通用提示词模板

短视频定位和策划&#xff1a;请帮助我明确短视频的定位和策划&#xff0c;包括目标受众、主题、风格、内容等方面的内容&#xff0c;以便我能够更好地制定短视频运营策略。 短视频制作&#xff1a;请帮助我制作高质量的短视频&#xff0c;包括脚本编写、拍摄、剪辑、特效等方…

Hive安装与配置

你需要掌握&#xff1a; 1.Hive的基本安装&#xff1b; 2.Mysql的安装与设置&#xff1b; 3.Hive 的配置。 注意&#xff1a;Hive的安装与配置建立在Hadoop已安装配置好的情况下。 hadopp安装与配置 Hive 的基本安装 从 官网 下载Hive二进制包&#xff0c;下载好放在/op…

万人拼团团购小程序源码系统+拼团设置+拼团管理 附带完整的搭建教程

随着互联网的快速发展&#xff0c;电子商务和社交电商的兴起&#xff0c;团购作为一种高效的营销策略和消费方式&#xff0c;受到了广大消费者的热烈欢迎。在此背景下&#xff0c;我们开发了一款基于微信小程序的万人拼团团购系统&#xff0c;旨在为用户提供一种更加便捷、高效…

python爬虫进阶教程之如何正确的使用cookie

文章目录 前言一、获取cookie二、程序实现三、动态获取cookie四、其他关于Python爬虫技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Pytho…

lxml 总结

xm 和 lxml库 哪个更好用点 1. 性能&#xff1a; lxml 通常比 xml.etree.ElementTree 更快。lxml 使用了 C 编写的底层解析器&#xff0c;因此在处理大型 XML 文档时可能更高效。 如果性能对你的应用很重要&#xff0c;特别是在处理大型 XML 文件时&#xff0c;选择 lxml 可能…

TrueLicense实现授权管理

1、生成前准备 在生成授权文件前&#xff0c;首先需要密钥对插入&#xff1a;密钥对分为公钥与私钥&#xff0c;私钥需要本地储存不泄露&#xff0c;公钥需要对外提供&#xff1b;私钥内部包含证书&#xff0c;对于授权文件进行数字签名&#xff0c;相当于加密的步骤&#xff0…

这款高性能分布式ID生成器,现在是你的了~

这是DDD&微服务系列的第17篇&#xff0c;欢迎持续关注~ 概述 在软件开发过程中&#xff0c;我们经常会遇到需要生成全局唯一流水号的场景&#xff0c;例如各种流水号和分库分表的分布式主键ID。特别是在使用MySQL数据库时&#xff0c;除了要求流水号具有“全局唯一”性外&…

VTK 读取、预处理、处理和可视化医学图像数据的过程

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example demo解决问题&#xff1a; VTK 读取、预处理、处理和可视化医学图像数据的过程 图像读取和预处理&#xff1a; 程序使用 VTK 的图像阅读器vtkImageReader2Factor…

继电保护-变压器纵联差动保护MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 原理概述 差动保护是在两端设置的保护&#xff0c;通过比较两端测回来的电气量&#xff0c;进而看是否需要动作&#xff0c;纵联差动保护是变压器主保护。 纵联差动保护基本原则 双绕组变压器实现纵联差动…

notepad ++ 常用快捷键 【程序员必看】

目录 notepad 常用快捷键 一 安装notepad 二 快捷键 三 改变主题 四 设置tab键 五 自动换行 六 自动补全 七 创建保存文件 八同时编辑两个文件 九保持Notepad代码高亮风格到网页或word中 十插件安装 十一使用notepad解决实际问题 CtrlC 复制 CtrlX 剪切 CtrlV 粘贴…

泄密零容忍!迅软科技打造设计图纸安全防线,助您无忧创作!

对于建筑设计、鞋服设计、动漫设计、平面设计等设计行业而言&#xff0c;海量设计图纸都以电子数据的形式存在企业的终端电脑上&#xff0c;这些图纸蕴含着企业的核心竞争资源&#xff0c;一旦泄露将给企业带来巨大的经济损失。 因此&#xff0c;迅软科技采用了先进的数据加密技…

Ruoyi-cloud / 若依 SpringCloud服务器部署

1、redis 环境 服务器安装redis &#xff0c;注意 密码 端口 2、mysql 环境 服务器安装 mysql 5.7 以上的版本 代码中的sql 文件夹中有 sql 文件 创建数据库ry-cloud并导入数据脚本ry_2021xxxx.sql&#xff08;必须&#xff09;&#xff0c;quartz.sql&#xff08;可选&…

同旺科技 USB 转 RS-485 适配器 -- 隔离型

内附链接 1、USB 转 RS-485 适配器 隔离版主要特性有&#xff1a; ● 支持USB 2.0/3.0接口&#xff0c;并兼容USB 1.1接口&#xff1b; ● 支持USB总线供电&#xff1b; ● 支持Windows系统驱动&#xff0c;包含WIN10 / WIN11 系统32 / 64位&#xff1b; ● 支持Windows …