频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

FreeBSD核心完全探讨与解析

来源: 作者: 出处:巧巧读书 2006-08-06 进入讨论组

  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有强的依赖关保留地址 http://www.qqread.com/linux/2006/08/s690193061.html 更多文章 更多内容请看FreeBSD系统安全管理FreeBSD使用教程Freebsd频道专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章