2014年1月10日

Chap-6 6.4.2 堆和栈

摘要: 6.4.2 堆和栈在操作系统里面,VMA除了被用来映射可执行文件中的各个segment,操作系统还使用VMA来对进程的地址空间进行管理。进程在执行的时候还需要用到堆(heap)和栈(stack)等空间,一个进程中的栈和堆分别都有一个对应的VMA,在Linux下,可以通过/proc来查看进程的虚拟空间分布,下面查看一个死循环的虚拟空间分布:***图6.4.2***第一列是VMA的地址范围;第二列是VMA的权限,“p”表示私有(COPY ON WRITE,COW),“s”表示共享;第三列表示VMA对应的segment在文件中的偏移;第四列表示映像文件所在设备的主设备和次设备号;第五列表示映像文件的 阅读全文

posted @ 2014-01-10 23:20 Persistence 阅读(215) 评论(0) 推荐(0)

Chap-6 6.5 ELF可执行文件的装载

摘要: 6.5 Linux装载ELF可执行文件的过程当我们在Linux系统的bash下输入一个命令执行某个ELF文件时,Linux是怎样装载这个ELF文件并且执行它呢?首先在用户层面,bash进程会调用fork()系统调用常见一个新进程,然后新的进程调用execve()系统调用执行指定的ELF文件,原先的bash进程继续返回等待刚才启动的新进程结束。在进入execve()系统调用后,Linux内核就开始进行真正的装载工作。在内核中,execve()系统调用相应的入口是sys_execve(),它被定义在arch/i386/kernel/process.c文件中。sys_execve()进行一些参数的检 阅读全文

posted @ 2014-01-10 23:18 Persistence 阅读(262) 评论(0) 推荐(0)

Chap-6 6.4 进程虚拟地址空间分布

摘要: 6.4 进程虚拟空间分布6.4.1 ELF文件的链接视图和执行视图可执行文件被映射时,是以系统页的长度为单位的,每个段在被映射时的长度应该为系统页长度的整数倍。如果不是,那么多余部分也将占用一个页。一个ELF可执行文件往往有十几个段,那么内存空间的浪费是可想而知的,有没有办法来减少这种浪费?一个简单的方案就是:对于有相同权限的段,把它们合到一起当作一个段进行映射。比如有两个段分别叫做“.text”和“.init”,它们包含的分别是程序的可执行代码和初始化代码,权限相同,都是可读并且可执行。假设.text段为4097字节,.init为513字节,这两个段分别映射的话就要占用三个页面,但是,如果将 阅读全文

posted @ 2014-01-10 23:17 Persistence 阅读(453) 评论(0) 推荐(0)

Chap-6 6.1~6.3 程序装载

摘要: 6.1 进程的虚拟地址空间程序和进程的区别:程序(或者狭义上讲可执行文件)是一个静态的概念,它就是一些预先编译好的指令和数据集合的一个文件;进程则是一个动态的概念,它是程序运行时的一个过程,很多时候把动态库叫做运行时(Runtime)也有一定的含义。程序运行起来以后,将拥有自己独立的虚拟地址空间,这个虚拟地址空间的大小由计算机的硬件平台决定,具体的说是由CPU的位数决定。硬件决定了地址空间的最大理论上限,即硬件的寻址空间大小,比如32位的硬件平台决定了虚拟地址空间的地址为0到2^32 - 1,即0x00000000 ~ 0xFFFFFFFF,就是4GB的虚拟空间大小。在32位平台下的4GB虚拟 阅读全文

posted @ 2014-01-10 23:15 Persistence 阅读(172) 评论(0) 推荐(0)

导航