点击最高的模板网站,本地升级wordpress,中山最好的网站建设公司,html 门户网站在linux中#xff0c;程序的加载#xff0c;涉及到两个工具#xff0c;linker 和loader。Linker主要涉及动态链接库的使用#xff0c;loader主要涉及软件的加载。 1、 exec执行一个程序 2、 elf为现在非常流行的可执行文件的格式#xff0c;它为程序运行划分了两个段程序的加载涉及到两个工具linker 和loader。Linker主要涉及动态链接库的使用loader主要涉及软件的加载。 1、 exec执行一个程序 2、 elf为现在非常流行的可执行文件的格式它为程序运行划分了两个段一个段是可以执行的代码段它是只读可执行另一个段是数据段它是可读写不能执行。 3、 loader会启动通过mmap系统调用将代码端和数据段映射到内存中其实也就是为其分配了虚拟内存注意这时候还不占用物理内存只有程序执行到了相应的地方内核才会为其分配物理内存。 4、 loader会去查找该程序依赖的链接库首先看该链接库是否被映射进内存中如果没有使用mmap将代码段与数据段映射到内存中否则只是将其加入进程的地址空间。这样比如glibc等库的内存地址空间是完全一样。 因此一个2M的程序执行时并不意味着为其分配了2M的物理内存这与其运行了的代码量与其所依赖的动态链接库有关。 运行过程中链接动态链接库与编译过程中链接动态库的区别。 我们调用动态链接库有两种方法一种是编译的时候指明所依赖的动态链接库这样loader可以在程序启动的时候来所有的动态链接映射到内存中一种是在运行过程中通过dlopen和dlfree的方式加载动态链接库动态将动态链接库加载到内存中。 这两种方式从编程角度来讲第一种是最方便的效率上影响也不大在内存使用上有些差别。 第一种方式一个库的代码只要运行过一次便会占用物理内存之后即使再也不使用也会占用物理内存直到进程的终止。 第二中方式库代码占用的内存可以通过dlfree的方式释放掉返回给物理内存。 这个差别主要对于那些寿命很长但又会偶尔调用各种库的进程有关。如果是这类进程建议采用第二种方式调用动态链接库。 mmap和vma相关和底层的驱动相关 如果用户的空间映射到虚拟内存大块的映射 用mmap 驱动需要做一个简单的线性的设备内存映射, 到一个用户地址空间, remap_pfn_range 几乎是所有你做这个工作真正需要做的. 下列的代码从 drivers/char/mem.c 中得来, 并且显示了这个任务如何在一个称为 simple ( Simple Implementation Mapping Pages with Little Enthusiasm)的典型模块中进行的. static int simple_remap_mmap(struct file *filp, struct vm_area_struct *vma)
{if (remap_pfn_range(vma, vma-vm_start, vm-vm_pgoff,vma-vm_end - vma-vm_start,vma-vm_page_prot))return -EAGAIN;vma-vm_ops simple_remap_vm_ops;simple_vma_open(vma);return 0;
} 如你所见, 重新映射内存只不过是调用 remap_pfn_rage 来创建必要的页表.