01GCC编译工具链
Posted xuan01
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了01GCC编译工具链相关的知识,希望对你有一定的参考价值。
GCC工具编译链:
一步到位:
gcc helloworld.c -o helloworld
中间流程:
gcc helloworld.c -E -o helloworld.i //预处理cpp:加入头文件,替换宏 gcc helloworld.c -S -c -o helloworld.s //编译egcs:包含预处理,转化为汇编程序 gcc helloworld.c -c -o helloworld.o //汇编as:包含预处理和编译,将汇编程序转化为可链接的二进制程序; gcc helloworld.c -o helloworld //链接ld:包含以上所有操作,将可链接的二进制程序和其他的库链接在一起,形成可执行的程序文件;
反汇编:
objdump -d helloworld
NASM编译器:
Netwide Assembler (简称 NASM)是一款基于英特尔 X86 架构的汇编与反汇编工具。它可以用来编写 16 位、32 位(IA-32) 和 64 位(x86-64)的程序。NASM 被认为是 Linux 平台上最受欢迎的汇编工具之一。
hello OS
- PC机引导流程:PC 机 BIOS 固件是固化在 PC 机主板上的 ROM 芯片中的,掉电也能保存,PC 机上电后的第一条指令就是 BIOS 固件中的,它负责检测和初始化 CPU、内存及主板平台,然后加载引导设备(大概率是硬盘)中的第一个扇区数据---主引导记录(Master boot record,缩写为MBR),到 0x7c00 地址开始的内存空间,再接着跳转到 0x7c00 处执行指令,在我们这里的情况下就是 GRUB 引导程序。(why 0x7c00? 为什么主引导记录的内存地址是0x7C00? - 阮一峰的网络日志 (ruanyifeng.com))
- 引导汇编代码:用汇编代码处理c语言的工作环境;代码分为四段:用汇编定义的GRUB的多引导协议头(一定格式的数据);关中断,设定CPU的工作模式;初始化CPU寄存器和C语言的运行环境;CPU工作模式所需要的数据;
- 主函数:上述汇编代码在第三段调用了main主函数,这段代码是由nasm和GCC编译成可链接模块,由LD链接在一起,形成可执行程序文件;
#include "vgastr.h" void main() printf("Hello OS!"); return;
注意:此处的main函数和printf不是应用程序中的,而是Hello OS中的;
- 控制计算机屏幕:集显:集成在主板上;核显:集成在CPU;独显:通过PCIE(peripheral component interconnect express) 接口链接的显卡,性能依次上升;无论 PC 上是什么显卡,它们都支持一种叫 VESA 的标准,这种标准下有两种工作模式:字符模式和图形模式。显卡们为了兼容这种标准,不得不自己提供一种叫 VGABIOS 的固件程序。显卡的字符模式的工作细节:它把屏幕分成 24 行,每行 80 个字符,把这(24*80)个位置映射到以 0xb8000 地址开始的内存中,每两个字节对应一个字符,其中一个字节是字符的 ASCII 码,另一个字节为字符的颜色值;
void _strwrite(char* string) char* p_strdst = (char*)(0xb8000);//指向显存的开始地址 while (*string) *p_strdst = *string++; p_strdst += 2; return; void printf(char* fmt, ...) _strwrite(fmt); return;
printf函数直接调用了_strwirte函数;
- make工具:读取makefile文件,该文件写好的了构建软件的规则,工具能根据这些规则自动化构建软件;makefile 文件中规则是这样的:首先有一个或者多个构建目标称为“target”;目标后面紧跟着用于构建该目标所需要的文件,目标下面是构建该目标所需要的命令及参数。第一次构建目标后,下一次执行 make 时,它会根据该目标所依赖的文件是否更新决定是否编译该目标,如果所依赖的文件没有更新且该目标又存在,那么它便不会构建该目标。这种特性非常有利于编译程序源代码。
- 编译:
- 安装OS:得到hello OS.bin文件;要让GRUB找到它,才能在计算机启动项加载它。GRUB会在启动时加载一个grub.cfg文件;将hello OS的启动项插入到该文件末尾;,然后将之前的bin文件复制到boot目录下;下面代码是查询boot目录挂载的分区。
df /boot/
上机实验见下节。
以上是关于01GCC编译工具链的主要内容,如果未能解决你的问题,请参考以下文章
Ubuntu配置交叉编译环境(配置交叉编译工具链)配置arm-linux-gcc交叉编译工具链(添加交叉编译工具链(toolchain)到环境变量)
Ubuntu配置交叉编译环境(配置交叉编译工具链)配置arm-linux-gcc交叉编译工具链(添加交叉编译工具链(toolchain)到环境变量)