开心happy

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

  在研究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执行。

posted on 2016-02-01 12:11  开心happy  阅读(637)  评论(0编辑  收藏  举报