目录
操作系统角度理解
如何加载
怎么管理库
编址
操作系统角度理解
如何加载
首先main想要运行,首先要为main创建task_struct和mm_struct,然后将main的代码和数据加载到内存,将main的代码通过页表映射到mm_struct的正文代码段,看这个程序运行是需要哪些动态库,将这些动态库加载到内存中,建立映射到共享区。
如果另一个程序也需要使用libmymath.so,直接用该程序页表建立一个该程序的共享区到libmymath.so的映射,本质libmymath.so只有一份,谁想用谁就和libmymath.so建立映射就完了。
怎么管理库
对库的管理依旧采用面相对象,现描述再组织,抽离出库的主要信息,用链表连接起来。
struct loadlib
{char *libname;void *libadress;uint64_t time;struct loadlib *next;
}
编址
一个可执行程序,不是在其加载到内存的时候他才有地址,而是在编译完成后,程序的每一行的代码就已经有属于自己的地址了。
使用size命令查看
我们发现一个文件的代码,数据,已初始化的数据,未初始化的数据的大小已经规定好了,这说明即使程序未被加载到内存,可执行程序已经存储好初始进程地址空间的数据了!!!!
再来谈谈是如何编址的。
在liunx下程序的编址采用绝对编址--平坦模式。
我们可以查看每一行汇编代码的地址,是从0开始进行编址,
记录每个函数的起始位置,然后在这个位置之后,向后排。
记录代码区和数据区的起始,然后向后编址