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

  • 相关阅读:
    Silverlight 4中把DataGrid数据导出Excel
    C#正则的委托和lambda表达式用法
    C#简单的写日志方法
    GAE上传失败
    asp.net后台进程做定时任务
    ASP.NET页面生命周期描述
    巴士电台新版发布
    jQuery 1.51.7一些值得注意的更新
    wxPython应用心得
    Ajax保留浏览器历史的两种解决方案(Hash&Pjax)[转]
  • 原文地址:https://www.cnblogs.com/minihaohao/p/5175017.html
Copyright © 2011-2022 走看看