歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> Unix教程 >> FreeBSD核心完全探討與解析

FreeBSD核心完全探討與解析

日期:2017/2/27 17:43:38   编辑:Unix教程
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