操作系统的系统调用
应用程序是可执行文件(程序的二进制代码和数据)和其他数据文件,linux支持多种可执行文件格式,ELF(Executable Linkable Format)是最常用的格式。
关于ELF二进制文件,它是操作系统的一个对象,操作系统提供API打开,读取,改写对应文件,可以使用vim,cat,xxd等命令查看这个可执行文件。
查看ELF二进制文件。
vi /bin/ls
解析二进制文件。主要关注文件的header,包括文件内容的分布,指令集体系的结构,入口地址。
readelf -h查看文件头数据, -l程序头
查看elf的文件:vi /usr/include/elf.h
file查看
运行的程序叫做进程。操作系统中有很多进程对象,在运行时,程序会在cpu上执行,进行计算,使用操作系统API访问操作系统的其他对象。ps查看系统进程。
file #查看文件类型
coreutils,unilix的核心工具包
c程序的测试
gdb使用,gdb的手册地址:
https://sourceware.org/gdb/documentation/
gcc使用,c和c++的的编译器。
ld的使用,gnu链接器,将目标文件或者库链接为可执行程序或者库文件。
ld hello.o
ld: warning: cannot find entry symbol _start; defaulting to 00000000004000b0
hello.o: In functionmain': hello.c:(.text+0xa): undefined reference to
puts’
puts
objdump查看object文件信息。
- objdump -d 将代码段反汇编;
- objdump -S < file> 代码反汇编的同时,将反汇编代码与源代码交替显示,编译时需要使用-g参数,即需要调试信息;
什么事C语言的运行环境。
- 将c语言代码编译/链接成为ELF目标文件的命令
- 二进制文件在bare-metal上运行必要的其它部件
- 生成系统镜像文件的脚本。
- 平台相关的启动脚本。
x86 Family: CPU Reset行为
CPU Reset(官方手册:),reset之后,寄存器会有初始状态。例如EIP=0x0000fff0; CR0=0x60000010,并且处于16-bit模式。EFLAGS=0x00000002,且中断处于关闭状态。cpu和固件厂商达成的协议,硬件厂商,把固件以内存映射的方式,映射到地址上,因此固件程序就可以执行了。Firmware(固件):BIOS vs UEFI(都是硬件生产厂商的在计算机系统里写入的固件)
Legacy BIOS把引导盘(第一个可以启动的设备)的第一个扇区(主引导扇区,512Bytes)加载到内存的7c00位置。处理器处于16-bit模式,没有其他的任何约束。代码的执行权交付出去,软件和硬件之间的桥梁。