FreeBSD
1.1概述
FreeBSD可以在PC/AT兼容機器上運行。CPU是i386,i486,Pentium,Pentium Pro以及其兼容芯片等。
1.1.1(略)
1,理論地址: 2個13 bit 長+32 bit 長
2,線形地址:32 bit 長的空間
3,物理地址:32 bit 長的空間
1.1.2進程的虛擬空間
1,text部分
這部分是執行文件的的text領域,也就是機器語言部分,對於這個部分的空間在機器上的物理內存頁是共有的,還有,這部分最後的變量地址是etext。
2,data和bss部分
執行文件的data部分,也就是初始化的數據段和執行文件指定的內存變量。內存變量在開始的時候以0填充。這一段空間可以讀寫。它的邊界也是以edata和end的地址做結尾。進程的malloc()等內存分配的操作的時候,地址的增加方向向bss空間進行。
3,stack部分
也就是進程執行的時候的stack空間,這部分空間(從地址的最高位開始可以伸縮),其對於物理內存,伸縮程度由核心自動執行。
1.2 kernel的configure
freebsd的kernel構成文件在/usr/src/sys的目錄下面。下面的子目錄做一個介紹。
compile 編譯核心的目錄。
conf configure的目錄。
ddb 核心調試的sounre code的目錄。
dev 一部分的drivers的source code的目錄。
gnu 浮點運算的仿真以及ex2fs文件系統的source code目錄。
i386 依賴於pc/at機器的目錄,以下介紹它的字目錄。
apm suspend一些節電程序。
boot 不是kernel本身的東西,只是一些怎麼從開機到讀入kernel的boot program的source code。
conf config的一些依賴data。
isa isa bus的驅動程序類的source code。
eisa eisa bus的驅動程序類的source code。
include 對pc/at的一些include files
i386 對pc/at的一些核心code
ibcs2,linux 使各類的os的執行文件在freebsd上執行的code
isofs/cd9660
cd-rom在unix文件系統上操作的的有關code
kern 核心code
libkern 核心庫的source code
miscfs 實現unix文件系統的code
msdosfs 在unix上操作ms-dos文件系統的有關code
net 實現network功能的基本部分code
netatalk實現appletalk network功能code
netinet 實現internet network功能的code
netipx 實現ipx功能的code
netns 實現ns network的code
netkey 實現網絡加密部分的功能的code
nfs 實現nfs服務
pc98 對於pc98的支持
pccard 對pcmcia的支持
pci 對pci bus的驅動程序的source code
scsi 對cd-rom,hard disk,tape 等的scsi驅動程序的source code
sys 獨立於機器體系結構的一部分code
ufs unix file system 的支持code
vm 虛擬內存管理的部分
1.2.1配置的操作----config command
在root權限下,config,make實行後,可以得到簡單的kernel。
*configure file
移動到/usr/src/sys/i386/config看看。
GENERIC 從cd-rom等安裝freebsd的時候對應於defaule kernel的配置fileLINT kernel組合功能的網羅的的配置file
下面4個是對配置很有必要的的依賴data fileMakefile.386 config生成的Makefile file的template.
devices.i386 對於unix filesystem可能的block型的device名字和major號的對照表
files.i386 記錄kernel功能組合的基礎上,依賴於pc/at機器的功能名稱和各種功能實現的source codefile的名字表。
options.i386 記錄配置項目的表。
還有,majors.i386是記錄對應驅動器的I/O表和major號的一個文件。
於核心配置沒關系。
對於新的i/o設備,如果要做device driver,對pc/at,要在files.i386(沒有的話在/usr/src/sys/conf/files)追加相應的行,不然就不能把它加入到核心裡面。
追加的格式為
相對path名 optional device-name device-driver
對於配置文件,首先,要設置cpu,bus,i/o設備,多少用戶等。例如對於GENERIC
machine "i386"
cpu "I386_CPU"
cpu "I486_CPU"
cpu "I586_CPU"
cpu "I686_COU"
ident GENERIC
maxusers 10
當作為server時候,應該把最大user設置大一點,以提高系統性能。
下一步,指定options,對於GENERIC
options MATH_EMULATE #support for x87 emulation
options INET #interNETworing
options FFS #Berkeley Fast Filesystem
options NFS #Network Filesystem
......
options指定的名字xxx等,如果在/usr/src/sys/conf/options或者在/usr/src/sys/i386/conf/options.i386中記載的時候,應在對應的opt_XXX.h中寫入。沒有的話,作為cc命令行的參數定義"-D"在Makefile裡面追加。對於XXX的格式應該是相對path名 optional xxx下一步,對於config
config kernel root on wd0
(略)
配置文件剩下的部分應該是bus,i/o等一些硬件配置,一般有controller,device,disk,tape四類。例如
controller isa0
controller eisa0
controller pci0
等。
第二層的device和controller,記錄了一些bus設備的連接。ISA的情況是
device device_name at isa? 參數
controller controller_name at isa? 參數
EISA和PCI就相對簡單一點:
device device_name
controller controller_name
device_name裡指定的設備名是,串口,並口,網絡等裝置。
第三層的disk和tape為
disk disk_name at 控制設備名 drive 號
tape tape_name at 控制設備名 drive 號
SCSI接口卡作為第二層的控制裝置記錄的同時
controller scbus0
作為通用的scsi控制設備。因此,對於它的hard disk,tape,cd-rom,mo設備,有
device sd0
device st0
device cd0
device od0
等,它可以自動識別和分配號碼。
對於其他的scsi設備,有
device pt0 at scbus?
這些東西(bus,scsi,i/o),在生成的ioconf.c以及相應的include中有反映。
configure的最後,不是一些物理設備,而是kernel內部的一些軟設置
pseudo-device 理論設備名
首先,要考慮以下兩個設備:
pseudo-device pty 16 #ttys - can go as high as 256
pseudo-device log #syslog interface (/dev/klog)
network使用的場合,應該有下面兩個
pseudo-device loop
pseudo-device ether
這種情況下,最好有
pseudo-device bpfilter 4 #berkeley packet filter
pseudo-device tun 1 #Tunnel driver ( PPP)
想做floppy的時候,要
pseudo-device vn #Vnode driver ( turns a file into a device)
FreeBSD核心探討 1.3 FreeBSD boot之前的工作
1.3.1pc/at機器的boot順序
hard disk的最前面的一個block(512byte),叫做master boot recorder(MBR).這 裡有啟動限定的program和分區的信息。分區信息是指對於一個區是16byte長,最多 只能有4個區。16byte的內容是,分區哪裡開始,哪裡結束。哪種os,能否啟動等。對 於freebsd,安裝的時候向MBR寫入了boot easy.
磁盤的結構如下圖表示:
block Number
#0 #1 #2 ... #14 #15 #16 #17
-------------------------------------------------------------
disk no used
label
-------------------------------------------------------------
<-boot->|<---------boot2-------------->| |<--unix file system--
FreeBSD用的block#0--#14的15個block裡面,含有讀入freebsd的程序,bootease只在block#0裡面,在15個block中並沒有。它的作用
。讀入mbr,找freebsd的分區
。讀入最初的15個block,到物理內存中0x0001000
。跳轉到相當於block#2的內存位置
然後,屏幕表示為:
。。。
。。。
boot:
(參數說明略)
它的source是/usr/src/sys/i386/boot/biosboot,make之後,生成兩個文件:
boot1,boot2分別寫入block#1,block#2--#14中。一般,一個物理的unix分區理論上可以有8個,比如swap,unix system等。
boot2部分是boot program,它讀入kernel的文件名和option。然後
。找boot label指定的分區。
。構造unix filesystem,找指定的kernel
。從開始執行文件,text,data的順序向物理內存讀入。對bss清零。
。以option的選擇,向開始位置跳轉。
1.3.2 kernel的初始化動作
boot program執行之後,轉向kernel的text段開始進行初始化,即先執行locore.s的text段。因此是虛擬內存還沒有發生作用,locore.s的開始部分必須對offset進行補正。locore.s的作用是
。保存從boot program過來的option
。設定虛擬的stacker
。檢測cpu的module
。對自己的bss空間進行0初始化
。為使虛擬內存工作,要保證最少的管理信息。然後是虛擬空間動作。也就是,調用cpu有強的依賴關