怎樣自己寫一個簡單的操作系統?
我寫的時候一些經歷:
第一次寫的時候3000行左右的就無法調試了,當時主要參考了linux 0.11(基礎太潛)。第二次寫的時候,基本定下幾個核心模塊, 啟動/內存管理/進程管理/用戶環境/磁碟驅動/塊緩衝/文件系統/中斷,然後就開始發重新明輪子(不參考其他OS代碼),常用演算法參考wikipedia自己調試實現,驅動代碼參考http://www.osdev.org,順利寫到用戶態shell可以運行,然後就沒興趣寫下去了。如果以學習為目的,可以參考MIT OS開放課程裡面幾個LAB,分為6個LAB都有指導書,每個LAB都需要自己來填寫核心代碼,並且可以用內置腳本來評分,6個LAB最後合起來剛好是xv6 OS(/JOS)的代碼。(http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2006/labs/)。(MIT這個課程又更新了: http://pdos.csail.mit.edu/6.828/2011/,這次用git管理代碼,還添加了lwip移植的lab)
如果你就是想體會一下,在windows或者linux上寫一個用戶態程序,實現一個調度器就好了,代碼量一千行不到,幾天就能搞定,之後你想幹什麼,你自己就會知道。
實現上有問題可以跟帖問。想寫的OS,當然最好的學習模板就是FreeRTOS了。整個內核只有三個文件。其中一個還是鏈表的數據結構,操作系統核心就一個文件完成。但是已經移動很多單片機和ARM CPU上。當年我還想把它移植到s3c6410上,後來沒時間只寫一個分析文檔就算了。
只要你學過彙編和C,只滿足於寫個「簡單的操作系統",一兩天就能搞定。
隨便把你寫過的小程序,用直接寫硬碟軟體(或者自己編一個,調用winapi的WriteFile函數就可以),寫進硬碟/U盤引導區。記住,起始地址是7c00。
這就好了。注意,引導區只有440個位元組給你用,程序不能太大,所以這部分基本要用彙編寫。440位元組後面是硬碟/U盤分區信息,不可以亂動。亂動以後bios可能沒法識別硬碟/U盤。
引導區最後兩個位元組必須是55AA,不過一般你不用管,硬碟/U盤格式化的時候都已經給你寫好了。這樣你的程序就在開機的時候直接運行了。
想調用大程序也沒問題,你需要寫個不超過440位元組的程序,負責把第二個扇區的內容載入內存並執行,由第二個扇區的代碼負責把所有代碼載入內存。後面的部分用C寫或者別的高級語言寫都沒什麼問題了。
至於你想要具體作什麼,就寫什麼,屏幕上畫個畫,管管硬碟上的文件,和用戶互動一下,你隨意。和你平常寫程序沒啥兩樣。總之一個能完成任務的簡單操作系統就完事了。
最多幾天時間你就能搞定。這差不多能搞個接近dos1.0的「簡單操作系統」。
不過接下來才是你真正要學的。例如文件管理,內存管理,保護模式,進程管理啥的。麻煩歸麻煩,但解放了自由了,終於可以編寫內核態才准用的代碼了,做的事情全部都是用戶態下面不讓做的事情。操作系統的學習,從這裡才算真正開始。試試 Nachos,教學用的。他有完整版的,可以參考學習。也有框架版的,然後自己去開發相關模塊(文件系統管理、進程管理、中斷管理)。這些都是用 C 語言實現的。至於再底層的,是需要用彙編實現的。
謝邀,談到這個問題不得不推薦這本書
《Orange"S:一個操作系統的實現 (豆瓣)》這本書是真的從零開始教你寫出一個操作系統的雛形,還包括實現一個Shell,非常值得一讀
Amazon上只售¥34.50,建議樓主買一本。另外,閱讀Linux0.10的代碼也是一個不錯的入門方法,在樓主讀完這本書,而且照著書本實現了那個操作系統之後,可以去讀Linux0.10的代碼說難不難,先從寫bootloader開始吧。樓上有人提到FreeRTOS了,確實開源的bootloader很多,代碼量也不大。其實寫個操作系統沒有你想的那麼高大上,無非就是把硬體點起來。
這種事情如果能在本科一年級的時候開始做最有作用。。。
當初自己也有過想親自動手寫一個OS的衝動。推薦一本書吧——《30天自製操作系統》【日】川合秀實。啊喂,聽起來很像「30天精通xxx」、「xxx從入門到精通」之流好嗎!我是不看這種低端書籍的。這麼想你就錯了,川合秀實是一位以「輕量化」編程思想見長的「非主流」開發者,2000年因自行開發的OSASK項目而名聲大噪。書中行文幽默詼諧,絕壁是入門好書啊。關鍵是通過自己動手寫操作系統,可以順便對CPU什麼的有更深一步的了解呢~
瀉邀。。。
可以參考CMU的Operating System Design and Implementation,4個月可以開發出一個x86上ramdisk的OS了http://www.cs.cmu.edu/~410/買本書..叫做&<自己動手寫操作系統&>
看看uCOS/II的核心代碼,幾千行而已。
談談我的思路和寫過的經驗。
1、把握簡單操作系統的最基礎的兩個組件:
1.1 心跳代碼。1.2 任務調度。2、代碼架構把握:
2.1 縱向上, 硬體相關層和硬體無關層分離。2.2 橫向上,根據 心跳、任務、中斷、I/O、文件 不斷在 1 的基礎上擴展豐富OS。3、構建環境:
3.1 在 x86+win 的PC機上,選擇合適的 編譯環境(如 VC )。
3.2 從基礎組件開始,邊學、邊寫、邊調。主要掌握硬體無關部分。3.3 牛逼後,找個開發板,學寫 BIOS。開始掌握硬體相關部分。3.4 將PC上寫的OS代碼移植到開發板上。堅持~~布朗大學的weenix練習 給了OS大體框架 自己一步步實現進程線程,文件系統,虛擬存儲,多線程框架。 所有這些框架代碼填完後就基本上完成一個可以執行程序的操作系統了 WeenixWiki
下面是一個師兄曾經寫過的操作系統,純搬運:
CosOS是一個的簡易操作系統,它因興趣而生,本身沒有太多實用價值。開發CosOS目的在於學習研究各種計算機底層知識。
目前CosOS版本為0.01,採用微內核結構,實現文件系統、多任務、多控制台(TTY)、分頁內存管理, 為應用程序提供庫函數。標準輸入輸出:printf、gets文件操作:open、close、read、write、unlink、stat目錄操作:opendir、readdir 、closedir
內存分配:malloc、free 執行程序:execv、execl進程:fork、exit 等由於CosOS開發時間不長,為了儘快實現一個雛形,很多地方使用了最簡陋的實現。在CosOS的代碼中可以看到很多 《JamesM"s kernel development tutorials》和《Orange_"s.一個操作系統的實現》的影子。CosOS是從學習和模仿這兩份資料開始的。這兩份資料給了CosOS很大的幫助,從中借鑒了很多代碼。CosOS綜合了它們的優點,使CosOS離現代操作系統更進一步。目前CosOS的文件系統是從Orange"s 文件系統移植而來, 並進行了優化。在以後CosOS的不斷完善中,將使用更複雜、更先進的實現替換掉這些簡陋、非原創代碼。SVN地址: http://svn.ecjtu.org/svn/cosos/大家可以使用SVN客戶端(如 TortoiseSVN)來下載源碼和文檔。附截圖一張:
入門推薦mit 操作系統課,代碼量不大,而且文檔齊全。
直接上代碼上圖《30天自製操作系統》,一看便知
我寫了一個針對ARM的Cortex-M3小操作系統內核,課程鏈接:自己動手從0到1寫嵌入式操作系統 - 網易雲課堂
如非業務需要必要,不建議自己實現完整的計算機操作系統。重造車輪的累贅先不說。
在自己造的過程中,彷彿體驗了事無巨細一切都要自己實現的艱辛,和訪問底層硬體處理dirty work帶來的虛假的智力/經驗上升的快感和空洞的談資的積累。 這不一定帶來良好的效率。當然,如果你的時間不值錢,那就無所謂了,你就瞎掰吧。
操作系統的實踐中已經有相當多的best practice ,去向他們學習的時間尚且不夠,哪裡有功夫自己去作一個低價值的代碼堆呢。如果是有志於從事相關工作或者科學研究的計算機科學技術專業人員,謹建議從操作系統內核開始,研讀特定功能模塊,比如進程調度,文件系統,網路,內存管理等開始,研讀代碼,學習理論,實踐替換部分代碼,至於以後怎麼作,還是看你的時間在更高一個層次上的價值來決定你要作什麼吧。先gentoo定製吧
推薦閱讀:
※從操作系統本身來看Linux是否比Windows優秀?
※為什麼很多人覺得瀏覽器會成為下一代操作系統,而不認為操作系統會成為下一代瀏覽器?
※為什麼列印店的電腦都特別喜歡用XP或者最多win7的系統?
※請問這一段代碼的加鎖原理是什麼?
※有限條件下怎樣舉辦一場知名度高、吸引大牛的編程比賽?