在装入程序映象文件时,系统根据程序映象文件中的信息为进程的代码段和数据段
分别建立相应的虚拟内存区域(图 3-5 所示的即为某个程序映象装入后的代码段和数
据段)。如果该程序用到了任何一个共享库,则共享库也必须装入进程的虚拟地址空
间。利用 ldd
命令可查看一个程序的共享库使用情况和装入的地址:
[WeiYM@goldfield src]$ ldd testgui
libvgagl.so.1 => /lib/libvgagl.so.1 (0x40005000)
libvga.so.1 => /lib/libvga.so.1 (0x40013000)
libpthread.so.0 => /lib/libpthread.so.0 (0x40037000)
libc.so.6 => /lib/libc.so.6 (0x40044000)
libm.so.6 => /lib/libm.so.6 (0x400ea000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00000000)
前面提到,Linux 利用需求分页技术优化程序映象的装入。在装入程序映象时,Lin
ux 并不将映象装入物理内存,相反,可执行文件只是被链接到进程的虚拟地址空间
中。随着程序的运行,被引用的程序部分会由操作系统自动装入物理内存。
在程序的执行过程中,可利用如下的系统调用修改进程的虚拟内存:
brk 或 sbrk:利用该系统调用可修改进程数据段的大小,可用于内存的动态分配。
mmap:利用该函数可将文件映射到进程的虚拟地址空间。系统将增加新的内存区域
数据结构,但并不实际装入文件数据,而是利用需求分页技术,当需要真正访问数据
辈抛叭氲轿锢砟诖妗:?mmap 相关的系统调用还有 munmap 和 msync,munmap 可取
消文件的内存映射关系,msync
可将任何对内存映射中所做的修改实际写入到对应的文件中。
mremap:利用该系统调用可改变某个虚拟内存区域的大小,包括扩大内存区域或减
小内存区域。在 Linux 中,它的作用并不限制于文件映射内存区。利用该函数可有效
实现 ANSI C 的 realloc 函数。
mlock 或 mlockall:利用这些系统调用可以禁止对某个虚拟内存区域,或整个虚拟
内存(包括代码、数据和堆栈段、共享库、用户空间的内核数据、共享内存和内存映
射文件等)的分页操作。禁止分页的内存页可以驻留在 RAM 中,直到调用 munlock
或 munlockall
为止。将内存页锁定到 RAM 中的方法经常用于两种场合:实时系统和需要高度安全
性的数据处理。对实时系统而言,分页机制可能导致严重的不可预料的时间延迟,因
此禁止分页有利于实时处理
。对高度安全性的数据处理来说,禁止分页可避免将重要的数据写入交换文件而导
致可能的数据窃取。
getrlimit、getrusage 和 setrlimit:利用这些系统调用可查看或设置进程的资源
限制以及资源使用情况,包括数据段大小、堆栈段大小、共享内存大小和锁定内存大
小等。
getpagesize:利用该系统调用可获得系统内存页的单位大小。
在程序中,通常利用 ANSI C 的标准内存处理函数从进程堆或栈中分配内存,例如
:malloc、free,alloca 等。
Linux 的虚拟内存使用有一个特点,即分配的虚拟内存区域由内核管理,并在适当
的时候自动分配给相应的物理内存区。除非要使用特殊的功能,例如内存映射和锁定
δ埽 讨恍枥 ?ANSI C 的函数在进程堆中分配和使用内存。
FROM: http://hi.baidu.com/cannick/blog/item/f99d023e6fd6db3871cf6c0a.html
联系客服