Linux系统下的进程地址、内存分区、映射机制

   日期:2024-12-25    作者:ahwvf 移动:http://oml01z.riyuangf.com/mobile/quote/10980.html

1、Linux进程地址空间分布

 

代码段(text):存放CPU执行的机器指令,代码区是可共享,并且是只读的。
数据区
:只读数据段,常量数据
: 存放已初始化的全局变量、静态变量(全局和局部
:存放的是未初始化的全局变量和静态变量
堆区:堆向上生长,由malloc()函数分配的内存块,使用free()函数来释放内存,堆的申请释放工作由程序员控制,但容易产生内存泄漏。
栈区:栈向下生长,由编译器自动分配释放,存放函数的参数值、返回值和局部变量,在程序运行过程中实时分配和释放,栈区由操作系统自动管理,无须程序员手动管理。

补充:往上还存在命令行参数及环境变量。
全局变量在程序的整个运行过程中存在。
局部变量的生命周期从其定义开始,到函数执行结束时自动销毁。

栈与堆的区别
1、管理方式不同:堆的申请malloc()与释放free()由程序员来完成,栈由系统编译器自动分配
2、空间大小不同:堆空间大于栈空间
3、栈在内存中连续分配,不会产生碎片。堆的频繁申请可能造成内存空间的不连续性产生大量碎片
4、增长方式不同:栈向内存地址减小的方向增长,堆则相反
5、分配效率不同栈的申请效率通常高于堆,计算机在底层提供寄存器存放栈的地址,压栈出栈有专门的指令;堆由c函数库提供,动态内存分配需要有一定的算法去寻找申请足够大的地址空间。

内存错误情况
1、指针没有指向一块合法的内存
2、指针没有初始化地址。

 

3、指针分配的内存太小
4、内存越界:向缓冲区写入超出其大小的数据,可能导致覆盖相邻的内存区域,引发未定义的行为或安全漏洞
5、内存泄漏:动态分配的内存未被释放,导致程序持续占用内存,最终耗尽系统资源
6、内存释放后,继续使用该指针

objdump -h查看程序的各个段

使用任意一个可执行的**.c语言程序即可,首先编译为.o**文件。

 

运行,显示结果如下图

 
 

3、内存映射机制

在单片机中(无MMU)或者未开启MMU时的控制器中CPU直接通过物理地址来访问外设和内存。
启动MMU(Memory Management Unit),即内存管理单元硬件器件。作用是将CPU发出的虚拟地址转换为应用程序的物理地址访问外设和内存。

Linux内核会把物理地址会划分为一个个4K的块,也称为页,会对每个块进行编号处理,并用Struct page这个结构体来管理块(页)的状态信息,并对每一页进行编号 PFN(Page Frame Number)。

在32位操作系统中,程序员首先给出的是逻辑地址,然后通过转换为线性地址,再将线性地址通过转换为物理地址
CPU发出的线性地址(虚拟地址),以0000000011 0000000100 0001 0000 0000为例解析,分为3个部分,第一部分是,第二部分是,第三部分是。

首先取出第一部分的值为3索引去查看页目录表,找到页目录项3,里面存放着页表3的地址。每个进程都有一个页目录表,表里有1024页目录项,页目录项的地址保存至cr3寄存器中,每一个页目录项又指向相应的页表,所以通过第一项能得到页表的地址,一个页表也是1024项
其次,第二部分以table的值为4索引找到页表里对应的页表4项的内容,项的内容保存的是实际的物理块号4的,找到对应的4K物理块起始地址0x1000 4000(基地址)。
最后,第三部分通过offset的偏移量256和页表3里面的页表项4的地址相加来找到最终物理地址0x1000 4256,完成内存映射。

:通过前几位来找到页目录表中的项数来确定二级页表,再通过中间几位找到页表在的页表项来确定基地址,再通过后几位来确定偏移地址

总的来说,虚拟地址的映射涉及到整个进程的地址空间,而不是特定变量或数据结构内的偏移地址映射。
值得注意的是,操作系统为每个运行的进程分配的虚拟地址空间,每个进程都有。
每个进程的虚拟地址其实是不一样的,当不同的进程里,如定义int a = 10;假设其地址都是0x1234,访问相同的虚拟地址时,它们实际上在各自的页表中进行地址映射。
进程里的变量的地址是相对于进程的虚拟地址空间的偏移量,所以不同进程里的相同虚拟地址,如0x1234所映射的物理地址是不相同的。


特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号