常量字符串编译后为什么要放在这个区域?这就是一种规则。Linux要跑程序,就需要把可执行文件加载到内存中,所以制定了ELF文件结构,告诉编译器,Linux平台的程序随便你怎么编译,但是你生成的文件得符合ELF文件结构我才能运行
常量字符串你编译器编译时要放到.rodata段中,我Linux加载程序的时候才会放到内存只读区域中,这样才能实现我们所学的:常量字符串不可以修改
如果你想详细了解.rodata,或者你想全面了解Linux平台的可执行文件ELF文件结构,这时候你就可以借助ChatGPT去学习研究了!
常量字符串在内存中的样子
再来看看常量字符串在内存中的样子,如图
有木有发现一个惊天大秘密?其实常量字符串跟代码,在内存中,即进程内存空间中,是在同一个区域!给你看一个更形象的图
文章中的很多演示效果,并不是Linux提供的,是我写代码实现的。如果这是你想学的,你也想有这样的实力与认知,欢迎加入我的《逆向思维带你玩转Linux内核》小班
关于Linux进程的内存空间,我之前写过文章
Linux内核的规则束缚
还剩最后一层认知:Linux内核是如何提供内存保护的?那硬件支持呢?Linux内核就是使用了硬件提供的支持才能实现内存保护,所以它俩的本质是一个,只不过是两个层面
那硬件提供了什么支持呢?4-level paging,即4级分页,如图。关于4级分页,这里我就不展开讲了,但是我会给你讲明白硬件支持与只读区域的关系。
关于虚拟内存分页机制,你可以自己去研究学习,后面我也会写文章详谈,如果你想学习,关注公众号【硬核子牙】
当CPU尝试修改常量字符串的时候,CPU肯定有字符串的内存地址,这个地址叫逻辑地址,传给CPU内部的段部件,x64 CPU采用平坦模型,段基址一律为0,段部件产出线性地址,传给CPU内部的页部件