V8堆中CodeSpace初始化机制及权限设置技术问询
V8 CodeSpace内存初始化与权限设置问题解答
问题1:CodeSpace是否通过mmap完成初始化,具体执行位置在哪里?
CodeSpace确实通过mmap完成虚拟地址空间的预留初始化,具体执行逻辑在Heap::Setup()方法中(对应源码文件v8/src/heap/heap.cc)。
在Heap的初始化流程中,会为各类内存空间(包括CodeSpace)通过VirtualMemory类封装的mmap(PROT_NONE)调用预留连续虚拟地址空间:
- 在
Heap::Setup()里调用CreateSpace方法实例化CodeSpace对象 CodeSpace的底层内存由SpaceReservation或VirtualMemory模块负责分配,最终调用系统mmap函数以PROT_NONE权限完成地址空间预留(此时仅占用虚拟地址位,不分配物理内存)
问题2:CodeSpace需要PROT_EXEC权限,该权限是通过mmap直接设置还是通过allocateRaw调用mprotect设置?
CodeSpace的PROT_EXEC权限不是通过mmap直接设置的,而是在实际分配可执行代码内存块时,通过allocateRaw相关流程调用mprotect动态修改内存页权限。
具体逻辑:
- 初始预留地址空间时,
mmap使用PROT_NONE权限,此时内存不可读、不可写、不可执行 - 当需要分配可执行代码页时,CodeSpace的内存分配器先通过
mprotect将目标页权限临时改为PROT_READ | PROT_WRITE,用于写入生成的机器码 - 代码写入完成后,再通过
mprotect将权限修改为PROT_READ | PROT_EXEC(部分场景会保留写权限用于代码补丁,但默认是只读可执行) - 整个权限修改流程封装在
allocateRaw及后续代码提交逻辑中,而非初始的mmap阶段
内容的提问来源于stack exchange,提问作者Jinuine
相关产品推荐
相关产品推荐

