1. 程式人生 > >真正能在windows下編譯的linux 0.11,不是在Cygwin,也不是在虛擬機器裡!

真正能在windows下編譯的linux 0.11,不是在Cygwin,也不是在虛擬機器裡!

一、簡介  
這就是能在windows環境下直接編譯的Linux 0.11了,不是在Cygwin,也不是在虛擬機器裡,而是使用MinGW gcc,
這是GNU gcc在Windows下的移植版本.在oldlinux上的論壇看見有許多人在問怎樣在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:[email protected]

LINUX GCC下載

相關推薦

真正windows編譯linux 0.11是在Cygwin,是在虛擬機器

一、簡介  這就是能在windows環境下直接編譯的Linux 0.11了,不是在Cygwin,也不是在虛擬機器裡,而是使用MinGW gcc,這是GNU gcc在Windows下的移植版本.在oldlinux上的論壇看見有許多人在問怎樣在Windows下直接編譯,最佳答

Golang 在windows編譯Linux可執行檔案

Golang 支援交叉編譯,在一個平臺上生成另一個平臺的可執行程式,最近使用了一下,非常好用,這裡備忘一下。 Windows 下編譯Linux 64位可執行程式 SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go

windowsmysql-8.0.11-winx64.zip安裝教程詳解

到官網直接下ZIP包:https://dev.mysql.com/downloads/1、解壓ZIP到一個目錄,比如“d:\mysql-8.0.11-winx64"。2、配設my.ini檔案:我們發現解壓後的根目錄下沒有這個檔案,那我們可以自行建立。my.ini基本配置:[m

Windows編譯eXosip、osip以及UAC和UAS的例子

osip2.dll osipparser2.lib osipparser2.dll 第三步,解壓,編譯eXosip 進入libeXosip2-3.6.0\platform\vsnet目錄,用VS2010直接開啟eXosip.sln檔案,專案自動轉換: 1.將osip2.lib,osip2

Windows編譯使用Android NDK呼叫SO檔案

下載後把壓縮包解壓出來,例如:D:\ndk,目錄下的ndk-build.cmd就是用來編譯的批處理命令。 這裡以D:\ndk\samples\hello-jni為例,開啟D:\ndk\samples\hello-jni\jni\hello-jni.c檢視程式碼: /* * Copyri

windows編譯arm-linux

arm 分享圖片 ext tps 工具 習慣 技術分享 down c++ 本文主要參考:在windows環境下,使用Eclipse和gcc-Linaro工具鏈,對BeagleBone進行交叉編譯和遠程部署 不習慣在linux編譯代碼,所以想在windows下整個環境出來。

Windows編譯Yolov3(CUDA9.1+cudnn7.0+OpenCV 3.1.0

按照官網給出CUDA9.1+cudnn7.0+OpenCV 3.1.0的版本安裝 1 安裝CUDA 9.1 預設位置安裝後發現環境變數自動加入了path   2 安裝cudnn 7.0.5 for cuda 9.1 下載地址:https://dev

windowsQt5.6.0 編譯Mysql驅動,並使用

windows下Qt5.6.0 編譯Mysql驅動,並使用。   寫這篇部落格的原因很簡單,百度一堆答案看的眼花繚亂,有用的沒幾個,也不想下次在安裝QT資料庫環境上浪費時間,也希望大家也不要在這裡浪費時間。第一次Windows下安裝Mysql實在是痛苦。 注意:圖省事的朋友可以

ubuntu 12.04編譯及除錯linux-0.11

(更新中.....) 最近開始研究linux-0.11,編譯過程就遇到各種奇葩情況......好不容易編譯通過了....可是還是不能載入執行.... 下面是我學習過程記錄: 1.開始我用gcc-3.2.2-5.i386.rpm編譯linux-0.11, 你也知道rpm包在u

Linux MySQL 8.0.11 登陸 修改密碼

MySQL 8.0.11 指令與之前版本有很大的出入。安裝步驟網上有很多,這裡就不再多說。然後是指令檢視MySQL執行狀態:systemctl status mysqld開啟MySQL執行服務:systemctl start mysqld關閉MySQL與性服務:systemc

如何在Windows使用Linux系統來編譯和執行程式?

很多開發人員都有這樣的疑問:自己平時是在Windows下面辦公的,而自己編寫的程式的執行環境又是Linux的,如何從Windows切換到Linux呢?是不是要專門到Linux機器上去編寫程式碼呢?實際上

建立Linux 0.11完整的系統linux 0.11真正轉起來方便大家學習。 中文版權所有: OldLinux論壇 

為了配合Linux 0.11核心工作原理的學習,本章介紹了利用PC機模擬軟體和在實際計算機上執行Linux 0.11系統的方法。其中包括核心的編譯過程、PC模擬環境下檔案的訪問和複製、引導盤和根檔案系統的製作方法以及Linux 0.11系統的使用方法。最後還說明了如何對核心程

windowslinux程式碼直接編譯

大多數人都習慣於在windows下用source insight編輯程式碼,然後用xftp拷貝到linux下進行編譯,如果有小的改動,就直接在linux下用vim進行編輯修改。至於為什麼是vim,工作這

學習linux-0.11核心——搭建環境(編譯、除錯bootsec)

前言 本博文是本專欄博文的起點,通過本文的學習,通過qemu虛擬機器將linux-0.11核心跑起來,有了這個可以跑的核心,在有疑問的地方,我們就可以通過除錯的方式來學習核心。 編譯核心 獲取核心程式碼 git clone https://github.com/

Windows編譯Lua

play pre functions aries programs mem lba other pil http://blog.csdn.net/yue7603835/article/details/41739085 http://blog.csdn.net/birdfl

Windows編譯WebRTC

obj 自己 war invalid bds amd clu out tail 前言 這篇文章的目的在於為你節省生命中寶貴的10小時(甚至更多),或者浪費你10分鐘。作為Google更新頻繁的大型跨平臺基礎庫,WebRTC的編譯一直被人稱為噩夢。如果恰巧你偏要在Windo

linux 內核全然剖析》編譯linux 0.12 內核 Ubuntu 64bits 環境

not with 希望 head ima load zip ont 內核 我×。。。最終好了,大概3 4個小時吧。。。各種毛刺問題。終究還是闖過來了。。。。 [email protected]/* */:~/Downloads/linux-0.00

windows編譯python3.6

python3 pytho sof 3.6 只需要 bsp .exe .cn 技術分享 在pcbuild文件夾下找到pcbuild.sln文件.在readme裏面有 Install Microsoft Visual Studio 2015, any edition. 所

gcc和MinGW的異同(在cygwin/gcc做的東西可以無縫的用在linux沒有任何問題是在windows開發linux程序的一個很好的選擇)

實現 o-c tool 交叉 lin 分析 模擬 gcc編譯器 還要 cygwin/gcc和MinGW都是gcc在windows下的編譯環境,但是它們有什麽區別,在實際工作中如何選擇這兩種編譯器。 cygwin/gcc完全可以和在linux下的gcc化做等號,這個可以從bo

windows編譯qt的mysql驅動

dot god sql plugins dep .com .html path h+ windows下編譯qt的mysql驅動cd %QTDIR%\src\plugins\sqldrivers\mysqlqmake –o Makefile INCLUDEPATH