歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> BSD >> BSD內核導讀

BSD內核導讀

日期:2017/2/28 11:25:51   编辑:BSD


  一般新接觸BSD內核的朋友都會對BSD內核的代碼的組織感到不適應,由於BSD國內沒有像
linux那樣豐富的資源,一般不知道概從哪個文件看起。這裡我就把BSD內核代碼的組織形
式和BSD的大致啟動流程做一個簡單的介紹,我自己也才開始看,知道的東西有限,這個
只是拋磚之作,還望能引出更多的佳玉出來。
  現在比較流行的BSD有三個:FreeBSD,NetBSD,OpenBSD。只是說比較流行,現在世界上的
BSD系統應該沒人知道有多少種,如果您有興趣,可以自己統計一下。這三個系統的開發
宗旨不大一樣,FreeBSD重點在於強有力的支持x86, NetBSD的目標是支持世界上所有的CPU
,而OpenBSD是要提供一套世界上做安全的通用操作系統。由於NetBSD和OpenBSD支持的體
系結構比FreeBSD多,所有他們的目錄結構和FreeBSD有一點差別,就是體系結構相關的文
件的存放的位置不一樣。
下面先介紹體系結構無關的目錄,然後介紹體系結構相關的目錄,在介紹BSD的大致
啟動流程,最後介紹一下讀BSD的內核代碼都有一些什麼資料可以查閱。
1. BSD體系結構無關目錄。
上述三套BSD的代碼都可以在其官方網站上下載(如果您還不知道上述三套系統的官方
網站,前參本文的第3節),一般整體系統的代碼叫src.tar.gz, 其中包含了內核代碼
單獨的內核代碼叫sys.tar.gz,當然我這裡說的是打包了的。官方網站會告訴您怎樣得
到BSD的代碼。將上述文件解壓到當前目錄(linux或者UNIX下執行 "tar -xzvf
sys.tar.fz -C ."),您將在當前目錄下得到一個叫src的目錄,這個就是BSD源代碼
的目錄,src目錄下的sys目錄就是BSD內核代碼的目錄,下面的說明都假設您位於
src/sys目錄下。
在內核目錄下,一般會有一個Makefile文件,然後有很多目錄,下面我就開始介紹看
內核代碼時主要會看的幾個目錄下的文件是都干什麼的,之所以不全部介紹是因為我也
不知道有些目錄是干什麼的,呵呵。平常我們看BSD的代碼,一般都只會接觸這幾個目
錄:arch、conf、dev、kern、lib、net、netinet、sys、uvm(這
個目是NetBSD和OpenBSd特有的),對於其他的目錄,我相信在您看了一些BSD的代碼之
後,就知道他們是干什麼的了。
arch/ :是體系結構相關的目錄,下面有很多關於各個體系的子目錄,後面會詳細介
紹這個目錄下的文件。
conf/ :這個目錄下是一些系統通用的配置文件的目錄.NetBSD3.0的這個目錄下有一
個很重要文件Makefile.kern.inc,當您在很多Mikefile文件中都找不到某個
變量的定義時,那個變量很可能就在這個文件中,對於BSD的Makefile,需要
專門的文檔來介紹。
dev/ : 這個目錄下是一些設備管理的代碼,比如PCI總線啊,USB設備啊什麼的。
kern/ : 這個目錄是系統的體系無關的一些通用算法的實現目錄,比如系統的調度程序
,可執行文件的加載,系統調的實現,進程間通信的一些算法,以及虛擬文件
系統等,這個目錄是操作系統原理中介紹的內容的實現的主要目錄。
lib/ :系統的一些庫函數,注意,這裡是系統內核的庫函數,不是應用編程中那個
庫函數的的概念,也就是說,內核的很多部分會用到一些通用例程,比如C
語言的一些字符串出來的例程,就在這個目錄下的libsa目錄中。由於內核是
靜態連接,而且其沒有像應用程序那樣有系統調用和共享庫可以用,所以內核
中的所有函數調用是一個封閉的系統,不像應用程序,就算是靜態編譯,最
後的系統調用還是要調用外部函數(就是要調用內核中的函數)。
net/ : 這個目錄是網絡部分於協議無關的部分的實現

netinet/ :
這個目錄是IPv4的協議的實現。
sys/ : 這個目錄是系統無關的內核頭文件的目錄
uvm/ : 這個目錄是NetBSD和OpenBSD的虛擬內存管理實現的目錄,我個人是極力推薦
看一看這個虛擬內存管理,設計簡潔,運行高效,不像有些系統,都不知道
哪些代碼在干什麼。
2. 體系結構相關的目錄
主要就是arch目錄下的東西,在arch目錄下,NetBSD和OpenBSD都會根據具體的體系
結構有一個目錄,這個體系結構的所有體系相關的功能的實現就都在這個目錄下了,
比如Intel的x86體系結構的代碼就在arch/i386/下面。在arch/machine/(machine表
示某個體系結構)下面,會分成很多子目錄,現在我們假設位於arch/machine/目錄下
面。一般體系相關的代碼在machine下,啟動相關的代碼位於stand/下,配置目錄為
conf/,編譯目錄為compile,體協相關的內核頭文件位於include/下,還有其他一些
目錄都是一些體系相關的外設的或者體系相關的一些特殊功能的實現。
3. BSD系統的啟動流程
BSD系統是把內核當成一個可執行文件通過啟動程序加載到內存中,所有他的啟動程序
要做很多工作。現在的BSD的啟動程序幾乎就想一個支持elf文件格式和ufs文件系統的
一個單任務的小的操作系統,啟動程序同時也支持一些簡單的命令。
這裡以i386平台為例,介紹OpenBSD的啟動流程,NetBSD的啟動流程類似。
這個是arch/i386/stand/biosboot/biosboot.S文件開頭的注釋,實際上它已經詳細說
明了系統的啟動流程:BIOS加載MBR到0x7C00, 然後把自己拷貝到0x7A00, 然後MBR加載
biosboot.S到0x7C00, biosboot.S加載/boot到 4000:0000, 然後/boot加載內核到相
應的內存,再把控制權傳給內核。相應的一些文件都在stand目錄下, mbr目錄下是MBR
的,boot下是/boot下的,用於從磁盤啟動,cdboot下是cdrom的啟動代碼,pxeboot下
是網絡啟動的代碼,具體的細節就需要讀者自己去讀代碼了。
*
* Memory layout:
*
* 0x00000 -> 0x079FF our stack (to 30k5)
* 0x07A00 -> 0x07BFF typical MBR loc (at 30k5)
* 0x07C00 -> 0x07DFF our code (at 31k)
* 0x07E00 -> ... /boot inode block (at 31k5)
* 0x07E00 -> ... (indirect block if nec)
* 0x40000 -> ... /boot (at 256k)
*
* The BIOS loads the MBR at physical address 0x07C00. It then relocates
* itself to (typically) 0x07A00.
*
* The MBR then loads us at physical address 0x07C00.
*
* We use a long jmp to normalise our address to seg:offset 07C0:0000.
* (In real mode on x86, segment registers contain a base address in
* paragraphs (16 bytes). 0000:00010 is the same as 0001:0000.)
*
* We set the stack to start at 0000:79FC (grows down on i386)
*
* We then read the inode for /boot into memory just above us at
* 07E0:0000, and run through the direct block table (and the first
* indirect block table, if necessary).
*
* We load /boot at seg:offset 4000:0000.
*
此時OpenBSD就進入了arch/i386/i386/locore.S的start:處,當然引導程序會傳很
多參數給內核,然後是操作系統的初始化代碼了,現在就可以跟著代碼讀下去了。
NetBSD的啟動流程雖然和這個不一樣,但類似。他是三級啟動。其啟動代碼也在stand
目錄下,由mbr/mbr.S加載bootxx/pbr.S,然後pbr.S加載bootxx的其余部分,bootxx
再加載boot/下的程序,這個程序就是/boot, /boot在運行netbsd,這樣內核就啟動了。
內核被加載後執行的代碼是arch/machine/machine/locore.S文件,對於i386, 內核執
行這個文件時已經時保護模式下了,到了這個文件之後,就是系統的一些初始化相關
的工作了,然後就可以跟著代碼讀下去了。

總的來說,除了網絡,其他部分OpenBSD處理的比NetBSD要簡單一些,我的意思是要好
懂一些。
4. 讀BSD內核的相關資料
第一本要看的書是《The Design of the UNIX Operating System》。這本書是看所有
UNIX操作系統比看的書。
OpenBSD的內核還是比較傳統的,如果不管網絡,《the Design and Implementation
of the 4.4BSD Operating System》 和uvm作者的博士論文就差不多了。OpenBSD的
網絡是一大塊,現在我還沒有了解過,所以不做說明,還請知道的朋友能否介紹一下。

NetBSD的內核和4.4BSD相比就改了很多了,增加了很多新的功能,比如線程調度,
多處理器支持等等,NetBSD的官方網站上有很多很有用的資料。關於它的線程調度,
我一直沒有找到很好的資料,那位朋友知道的話不知能否能介紹一下。
相關網址:
1. 三套系統的官方網站:
上面的介紹中肯定有很多不妥之處,歡迎大家討論,同時也希望能引出更多的美玉出來。
歡迎大家來信和我討論關於BSD和plan9的問題(BSD和plan9都在學習中)。
Copyright © Linux教程網 All Rights Reserved