进程虚拟地址空间

与系统完成性相关的非常重要的一方面是,用户程序只能访问整个地址空间的下班不放呢,不能访问内核部分。如果没有预先达成“协议”,用户进程也不可能操作龄一个进程的地址空间,因为后者的地址空间对其拿着不可见。
无论当前那个用户进程处于活动状态,熏鼻地址空间内核部分的内容总是同样的。取决于具体的硬件,这可能是通过操作各用户进程的页表,使得虚拟地址空间袋额上部部看上去总是相同的。也可能是只是处理器为内核提供一个独立的地址空间,映射在各个用户地址空间之上。

进程地址空间的布局

虚拟地址空间中包含了若干区域。器分布方式特定于体系结构的,但所有方法都有下列共同成分。
*当前运行代码的二进制代码。该代码通常称之为text,所处的虚拟内存去域诚挚为text段。
*程序使用的动态库的代码
*存储去哪聚变量和实习那函数/过程调用的栈。
*将我文件内容映射到虚拟地址空间中的内存映射。
mm_types.h
struct mm_struct {}
可执行代码占用的虚拟地址空间区域,器开始和结束分别通过start_code和end_code,start_data和end_data标记了包含已初始化数据的区域。
堆的起始地址保存在start_brk,brk表示推去域当前的结束地址。
参数列表和环境变量的位置分别有arg_srart和arg_end,env_start 和env_end描述。
mmap_base表示虚拟地址空间中用于内存映射的起始地址,可调用get_unmmapped_area 在mmap区域中卫新映射找到适当的位置。
task_size,存储了对应进程的地址空间长度。
各个体系结构可以通过几个配置选项影响虚拟地址空间的布局。
*如果体系结构想要在不同mmap区域布局之间做出选择,则需要设置HAVE_ARCH_PICK_MMAP_LAYOUT,并提供arch_pick_mmap_;ayout函数。
*在寻找新的内存映射低端内存位置时,通常从较低的内存位置开始,逐渐向较高的内存地址搜索。内核提供了默认的函数arch_get_unmapped_area_topdown用于搜索,但如果某个个体系结构想要提供专门的实现,则需要设置预处理符号HAVE_ARCH_GET_UNMAPPED_AREA.
通常,栈子顶向下增长。具有不同处理方式的体系结构需要设置配置选项CONFIG_STACK_GROWSUP
text段如何映射到虚拟地址空间中由ELF标准确定。
栈起始于STACK_TOP,如果设置了PF_RANDOMIZE,则起始点会减少一个小的随机量。
用于内存映射的区域起始mm_struct->mmap_base, 通常设置为TASK_UNMAPPED_BASE,没有体系结构都需要定义。

建立布局

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值