通过修改CR0取消内存写保护

本文介绍在x86_64架构中如何通过修改CR0寄存器的WP位来禁用写保护,以解决在进行系统补丁更新时因内存保护引发的内核panic问题。提供了关闭和打开写保护的汇编代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在x86_64进行补丁系统的原地址指令更改时,会因为x86的内存保护,使得对原地址的写操作引起内核panic,报oops。可以通过修改CR0寄存器的第16位暂时关闭写保护。

1、CR0

    CR0 是系统内的控制寄存器之一。控制寄存器是一些特殊的寄存器,它们可以控制CPU的一些重要特性。

    CR0的第16位是写保护未即WP位(486系列之后),只要将这一位置0就可以禁用写保护,置1则可将其恢复。

2、关闭写保护

uint close_cr0(){

uint cr0 =0;

uint ret = 0;

asm volatile("movq  %%cr0, %%rax"

        :"=a"(cr0)

);

ret = cr0;

cr0 &= 0xfffeffff;

asm vloatile( "movq %%rax, %%cr0"

        :

        :"a"(cr0)     

);

return ret;

}

3、打开写保护

void open_cr0(uint oldVar){

        asm volatile("movq %%rax, %%cr0"

                :

                :"a"(oldVar)

        );

4、修改原地址的指令

uint OldVar = 0;

//关闭写保护

OldVar = close_cr0();

//修改原地址的指令

yourCodeAddr = changeOrd;

//打开写保护

open_cr0(OldVar);

movq对应的是64位的汇编指令。32位需要改为对应的movl。常见的几种指令可以在这查找http://blog.luoyuanhang.com/2015/07/07/%E5%87%A0%E7%A7%8D%E5%9F%BA%E6%9C%AC%E6%B1%87%E7%BC%96%E6%8C%87%E4%BB%A4%E8%AF%A6%E8%A7%A3/

内核地址的写保护的报错,只在x86_64的设备上发生了,但是arm等其他架构同样的代码却没有发生错误。对于架构相关的不是很了解,还望有大佬讲解。

### STM32 锁定 Flash 防止修改的方法 为了防止STM32内部Flash被未经授权的访问和修改,可以通过配置选项字节来实现读写保护功能[^1]。具体来说,在STM32微控制器中存在专门用于控制闪存属性的一组寄存器——即选项字节寄存器(Option Bytes),这些寄存器允许开发者定义特定区域是否可读或可编程。 当需要启用读写保护时,应该按照如下方式进行: - **进入系统存储区解锁模式**:通过向`FLASH->KEYR`寄存器连续写入两个密钥值(0x45670123, 0xCDEF89AB),使能对选项字节的操作权限。 - **清除待处理位并设置新的保护级别**:清零`OPTLOCK`位以解除锁定状态;接着依据需求调整相应位域,比如设定WPRG bits (Write Protection Register Group) 来指定哪些扇区受到写保护影响。 - **启动擦除过程**:调用API函数如 `HAL_FLASHEx_OptionBytesStartErases()` 或者手动执行命令序列完成整个芯片范围内所有已知错误校正码(ECC) 和奇偶校验信息的同时移除工作。 - **重新加载更新后的参数**:最后一步是触发一次硬件复位(`NVIC_SystemReset()`)让新配置生效,从而确保之后任何试图更改受保护内存空间的行为都会失败。 下面给出一段简单的C语言代码片段展示上述流程的一部分: ```c // 解锁选项字节程序入口 void UnlockOptBytes(void){ /* 如果已经处于未加锁的状态,则无需再次解琐 */ if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPTVERR)){ // 清楚先前存在的错误标志 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS); /* 向键寄存器输入钥匙序列 */ FLASH->KEYR = 0x45670123; FLASH->KEYR = 0xCDEF89AB; /* 取消选项字节锁定 */ MODIFY_REG(FLASH->CR, FLASH_CR_OPTLOCK_Msk, 0U); } } ``` 一旦完成了以上步骤,所选中的Flash区间将会变得不可改变直到下一次类似的重置动作被执行为止。值得注意的是,不同系列的STM32产品线之间可能存在细微差别,因此建议查阅对应的数据手册获取最准确的信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值