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有強的依賴關