openeuler代码Arm64架构支持memmap功能,但是不支持memmap支持内核地址随机冲突检测,当使能内核物理地址随机化且Image随机在memmap预留内存区域时,会导致image内存被踩的问题,导致系统异常复位
解决这个问题,需要在UEFI启动加载内核阶段,提前解析CMDLINE参数的memmap配置,并通过alloc_page进行内存预留,从而避免内核随机时落在memmap的内存区域,造成Image与memmap内存冲突
Hi cuigaosheng, welcome to the openEuler Community.
I'm the Bot here serving you. You can find the instructions on how to interact with me at Here.
If you have any questions, please contact the SIG: Kernel, and any of the maintainers: @YangYingliang , @成坚 (CHENG Jian) , @jiaoff , @zhengzengkai , @刘勇强 , @wangxiongfeng , @朱科潜 , @WangShaoBo , @lujialin , @wuxu_buque , @Xu Kuohai , @冷嘲啊 , @Lingmingqiang , @yuzenghui , @岳海兵 , @juntian , @OSSIM , @陈结松 , @whoisxxx , @koulihong , @刘恺 , @hanjun-guo , @woqidaideshi , @Chiqijun , @Kefeng , @ThunderTown , @AlexGuo , @kylin-mayukun , @Zheng Zucheng , @柳歆 , @Jackie Liu , @zhujianwei001 , @郑振鹏 , @SuperSix173 , @colyli , @Zhang Yi , @htforge , @Xie XiuQi
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
测试方案一:
1、cmdline中配置memmap预留内存段,比如memmap=200m$0x0000000040010000,0x10000$0x0000000090000000(注意均选择合法的物理地址段)
2、启动内核,内核启动成功,且不会有错误日志打印则符合功能预期,日志如下:
测试方案二:
可以增加debug补丁,打印内核随机关键信息,观测内核启动过程中是否跳过指定内存段,如下:
关于更多:
测试过程中,通过调整memmap配置参数,采用不同的(合法、非法等)地址和size组合,完善测试场景
实现方案解读:
如图所示,EFI启动阶段内存管理由BIOS进行,内核物理地址随机化特性会从BOIS获取内存布局,并在可选的物理地址范围进行random随机,随机完成之后进行Image的拷贝加载
为解决memmap与内核物理地址随机的问题,需要提前解析cmdline配置,识别内存预留段,并通过allocate_pages将预留内存同步到bios侧的物理内存管理侧,后续在通过efi_get_memory_map获取可用的物理内存map时,则会跳过已被allocate的物理内存,即内核不会在memmap预留的内存段内进行随机偏移
登录 后才可以发表评论