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执行。

  • 相关阅读:
    python多线程爬取图片二
    python多线程爬取图片实例
    python3的类
    简单的python爬虫实例
    简单的python多线程实例
    webapi 下载Ftp文件并返回流到浏览器完成文件下载
    .net 配置Swagger
    IDEA 发布Api
    MySql 查询表结构信息
    解决js的 Math取正弦值 余弦值不准确的问题
  • 原文地址:https://www.cnblogs.com/minihaohao/p/5175017.html
Copyright © 2011-2022 走看看