zoukankan      html  css  js  c++  java
  • Linux应用程序的装载和执行

      在研究c文件的编译/装载/运行之前,先了解ELF文件的概念,ELF(Executable and Linking Format)是一种对象文件的格式。ELF文件格式是UNIX系统实验室作为应用程序二进制接口而开发发布的,是Linux的主要可执行文件格式。

      简单来说,ELF是“编译器/连接器”和“内核/CPU”之前的二进制接口,一种固定下来的文件格式。编译链接器将C程序编译为对应体系结构下的机器可执行文件,而这种文件和CPU以及内核按照ELF格式来约定,比如代码段/数据段/bss段就是在ELF文件中写明。内核在加载时,读取按照ELF文件格式读取各段内容到物理内存上,建立好自己的内存映射表,准备好进程环境,将各段的内存地址写入CPU寄存器上,然后调度开始,我们的程序就占据了CPU,CPU按照流水线一句接着一句的执行我们编译出来代码段的指令。

      于是,一句“hello world”想要在arm和x86上执行,内核和编译器在其中起了什么作用么?

      arm-linux-gcc hello.c -o hello_arm

      使用arm的gcc编译工具链,生成arm下的可执行文件hello_arm。使用file命令查看hello_arm文件的属性,看到hello_arm就是arm的ELF文件。

      在bash上执行./hello_arm,内核将hello_arm中的数据段/代码段/bss段等加载到物理内存上,并为hello_arm建立好进程环境,将CPU的数据段寄存器/代码段寄存器/堆栈段寄存器值写为实际的物理内存地址,然后将控制权交给ARM CPU,由arm的CPU开始执行我们的可执行文件。

      对比到x86上,唯一变化的是要使用x86的编译器就C代码编译成X86机器指令组成的可执行文件,然后交由x86内核加载,由x86 CPU执行。

  • 相关阅读:
    对实时的视屏流进行处理
    opencv读取并播放avi视屏
    opencv中读取显示图像
    为什么既要有IP地址还要有MAC地址
    继承中构造、析构 与 拷贝构造、赋值中的调用区别
    拷贝构造函数和赋值符函数——转
    inline修饰虚函数的问题
    菱形继承产生的问题及解决
    迭代器模式
    备忘录模式
  • 原文地址:https://www.cnblogs.com/minihaohao/p/5175017.html
Copyright © 2011-2022 走看看