歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

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




Copyright © Linux教程網 All Rights Reserved