linux内存管理 (五) 5 用户空间 helloword在内存中的布局

linux内存管理的是物理内存,但是cpu访问的都是虚拟地址,通过MMU转换访问物理地址

之前了解到了 linux 在启动的时候 做了很多内存配置 (主要是做了 虚拟地址空间 C000 0000 - FFFF FFFF) 的配置
	虽然这其中涉及到物理内存(这部分中有线性映射的,有非线性映射的),但是可以看出来不超过 (虚拟地址空间 C000 0000 - FFFF FFFF) 的范畴
	也就是说 (虚拟地址空间 0000 0000 - BFFF FFFF) 一直没有做映射


这部分(虚拟地址空间 0000 0000 - BFFF FFFF) 是留给用户空间的应用程序的.
且要明白,是内核留给用户空间的应用程序的
所以这部分虚拟内存内核仍要管理.

管理现状:
	1.每个应用程序的虚拟地址范围都为 0000 0000 - BFFF FFFF ,涉及到重复的问题, 内核怎么解决
	2.每个应用程序的虚拟地址范围都分段 为 stack heap sharelibraies heap data text , 怎么怎么解决

针对第一个问题:
	每个应用程序都有一个 TCB (进程控制块,由内核来维护),其中包括内存的信息,其中需写入内存映射关系
	每个时刻只有一个客体在占用cpu(应用程序A或者内核B或者应用程序C),不会是应用程序A和应用程序C同时占用同一个CPU,所以谁用cpu的时候将谁(A/B/C)的映射关系 写到页表中就可以了
		1. 内核的页表是常在的
		2. 应用程序的页表是不断变化的(此处的页表表示 内核维护的 0000 0000 - BFFF FFFF 与物理内存的映射关系,不是某一应用程序维护的映射关系)
针对第二个问题:
	内核加载应用程序的时候就会将应用程序分段分割,然后加载到3G虚拟内存空间(0000 0000 - BFFF FFFF)中的不同位置
	应用程序运行的时候就会按照这个大框架(分段机制)运行,当malloc申请内存的时候内核也需要返回适当的地址(符合分段机制)
  • 应用程序所占内存空间变化图
    在这里插入图片描述
为什么会有 两个 heap
上面的为sys_mmap  (用做 加载器 ld.so) 
中间的为 Libraries (做share libraries 的映射)
下面的为sys_brk

// 详解见 深入浅出HelloWorld (HackingHelloWorld)_PartIII.pdf

没有记录 Libraries 位置的数据,没有记录mmap 的数据
// 可以看出 i686 和 armv7l 的布局 是类似的,但是数据是不同的

linux-i686实验数据

# ./i686_test 
p_stack1:0xbf8add30
p_stack2:0xbf8add2c

p_heap1 :0x0804a008
p_heap2 :0x0804a070

p_bss   :0x08049950
p_data  :0x08049948

p_const :0x08048728
p_code  :0x080483c4

root     10782  2415 99 18:17 pts/0    00:01:19 ./i686_test


root:/# cat /proc/10782/maps 
08048000-08049000 r-xp 00000000 03:02 42749415   /root/app_test_all/addr_test/i686/i686_test
08049000-0804a000 rwxp 00000000 03:02 42749415   /root/app_test_all/addr_test/i686/i686_test
0804a000-0806b000 rwxp 0804a000 00:00 0          [heap]
b7e1e000-b7e1f000 rwxp b7e1e000 00:00 0 
b7e1f000-b7f44000 r-xp 00000000 03:02 29435014   /lib/libc-2.5.1.so
b7f44000-b7f45000 r-xp 00125000 03:02 29435014   /lib/libc-2.5.1.so
b7f45000-b7f47000 rwxp 00126000 03:02 29435014   /lib/libc-2.5.1.so
b7f47000-b7f4b000 rwxp b7f47000 00:00 0 
b7f4e000-b7f4f000 rwxp b7f4e000 00:00 0 
b7f4f000-b7f69000 r-xp 00000000 03:02 29481592   /lib/ld-2.5.1.so
b7f69000-b7f6b000 rwxp 00019000 03:02 29481592   /lib/ld-2.5.1.so
bf89b000-bf8b1000 rw-p bf89b000 00:00 0          [stack]
ffffe000-fffff000 r-xp 00000000 00:00 0          [vdso]




root:/proc/10782# cat smaps 
08048000-08049000 r-xp 00000000 03:02 42749415   /root/app_test_all/addr_test/i686/i686_test
Size:                  4 kB
Rss:                   4 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         4 kB
Private_Dirty:         0 kB
Referenced:            4 kB
08049000-0804a000 rwxp 00000000 03:02 42749415   /root/app_test_all/addr_test/i686/i686_test
Size:                  4 kB
Rss:                   4 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         4 kB
Referenced:            4 kB
0804a000-0806b000 rwxp 0804a000 00:00 0          [heap]
Size:                132 kB
Rss:                   4 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         4 kB
Referenced:            4 kB
b7e1e000-b7e1f000 rwxp b7e1e000 00:00 0 
Size:                  4 kB
Rss:                   4 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         4 kB
Referenced:            4 kB
b7e1f000-b7f44000 r-xp 00000000 03:02 29435014   /lib/libc-2.5.1.so
Size:               1172 kB
Rss:                 228 kB
Shared_Clean:        224 kB
Shared_Dirty:          0 kB
Private_Clean:         4 kB
Private_Dirty:         0 kB
Referenced:          228 kB
b7f44000-b7f45000 r-xp 00125000 03:02 29435014   /lib/libc-2.5.1.so
Size:                  4 kB
Rss:                   4 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         4 kB
Referenced:            4 kB
b7f45000-b7f47000 rwxp 00126000 03:02 29435014   /lib/libc-2.5.1.so
Size:                  8 kB
Rss:                   8 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         8 kB
Referenced:            8 kB
b7f47000-b7f4b000 rwxp b7f47000 00:00 0 
Size:                 16 kB
Rss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
b7f4e000-b7f4f000 rwxp b7f4e000 00:00 0 
Size:                  4 kB
Rss:                   4 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         4 kB
Referenced:            4 kB
b7f4f000-b7f69000 r-xp 00000000 03:02 29481592   /lib/ld-2.5.1.so
Size:                104 kB
Rss:                  88 kB
Shared_Clean:         88 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:           88 kB
b7f69000-b7f6b000 rwxp 00019000 03:02 29481592   /lib/ld-2.5.1.so
Size:                  8 kB
Rss:                   8 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         8 kB
Referenced:            8 kB
bf89b000-bf8b1000 rw-p bf89b000 00:00 0          [stack]
Size:                 88 kB
Rss:                   8 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         8 kB
Referenced:            8 kB
ffffe000-fffff000 r-xp 00000000 00:00 0          [vdso]
Size:                  4 kB
Rss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
  • linux-i686 应用程序内存分布 解析
i686_test 占用了两个段,第一个段应该是text段,如何验证,第二个段应该是data段和bss段(8K)
	08048000-08049000 r-xp 00000000 03:02 42749415   /root/app_test_all/addr_test/i686/i686_test
	08049000-0804a000 rwxp 00000000 03:02 42749415   /root/app_test_all/addr_test/i686/i686_test
然后是堆段,供malloc使用(132K)
	0804a000-0806b000 rwxp 0804a000 00:00 0          [heap]
4K空洞
	b7e1e000-b7e1f000 rwxp b7e1e000 00:00 0 
动态链接库占据的段(1184K)
	b7e1f000-b7f44000 r-xp 00000000 03:02 29435014   /lib/libc-2.5.1.so
	b7f44000-b7f45000 r-xp 00125000 03:02 29435014   /lib/libc-2.5.1.so
	b7f45000-b7f47000 rwxp 00126000 03:02 29435014   /lib/libc-2.5.1.so

空洞(32K)
	b7f47000-b7f4b000 rwxp b7f47000 00:00 0 
	b7f4e000-b7f4f000 rwxp b7f4e000 00:00 0 
加载器占用的段(112K)
	b7f4f000-b7f69000 r-xp 00000000 03:02 29481592   /lib/ld-2.5.1.so
	b7f69000-b7f6b000 rwxp 00019000 03:02 29481592   /lib/ld-2.5.1.so

栈,向下增长(88K)
	bf89b000-bf8b1000 rw-p bf89b000 00:00 0          [stack]

虚拟系统调用所占段,(4K),原理请查看http://www.daileinote.com/computer/binary/0c
	ffffe000-fffff000 r-xp 00000000 00:00 0          [vdso]

linux 应用程序可以用哪些内存

main函数被调用时,程序就可以按照main函数中的C语句来运行了
这些C语句操作的都是什么内存?
------------
main函数执行之前的状态
text data (libraries ld.so) heap stack 都已经在了

main函数执行过程中可以改变的段
data 中 数据的值 , 主要是修改全局变量的值
heap 中 数据的值 , 主要是 malloc 和 free ,以及修改malloc申请的内存中的数据.
stack 中 数据的值 , 主要是函数调用压栈,局部变量压栈,函数返回弹栈



猜你喜欢

转载自blog.csdn.net/u011011827/article/details/111595805