# 目标: 创建开发环境,构建内核 如果你使用的是 Mac 系统,就需要些步骤。一旦我们使用高级语言(C 语言) 就需要跨平台编译,[具体参见][1]。 我们使用 GCC 来进行编译,请参考教程 [GCC Cross-Compiler][2]。因为 Mac 系统中 gcc 已经被 clang 所取代,所以我们需要自己安装 gcc, 并设置环境。 # 安装步骤 ## 0. 安装依赖包 首先安装 [brew][0] 工具, 然后使用 `brew install` 安装如下包 1. gmp - GNU multiple precision arithmetic library 2. mpfr - C library for multiple-precision floating-point computations 3. libmpc - C library for the arithmetic of high precision complex numbers >>> configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+ >>> ## 1. 设置安装目录及前缀 我的安装目录设置为 `/usr/local/i386elfgcc`, 然后把需要安装的 gcc 和 binutils 工具的命令都加上前缀`i386-elf-`, 避免跟系统的起冲突。 ```sh export PREFIX="/usr/local/i386elfgcc" export TARGET=i386-elf export PATH="$PREFIX/bin:$PATH" ``` ## 2. 下载 binutils 和 gcc 源码包 创建目录 `mkdir /tmp/src` ```sh cd /tmp/src curl -O http://ftp.gnu.org/gnu/binutils/binutils-2.24.tar.gz tar xf binutils-2.24.tar.gz curl -O https://ftp.gnu.org/gnu/gcc/gcc-13.3.0/gcc-13.3.0.tar.xz tar xzf gcc-13.3.0.tar.xz ``` ## 3. 编译和安装 ```sh cd /tmp/src mkdir binutils-build cd binutils-build ../binutils-2.24/configure --target=$TARGET --enable-interwork --enable-multilib --disable-nls --disable-werror --prefix=$PREFIX 2>&1 | tee configure.log make all install 2>&1 | tee make.log cd /tmp/src mkdir gcc-build cd gcc-build ../gcc-13.3.0/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --disable-libssp --enable-languages=c --without-headers make all-gcc make all-target-libgcc make install-gcc make install-target-libgcc ``` # 使用 使用的命令如下: ![cross-gcc](https://img2023.cnblogs.com/blog/376834/202412/376834-20241205164135401-1223605732.png) ## 编译 ```sh i386-elf-gcc -ffreestanding -c kernel/main.c -o kernel/main.o ``` 使用 `i386-elf-objdump -d main.o` 来检查编译出来的机器码 ![comile-oper](https://img2023.cnblogs.com/blog/376834/202412/376834-20241205174838571-1626027210.png) ## 链接 使用命令 `i386-elf-ld -o kernel.bin -Ttext 0x0 -e main main.o` 来链接 ![img](https://img2023.cnblogs.com/blog/376834/202412/376834-20241205175337429-2093414393.png) ## 反汇编 `ndisasm -b 32 kernel.bin` [0]: https://brew.sh/ [1]: https://wiki.osdev.org/Why_do_I_need_a_Cross_Compiler%3F [2]: https://wiki.osdev.org/GCC_Cross-Compiler