概述
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
的配置file
LINT kernel组合功能的网罗的的配置file
下面4个是对配置很有必要的的依赖data file
Makefile.386 config生成的Makefile file的template.
devices.i386 对于unix filesystem可能的block型的device
名字和major号的对照表
files.i386 记录kernel功能组合的基础上,依赖于pc/at
机器的功能名称和各种功能实现的source code
file的名字表。
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核心探讨(翻译)2
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有强的依赖关系的过程init386()(@i386/i386/machdep.c),
然后进行kernel内的管理信息初始化,i/o设备的登记,生成4个kernel process
,再调用main()(@kern/init_main.c)。当main()返回locore.s时,应该有如下
5个进程:
PID TT STAT TIME COMMAND
0 ?? DLs 0:00.17 (swapper)
1 ?? Is 0:00.19 /sbin/init --
2 ?? DL 0:56.60 (pagedaemon)
3 ?? DL 0:00.06 (vmdaemon)
4 ?? DL 6:07.65 (updata)
从locore.s返回到process #1,/sbin/init开始动作,然后转向freebsd的普通
动作。
init386()和main()的处理大致如下:
。init386()
GDT和LDT,IDT,task stages处理的初始化,例外处理等locore.s没做的
事情,虚拟内存初始化。然后,根据boot program的参数,增加物理内
存page数。然后,作成process #0的雏形。
。main()
逐步调用构成kernel模块的的初始化部分。
FreeBSD核心探讨(翻译)3
(续上,liangvy.icewolf.leon翻译)
但是,kernel构成的各个模块的初始化子程序一个个的列举出来运行很显然是
不行的。通常是利用时间连表的技能来运行它(ld command)。也就是,程序
是以很多个source分开编译和联结。相同的模块名字就对应于相同的地址来进
行调用。它在时间链表里面自动调节执行。
初始化时候,main()函数要call的模块利用在sys/kernel.h里面定义的宏
SYSINIT()和SYSINIT_KT()进行登记。这样,kernel在link的时候,ld命令就
能够得到那些信息和进行配置列表。这个列表就是kernel的组成模块的初始化
routine的登记。检查source,
就可以找到初始化routine的部分。
如表:
print_caddr_t(copyright) kern/init_main.c
vm_men_init(NULL) vm/vm_init.c
syctl_order(&sysctl_) kern/kern_sysctl.c
kmemnit(NULL) kern/kern_malloc.c
fpu_init(NULL) i386/i386/math_emulate.c
cpu_startup(NULL) i386/i386/machdep.c
gnufpu_init(NULL) miscfs/devfs/devfs_tree.c
...
各个device的major号与处理routine的登记 (major循序号)
FreeBSD核心探讨.5.驱动程序篇
2.2 虚拟文件系统和v-node
FreeBSD在disk上的除了ffs以外还可以操作各种各样的文件系统。主要的如
下:
。cd9660
可以对ISO9660形式的cd-rom的目录/文件构造的文件系统进行mount,
locate等目录层的操作
。ms-dos
对ms-dos文件系统进行目录层次的mount,定位等操作
。mfs
通过使用虚拟内存对swap区的一部分进行unix文件系统的构造,定位
作为目录的一部分进行读写
。nfs
由nfs server提供的remote目录级进行mount,定位的目录层操作。
。null
对已经存在的目录层的使用别名
。union
对已有的目录A(上层)在下层目录B上进行重叠 (不大理解这的意思
,大概是在下层目录里面又嫁接了上层目录的意思:译者)。文件名的查
找由上层优先进行。没有的话就转道下层。如果对下层的文件进行写操作
,它的拷贝就在上层上进行。举例说明,作业目录在上层,但cd-rom的源
在下层,两个目录重叠,那么编译source的时候,就相当方便了。
。procfs
对于进程号的目录作成mount point。通过文件名对各个目录的进程进行
控制。
。kernfs
为了对动作中的kernel有关的信息进行参考,而作成的mount point
。fdesc
对于各个进程,用它所打开的文件柄对应的文件作成的mount point
实际上,在核心内部,为了对它们进行统一操作,就对文件系统和v-node
进行抽象化,实际的处理过程就是调用各类的文件系统的模块进行处理。
2.2.1对虚拟文件系统的操作
各个文件系统可以提供的操作的一览如下,它在struct vfsops
(@sys/mount.h)里面定义:
。对文件系统进行mount的操作
。本文件系统的开始动作的操作
。本文件系统的umount操作
。表达文件系统的根的v-node的查找操作
。对一般用户的权限控制
。取得文件系统的状态
。内存内的管理信息写入介质中
。从i-node到v-node的取得操作
。v-node和nfs的文件柄的相互变换的操作
。文件系统实际的模块的初始化
对于文件系统,各个实际的操作routine在vfsops的形式提供准备工作。各个文件系
统的vfsops,在以下的表里的source进行定义:
--------------------------------------------------------------
file system vfsops的定义 source
--------------------------------------------------------------
ufs ufs_vfsops ufs/ffs/ffs_vfsops.c
cd9660 cd9660_vfsops isofs/cd9660/cd9660_vfsops.c
msdos msdosfs_vfsops msdosfs/msdosfs_vfsops.c
mfs mfs_vfsops ufs/mfs/mfs_vfops.c
nfs nfs_vfsops nfs/nfs_vfsops.c
null null_vfsops miscfs/nullfs/null_vfsops.c
nuion union_vfsops miscfs/union/union_vfsops.c
procfs procfs_vfsops miscfs/procfs/procfs_vfsops.c
kernfs kernfs_vfsops miscfs/kernfs/kernfs_vfsops.c
fdesc fdesc_vfsops miscfs/fdesc/fdesc_vfsops.c
devfs devfs_vfsops miscfs/devfs/devfs_vfsops.c
ext2fs ext2fs_vfsops gnu/ext2fs/ext2_vfsops.c
lfs lfs_vfsops ufs/lfs/lfs_vfsops.c
portal portal_vfsops miscfs/portal.portal_vfsops.c
umap umap_vfsops miscfs/umapfs/umap_vfsops.c
---------------------------------------------------------------
这些就是文件系统的实际模块(*_vfsops.c),文件系统名称,文件系统号等等
在struct vfsconf(@sys/mount.h)里面汇总,各个模块里用宏VFS_SET()进入核
心。
根据main()(@kern/init_main.c),在kernel初始化的过程中,vfsinit()
(@kern/vfs_init.c)里面有
struct vfsconf *vfsconf[MOUNT_MAXTYPE+1];
struct vfsops *vfssw[MOUNT_MAXTYPE+1];
各种东西的设定,这些是,管理mount信息的struct mount(@sys/mount.h)的成员
mnt_vfc和mnt_op要指定所对应的文件系统的vfsconf,vfssw。还有宏VFS_操作名
(struct mount *,..)里,可以各个操作的调用。
2.2.2对v-node的操作
虚拟文件系统就是通过对i-node的抽象化之后的v-node的文件/目录进行io处理。
为了这个目的,作为对v-node的适用处理,有
。从v-node到文件名的查找,返回v-node
。打开/关闭v-node
。检查是否可能访问v-node
。得到-v-node的属性
。设定v-node的属性
。对v-node的输入/输出
。扩展v-node的硬连接和符号连接
。对v-node进行目录的作成和删除
。。。。
由这里开始,一共定义了41个。
v-node由struct vnode(@sys/vnode.h)里定义,作为类别在enum vtype
里面表示出来,一共是9种类。它包含着在各个文件系统上对各个的文件/目录(包
括特殊)文件进行统一识别的信息。为了实现这样,v-node一连串的操作就是在各
模块里通过宏VNODEOP_SET()和核心通讯。这些操作名和实现的routine只需要必要
的几个对应。在核心初始化里,vfs_opv_init()(@kern/vfs_init.c)就使从数据得
到的号码一一对应,收集了routine的地址的同一size的配列再进行组合。各个
v-node就一个一个指向这些配列。对v-node的操作在vnode_if.h里定义:
它以
VOP_操作名(v-node,...)
的统一形式记述。
FreeBSD内核定制参考
发表: wxjoshua
时间: 2002/10/11 19:35:24
FreeBSD内核定制参考
meaculpa (2001-06-27 10:46:15)
#
# GENERIC -- Generic machine kernel
#
## 主机类型i386,因为FreeBSD是在X86上运行的嘛
machine "i386"
## CPU 种类,看看自己属于几86嘛
#cpu "I386_CPU" # 386 的电脑
#cpu "I486_CPU" # 486 的电脑
cpu "I586_CPU" # 586 的电脑
#cpu "I686_CPU" # 686 的电脑
## 内核标识,没有特殊意义
ident GENERIC
## 定义一些系统的结构应该保留多大的内存空间,通常
## 16 或 32 就够了, 除非你开站,或运行X,就用 64 吧
## 注意这个值永远小于你的内存数目
maxusers 32
## 一个用户可以执行的进程数限制
options CHILD_MAX=256
## 一个用户可以打开的文件数限制
options OPEN_MAX=256
## 打开内核调试, 一般人用不到
#options DDB
## 允许调试跟踪内存单元(详情見 ktrace, kdump), 还是留给内核黑客用吧
#options KTRACE #kernel tracing
## 没有 FPU (SX) 的朋友用的, 用 DX 的人就不用了
#options MATH_EMULATE #Support for x87 emulation
## 你有64MB以上内存量时指定,单位是K。例如 128MB RAM:
#options "MAXMEM=(128*1024)"
## 支持网络, 一定要有,真是废话
options INET #InterNETworking
## IPX 相关协议
#options IPX #IPX/SPX communications protocols
#options IPXIP #IPX in IP encapsulation (not available
#options IPTUNNEL #IP in IPX encapsulation (not available
#options IPXPRINTFS=0 #IPX/SPX Console Debugging Information
#options IPX_ERRPRINTFS=0 #IPX/SPX Console Debugging Information
## 文件系统设定
## 只有 UFS 是必需的, 其他的可以不必, 要用时 kernel 会用 LKM 载入
## 注意文件系统名有数字时要用双引号括起来哦,看看下面的LINUX文件系统就知道了
options FFS #Berkeley Fast Filesystem
#options NFS #Network Filesystem
#options NFS_NOSERVER #Disable the NFS-server code.
#options MSDOSFS #MSDOS Filesystem
#options "CD9660" #ISO 9660 Filesystem
#options PROCFS #Process filesystem
#options KERNFS #Kernel filesystem
#options NQNFS #Enable NQNFS lease checking
#options FDESC #File descriptor filesystem
#options LFS #Log filesystem
#options MFS #Memory File System
#options NULLFS #NULL filesystem
#options PORTAL #Portal filesystem
#options UMAPFS #UID map filesystem
#options UNION #Union filesystem
#options DEVFS #devices filesystem
##
## 有LINUX文件系统的朋友注意要用下面这一行
#options "EXT2FS" #ext2fs, only in 2.2-CURRENT
freebsd系统日志与备份
由于FreeBSD是一个多用户系统,那么就需要管理员进行日常维护,特别是用做网络服务器的系统,一旦因为 缺乏维护而造成停机故障,就会造成很大损失。即使对于单用户的FreeBSD系统,同样也要执行这些不可缺乏的维护任 务,只是由于系统归个人使用,那么对维护的要求就不必那么高,维护任务就轻松一些。
系统日志
系统的日志记录提供了对系统活动的详细审计,这些日志用于评估、审查系统的运行环境和各种操作。对于一般情况 ,日志记录包括记录用户登录时间、登录地点、进行什么操作等内容,如果使用得当,日志记录能向系统管理员提供有关危害 安全的侵害或入侵试图等非常有用的信息。
BSD提供了详细的各种日志记录,以及有