机缘巧合,在网上发现了清华大学的操作系统mooc课程,该课程中用了清华自己改造的ucore内核。官方在github上给出了在真机上搭建开发环境的步骤,我在linux平台上可以成功搭建。但依据官方步骤,进行“brew install i386-elf-gcc"时却出现了错误,原来osx默认用的是clang编译器,而不是gcc编译器。要用homebrew安装gcc49,make时使用cc,和cxx选项来进行configure。我的configure命令如下:
./configure --disable-nls --target=i386-elf --disable-werror --enable-gold=yes --prefix=/usr/local/Cellar/i386-elf-binutils/2.23 CC=/usr/local/Cellar/gcc49/4.9.2_1/bin/gcc-4.9 CXX=/usr/local/Cellar/gcc49/4.9.2_1/bin/g++-4.9
但即使使用了gcc,依然会出现错误,大致意思是在编译依赖库binutils-2.23时,该库elfcpp文件夹下的elfcpp_swap.h中找不到bswap_16的定义。我估计这是因为osx的头文件在细节上与标准linux不同的缘故导致。解决方法也很简单,解压binutils-2.23,并找到出错的文件,在文件头部末尾,即正式程序代码之前加入
#include <libkern/OSByteOrder.h>
#define bswap_16(x) OSSwapInt16(x)
#define bswap_32(x) OSSwapInt32(x)
即可,或者删除HAVE_BYTESWAP_H条件编译部分,强制程序使用内部定义的bswap_16函数。(没有试过)
并使用homebrew的给出的配置选项进行configure,然后进行make,并make install 。再用homebrew进行link,再安装i386-elf-gcc即可成功。
附上官方安装步骤:
1.install homebrew
2.install binutils, gcc, gdb targeting i386-elf
brew tap altkatz/homebrew-gcc_cross_compilers
brew install i386-elf-gcc //may take an hour
brew install i386-elf-gdb