zoukankan      html  css  js  c++  java
  • LINUX内核分析第七周学习总结

    LINUX内核分析第七周学习总结

    标签(空格分隔): 20135328陈都


    陈都 原创作品转载请注明出处 《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000

    可执行程序的装载

    1.可执行程序时如何产生的

    • 编译器预处理
    gcc -E -o XX.cpp XX.c (-m32)//.cpp是预处理文件
    
    • 汇编器编译成汇编代码
    gcc -x cpp-output -S -o hello.s hello.cpp (-m32)//.s是汇编代码
    
    • 汇编代码编译成二进制目标文件(不可读,含有部分机器代码但不可执行)
    gcc -x assembler -c hello.s -o hello.o (-m32)
    
    • 链接成可执行文件
    gcc -o hello.static hello.c (-m32) -static
    

    2.目标文件格式ELF

    目标文件三种形式

    1. 可重定位文件(用来和其他object文件一起创建下面两种文件)——.o文件
    2. 可执行文件(指出了应该从哪里开始执行)
    3. 共享文件(主要是.so文件,用来被链接编辑器和动态链接器链)

    ELF格式:


    左半边是ELF格式,右半边是执行时的格式
    其中,ELF头描述了该文件的组织情况,程序投标告诉系统如何创建一个进程的内存映像,section头表包含了描述文件sections的信息。
    当系统要执行一个文件的时候,理论上讲,他会把程序段拷贝到虚拟内存中某个段

    装载可执行程序之前的工作

    可执行程序的执行环境

    一般我们执行一个程序的Shell环境,我们的实验直接使用execve系统调用。
    Shell本身不限制命令行参数的个数,命令行参数的个数受限于命令自身
    例如,int main(int argc, char *argv[])
    又如, int main(int argc, char argv[], char envp[])//envp是shell的执行环境
    Shell会调用execve将命令行参数和环境参数传递给可执行程序的main函数

            int execve(const char * filename,char * const argv[ ],char * const envp[ ]);
    

    装载时动态链接和运行时动态链接应用

    动态链接分为可执行程序装载时动态链接和运行时动态链接(一般使用前者)

    实验过程



    总结:Linux内核如何装载和启动一个可执行程序:

    1. 创建新进程
    2. 新进程调用execve()系统调用执行指定的ELF文件
    3. 调用内核的入口函数sys_execve(),sys_execve()服务例程修改当前进程的执行上下文;当ELF被load_elf_binary()装载完成后,函数返回至do_execve()在返回至sys_execve()。ELF可执行文件的入口点取决于程序的链接方式:
    4. 静态链接:elf_entry就是指向可执行文件里边规定的那个头部,即main函数处。
    5. 动态链接:可执行文件是需要依赖其它动态链接库,elf_entry就是指向动态链接器的起点。
      多进程、多用户、虚拟存储的操作系统出现以后,可执行文件的装载过程变得非常复杂。引入了进程的虚拟地址空间;然后根据操作系统如何为程序的代码、数据、堆、栈在进程地址空间中分配,它们是如何分布的;最后以页映射的方式将程序映射进程虚拟地址空间。

  • 相关阅读:
    面试题12:打印1到最大的n位数
    java生成指定范围的随机数
    排序
    Java中的String类和算法例子替换空格
    动态规划、贪心算法笔记
    牛客编程巅峰赛S1第2场
    UVA 489
    UVA 1339
    UVA 1587
    UVA 202
  • 原文地址:https://www.cnblogs.com/cdcode/p/5373955.html
Copyright © 2011-2022 走看看