编译过程:

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了,不是在Cygwin,也不是在虚拟机里,而是使用MinGW.

下面是在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,这种方式比较麻烦,但是想想自己也能做一个PE Loader,还是满有成就感的,尽管这是一个最简单的Loader.代码是加在Linux-0.11-With-PE-Loader\boot目录下的setup.asm文件里,里面有详细的注释.

5.对tools下的build.c作了修改,使其能生成可引导的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函数不是一个普通的函数,MinGW gcc会对它作特殊的处理.解决的办法其实也很简单,把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内核完全注释的作者赵炯博士,是他拉接了操作系统与操作系统爱好者的距离.

最后,我也非常想和操作系统爱好者们共同交流心得体会,也希望能多认识一些朋友.

我的网名:flyfish

我的QQ:785606288

E-mail:I2CBus@126.com

另外,要转载请保持本文件的完整性,请尊重别人的劳动果实.

修改日志:

08/3/29

修改了一下Makefile,旧的Makefile在某些文件更新后还会重新编译。

修改了Trans.cpp中的一个dug,该dug在translate MinGW gcc编译的程序时可能会出错。用MinGW gcc 编译的程序的VirtualAddress的形式可能是0xFFC1000这样的形式,其实0x1000才是它的VirtualAddress

08/4/2

修改了下MinGW32.bat,现在已经不用重设路径了。

08/4/4

Trans.cpp还是有错,如果VirtualAddress>0xffff,那么生成的system.bin就错了,bochs调试时会一直重启。

权宜之计,把0xffff再改成0x3ffff,这样VirtualAddress就不能大于0x3ffff,不知谁有更好的解决方法,

windows下编译linux内核,windows上可编译Linux内核相关推荐

  1. linux32位运行64位程序,32位windows下可以运行的程序在64位linux下报错

    已结贴√ 问题点数:20 回复次数:3 32位windows下可以运行的程序在64位linux下报错 filt.c在32位windows code:blocks 10.05下运行无任何异样. 传到64 ...

  2. Easy bcd有没Linux版本,Windows下使用EasyBCD和LiLi USB Creator安装Linux系统

    Windows下使用EasyBCD和LiLi USB Creator安装Linux系统 写在前面:针对BIOS出现故障或者对U盘启动安装不是很熟练的朋友而写. 使用Win10朋友大多数使用UEFI启动 ...

  3. Windows下通过 Uboot TFTP 方式下载和启动rt-smart 内核

    Windows下通过 Uboot TFTP 方式下载和启动rt-smart 内核 i.MX6ULL 系列处理器启动方式多样,启动时会首先执行芯片内部 Boot ROM 中的程序.Boot ROM 会根 ...

  4. 一文带你学会linux系统 史上最全linux命令大全

    一文带你学会linux系统 史上最全linux命令大全 文章目录 linux系统简介 linux命令 1.启动网络命令 2.pwd命令 2.ls命令 3.cd命令 4.mkdir命令 5.rmdir命 ...

  5. 使用Ant将windows下开发的Struts2应用直接部署到Linux上

    1. 首先下载ant,网上搜一下即可,我下的是apache-ant-1.9.4 2. 下载SSH支持包 能够通过windows直接将文件复制到Linux上是使用Linux的SSH协议完成的,因此首先需 ...

  6. Linux和windows下minio+springboot实现文件服务器上传下载和nginx反向代理

    1 minio服务器的安装 在下载minio.exe文件: windows安装minio服务器:MinIO | Code and downloads to create high performanc ...

  7. Windows下编写php扩展(二)将linux下的php-cpp项目移植到windows

    引言 linux下的php-cpp项目,这个项目生成动态链接库,使用这个动态链接库,可以快速地用C++开发php扩展.相比较php官方提供的,用c语言开发php扩展方案.php-cpp使得开发php扩 ...

  8. 图解Windows下使用SSH Secure Shell Client远程连接Linux

    SSH是一个用来替代TELNET.FTP以及R命令的工具包,主要解决口令在网上明文传输的问题. 一 下载安装SSH Secure Shell Client 按常规操作很快即可下载安装完成.安装后开始菜 ...

  9. 在Windows下使用CMake+MinGW搭建C/C++编译环境

    转载自:https://blog.csdn.net/isscollege/article/details/78038921?locationNum=8&fps=1 1 工具介绍 作为一款执行效 ...

  10. windows下IDEA全面红色,但是能编译,不能智能提示

    文章目录 1.背景 2. 场景再现2 1.背景 因为需要,我们需要将mac下开发的一套代码,放到windows上开发,IDEA下的Java项目,放到windows下后,能正常编译,能运行,但是页面飘红 ...

最新文章

  1. linux 中如何将文件粘贴到usr下的lib内,学会在Linux下GCC生成和使用静态库和动态库...
  2. sublime Text 2 配置以及 Python环境搭建
  3. 深度学习激活函数比较
  4. Windows安装配置tidevice
  5. dirwatcher java_commonIO
  6. 街电与搜电网络营销外包合并,怪兽充电终上市共享充电市场将迎来新变化
  7. linux 内存 shared,Linux Shared Memory的查看与设置
  8. PyTorch | 保存和加载模型教程
  9. mysql 导入日期 0000_解决Excel导入MySQL日期为0000-00-00
  10. 专业App开发:设计App图标的三个关键点
  11. JAVA设置流中当前位置_java文件流的问题!急
  12. web前端移动开发必须知道那些基础
  13. python3 tkinter 桌面软件教程
  14. php动态web开发技术,PHP动态Web开发技术
  15. mysql与java编写人事管理系统,java+mysql企业人事管理系统的设计
  16. 利率交換 IRS 估值 (1) 前言
  17. Blend 设置通明窗体
  18. debug断点调试进不去
  19. Fiddler实现苹果手机APP抓包
  20. 100以内的质数及100以内质数的和

热门文章

  1. python 石头剪刀布小游戏(适合入门)
  2. JDK13中将增加文本块特性
  3. 小米4联通版刷flyme,工程模式无法选择网络
  4. NVIDIA Jetson Xavier NX刷机+ROS安装+深度学习配置
  5. 爱之物语(中英对照)
  6. 学会这几个cmd命令,女神也会偷偷爱上你!
  7. 关于口头语和书面语的区别
  8. ES 词库热更新(实现方式一:远程词库)
  9. 【OSTEP】分段(Segmentation) | 地址分段 | 带分段的地址转换
  10. 一个注释甜美的分页插件(原生js)