10内存
原创
©著作权归作者所有:来自51CTO博客作者lindo的原创作品,请联系作者获取转载授权,否则将追究法律责任
第十章 内存
1 程序的内存布局
Linux的内存布局,按地址从高到低如下:
(1) Kernel 0xffffffff—0xc00000000
(2) Stack
(3) Dynamic libraries 0xXXXXXXXX—0x400000000
(4) Heap
(5) Read/write section(.date .bss)
(6) Readonly section(.init .rodate .text) 0xXXXXXXXX—0x08048000
(7) Reserved 0x080480000—0x00000000
实际上在linux内核2.6版本后,共享库的装载地址已经挪到了0xbfxxxxxx附近。
2 栈与调用惯例
什么是栈
堆栈帧一般包含以下几个内容:
(1) 传入的参数
(2) 返回的地址
(3) 保存的寄存器(上下文)
(4) 临时变量
调用惯例一般会包含一下几个方面的内容:
(1) 参数的传递方式和吮顺序
(2) 栈的维护方式(参数的弹出有调用者还是被调用者)
(3) 名字修饰策略
函数的返回值传递
在MIPS上关于栈的使用和维护的详细信息可以参考see mips run中的专门章节。
3 堆与内存管理
什么是堆
由于栈中的数据会在函数返回是释放,没有办法将数据传递到外面,而全局变量又不能动态的产生数据,所以堆应运而生。
虚拟地址空间是由操作系统管理的,用户的malloc怎么实现呢?比较好的方法是程序向操作系统申请一块适当大小的空间,然后由应用程序自己管理这块空间。
运行库作为应用程序和操作系统的中间商,管理堆空间。
Linux进程堆管理
Linux提供两种进程堆管理方法,一个是brk()系统调用,一个是mmap()系统调用。
brk()的作用实际上就是设置进程数据段的结束地址,即它可以扩大或者缩小数据段。Glibc中的sbrk()就是对brk()的包装。
mmap()的作用是像操作系统申请一段虚拟地址空间,而且这段虚拟地址空间可以映射到某个文件,也可以是匿名空间,由参数flag确定。
mmap(void *start, size_t length, int prot, int flag, int fd, off_t offset)
堆分配算法
(1) 空闲链表
(2) 位图
(3) 对想池
问题来了:堆其实只是进程向操作系统申请的一块地址空间,对于申请的堆和释放的堆,由谁来管理?操作系统?运行库?即对堆的数据结构描述由谁来管理?
实际上,操作系统或者运行库只是在虚拟地址空间上做一些增减,再设置一些读写权限。
上一篇:08Linux共享库组织
下一篇:11运行库

提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章