
目录采用ELF格式的文件ELF结构可执行程序的加载采用ELF格式的文件可重定位文件Relocatable File即xxx.o 文件。包含适合于与其他目标文件链接来创 建可执行文件或者共享目标文件的代码和数据。可执行文件Executable File即可执行程序。共享目标文件Shared Object File即 xxx.so文件。内核转储(core dumps)存放当前进程的执行上下文用于dump信号触发。ELF结构ELF头(ELF header)用于定位文件的其他部分。程序头表(Program header table)记录有效段(segment)和他们的属性。包括开始的位置位移长度。节头表(Section header table)记录节(section)的属性。节(Section)记录各种数据比如可执行代码全局变量等。ELF格式同时服务于两个完全不同的阶段链接阶段执行阶段所以故意设计成两种视图。从源代码到可执行程序的过程是这样的。1.将源代码编译成.o文件由编译器完成。2.将.o文件和库链接由链接器完成。这个过程通过ELF文件的链接视图将拥有相同属性的节合并不绝对成segment段。具体合并原则被记录在 了 ELF 的 程序头表(Program header table) 中。3.内核根据 program header table 装载运行。可执行程序的加载创建一个进程先创建内核中进程相关的数据结构再加载ELF格式的二进制文件。编译器只产生相对偏移 重定位需求链接器才真正分配虚拟地址并把它们固定或相对固定写进最终的 ELF 文件中。可执行程序从磁盘上加载到物理内存中每行代码都有自己的虚拟地址ELF和物理地址物理内存。没有加载就只有虚拟地址ELF。cpu从哪开始执行ELF的head中有一个Entry point address对应的是代码段的开始cpu从此开始执行。cpu读到某个需要跳转的函数的虚拟地址后将虚拟地址给MMUMMU通过寄存器CR3查页表就拿到了物理地址便可以读取相应的内容。所以进cpu的都是虚拟地址出来的是物理地址。用户写源代码编译器编译这个过程会产生相对偏移的编译完成有了ELF格式链接器链接链接完成有了真正的虚拟地址形成可执行程序。ELF包括了某些权限相同的节组成的段还有什么代码段的开始将来给cpu的。此刻可执行程序在磁盘中。可执行程序要加载先通过加载器到虚拟地址空间填页表按需分配物理内存建立起映射关系其中那个ELF程序头表就是给加载器看的吧。之后通过内核调度给cpu第一条虚拟地址通过页表的映射关系找到物理地址进行读写。如果物理地址没有数据触发缺页中断内核再次到磁盘读写数据到物理内存。碰到函数的调度就需要将虚拟地址给MMUMMU通过CR3查页表转换成物理地址再次读写。一张浅浅的流程图