真正能在windows下编译的linux 0.11,不是在Cygwin,也不是在虚拟机里!

一、简介  
这就是能在 windows 环境下直接 编译 的Linux 0.11了,不是在Cygwin,也不是在虚拟机里,而是使用MinGW gcc,
这是GNU gcc在Windows下的移植版本.在old linux 上的论坛看见有许多人在问怎样在Windows下直接编译,
最佳答案应该是使用Cygwin,现在看来这个最佳答案该改了。本编译环境源代码加上gcc编译器压缩后才4.2兆。
二、编译过程:

1.  解压后默认的文件夹位置是在D:\Linux-0.11,如果你不是将文件解压到该目录下,
     你要修改MinGW32目录下的MinGW32.bat文件,将里面的PATH指向MinGW32的bin目录. 
2.  打开Linux-0.11目录,双击MinGW32.bat快捷方式,打开控制台.
3.  make 一下,生成1.44M的Boot.img软盘镜像,要清除编译结果请"make clean"
4.  如果安装了 bochs ,直接双击bochsrc.bxrc即可运行Linux-0.11了.
5.  也可用其它虚拟机 加载 Boot.img后运行,如果出现Kernel panic,请把虚拟机里的硬盘删了
6.  在出现Insert root floppy and press ENTER以后,将rootimage-0.11.img载入虚拟软驱,回车


三、在Windows下编译Linux 0.11会遇到的问题和对原文件作的修改:

1.赵炯博士已经将汇编程序中引用的C变量(包括嵌入汇编的C变量)的下划线去掉了,但MinGW的gcc可能是为了与其它Windows下的编译器
  保持兼容,并不能识别这些不带下划线的C变量,因而还得把原先已经在汇编程序中去掉下划线的C变量加上下划线,同时也要把被C程序
  引用的汇编程序中的变量加上下划线.

2.MinGW中不带as86编译器,因而把boot目录下原先用as86编译的bootsect.s和setup.s两个程序修改成能用nasm编译的程序.
  并且更名为bootsect.asm和setup.asm.

3.在Makefile作的主要修改:
  在LDFLAGS中加了--image-base 0x0000  将elf_i386改成i386pe
  将cd 与 make 之间的;改成&,如cd  kernel  ; make 改成cd kernel & make
  MinGW中没有sync这个程序,可以把它注释掉,更简单的办法是写一个sync.c,这个sync.c只包含一个空的main函数,编译成sync.exe
  因为类似的原因,make dep会出错   

4.生成的system文件是PE格式的(PE是Portable Executable的简称),这是windows下的可执行文件的格式,显然是不能直接执行的,
  必须加以转化.我实现了通过两种方式加以转化.
1)写一个程序Trans.cpp将system.exe里的代码和数据从PE文件里解析出来,生成一个system.bin文件,这个文件是能被setup模块
  加载的.我已经将这个程序放在了Linux-0.11的tools目录下,要微软的编译器编译.
2)自己写一个PE Loader,这种方式比较麻烦,实现原理却和Trans.cpp差不多,只是要用汇编来写.
  但是当Linux-0.11真的能运行的时候,还是满有成就感的.
  尽管这是一个最简单的Loader.代码是加在Linux-0.11-With-PE-Loader\boot目录下的setup.asm文件里,里面有详细的注释.

5.对tools下的build.c作了修改,使其能在windows下生成可引导的1.44M的软盘镜像文件Boot.img

6.在Link的过程中,init目录下的main.c会出现以下错误:
boot/head.o(.text+0x540c):fake: undefined reference to `_main'
init/main.o(.text+0x16f):main.c: undefined reference to `_alloca'
init/main.o(.text+0x174):main.c: undefined reference to `__main'
make: *** [tools/system.exe] Error 1
第一个和最后一个错误还好理解,但中间那个错误那就莫明其妙了,因为Linux 0.11根本没有这个函数,在gcc的编译选项里
也有-nostdinc .有一个解释是main函数不是一个普通的函数,为了使main能正常运行,至少要加alloca这个内存分配函数.解决的办法其实也很简单,
把main.c下面的main函数改名为_main,或者是干脆把它改成另外一个函数,就改成start吧.记得把head.s里的_main也改了.

在最后,要感谢《自己动手写操作系统》的作者于渊,其实我也是先将原先只能在Linux下编译的书里源代码
用MinGW移植到Windows下编译的过程中才试着在Windows下编译Linux 0.11源代码的.
有了在Windows下编译Linux 0.11源代码的经验,移植高版本的源代码,像0.12,0.95,0.96等等版本应该不会有太大的麻烦了。
也要感谢《Linux 内核 完全注释》的作者赵炯博士,是他写了这样一本务实的书,并且不余余力的对操作系统爱好者加以帮助,
包括建了一个很好的论坛。当然,能编译源代码并不等于对源代码都懂了,这离真正完全理解源代码还很远。
我想源代码还有许多地方是值得我去细细深究的。当然有了能直接在Windows下编译的Linux源代码,我想整个进展会快得多。
碰到模糊不清的地方,改改源代码,加加printf,make ,几秒钟的事情。bochs调试,再make,再调试。。。
我也非常想和操作系统爱好者们共同交流心得体会,借此也希望能多认识一些朋友。
我的网名:flyfish
我的QQ:785606288
E-mail:I2CBus@126.com

[ 本帖最后由 log10 于 2008-4-4 17:39 编辑 ]

LINUX GCC下载


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
带中文注释可成功编译运行的Linux0.11+Bochs2.62实验环境说明 此注释以网上获得的“linux带中文注释的0.11版本”为基础,对照赵炯博士《Linux内核完全注释(0.11) 》V3.0版(http://oldlinux.org/download/clk011c-3.0.pdf)编辑而成。作为对赵博士感谢,以及对Linux初学者的回馈,特发布在CSDN上。 此注释可以在http://oldlinux.org/Linux.old/bochs/提供的Linux-0.11-devel-XXXXXX实验环境下正确编译成功,使用:"make disk"命令重启Bochs虚拟后,新编译源码直接生效,便于学习者直接阅读源码,直接进行实验。 注意事项: 1、为了使注释版与实验环境上的Linux0.11内核保持一致,达到对应文件可以互换的目的,与Linux0.11原始版本相比,加入了15个系统调用函数(参见include/Linux/sys.h第78-92行。赵博士原书没有这部分注释,我不敢班门弄斧),其它相关的文件加入了相应的定义。新加入的代码只有函数体定义,没有具体实现,对其它原始代码没有改变、没有影响。 2、键盘定义改成了美式键盘(原始代码中是芬兰键盘,会导致个别键出问题,调试的时候我曾被迷糊了好久,以为自己把程序搞乱了)。 3、把网上VC版的注释统一改成了 “/* */” 格式的注释。经测试,在Linux0.11实验环境中(gcc1.40),只有标准C注释语法可以正常编译。 4、由于《Linux内核完全注释(0.11) 》原书版本更新的原因,注释中提到的图、表可能与V3.0版书中不一致。 5、由于代码中加入注释,代码行号发生变化,注释中提到的代码行号会出现不一致,建议对照3.0版查询对应内容。 6、实验方法:请先安装附带的Bochs2.62版安装包,双击Test.bxrc即可启动实验系统,执行命令:sh t,即可完成对linuxcn的编译。 7、linux目录中是此实验系统中/usr/src/linux提取出来的不含中文注释的linux0.11源码(此版本比原始的0.11版多15个系统调用函数),linuxcn是加入了中文注释的源码。 8、diskb.img是实验系统与Windows环境下进行文件交换的1.44M软盘映像,执行脚本命令"sh t"时会自动从此映像中读取linux.tar、linuxcn.tar包,解包并编译编译结果在:/usr/root/zw/linuxcn目录下。为了方便文件交换,建议使用7zip为压缩/解压缩工具(7zip可以直接生成tar包),用WinImage实现Windows环境与软件映像交换文件。 9、实验系统下 .profile中加入了几个命令,请读者注意。 10、若实验环境的启动盘被破坏,请用压缩包中的bootimage-0.11-hd覆盖对应文件即可。 11、若实验环境的要命文件系统被破坏,请用压缩包中的hdc-0.11-new.img覆盖对应文件即可。 2014-5-4 cyfx2288

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值