免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5117 | 回复: 2

潜水很久了,我也发篇简单介绍BSD内核目录和相关资料的文章 [复制链接]

论坛徽章:
0
发表于 2006-08-27 13:04 |显示全部楼层
BSD内核导读
一般新接触BSD内核的朋友都会对BSD内核的代码的组织感到不适应,由于BSD国内没有像
linux那样丰富的资源,一般不知道概从哪个文件看起。这里我就把BSD内核代码的组织形
式和BSD的大致启动流程做一个简单的介绍,我自己也才开始看,知道的东西有限,这个
只是抛砖之作,还望能引出更多的佳玉出来。
现在比较流行的BSD有三个:FreeBSD,NetBSD,OpenBSD。只是说比较流行,现在世界上的
BSD系统应该没人知道有多少种,如果您有兴趣,可以自己统计一下。这三个系统的开发
宗旨不大一样,FreeBSD重点在于强有力的支持x86, NetBSD的目标是支持世界上所有的CPU
,而OpenBSD是要提供一套世界上做安全的通用操作系统。由于NetBSD和OpenBSD支持的体
系结构比FreeBSD多,所有他们的目录结构和FreeBSD有一点差别,就是体系结构相关的文
件的存放的位置不一样。
    下面先介绍体系结构无关的目录,然后介绍体系结构相关的目录,在介绍BSD的大致
启动流程,最后介绍一下读BSD的内核代码都有一些什么资料可以查阅。

1. BSD体系结构无关目录。
   上述三套BSD的代码都可以在其官方网站上下载(如果您还不知道上述三套系统的官方
   网站,前参本文的第4节),一般整体系统的代码叫src.tar.gz, 其中包含了内核代码
   单独的内核代码叫sys.tar.gz,当然我这里说的是打包了的。官方网站会告诉您怎样得
   到BSD的代码。将上述文件解压到当前目录(linux或者UNIX下执行 "tar -xzvf
   sys.tar.fz -C ."),您将在当前目录下得到一个叫src的目录,这个就是BSD源代码
   的目录,src目录下的sys目录就是BSD内核代码的目录,下面的说明都假设您位于
   src/sys目录下。
   在内核目录下,一般会有一个Makefile文件,然后有很多目录,下面我就开始介绍看
   内核代码时主要会看的几个目录下的文件是都干什么的,之所以不全部介绍是因为我也
   不知道有些目录是干什么的,呵呵。平常我们看BSD的代码,一般都只会接触这几个目
   录:arch、conf、dev、kern、lib、net、netinet、sys、uvm(这
   个目是NetBSD和OpenBSd特有的),对于其他的目录,我相信在您看了一些BSD的代码之
   后,就知道他们是干什么的了。
   arch/ :是体系结构相关的目录,下面有很多关于各个体系的子目录,后面会详细介
              绍这个目录下的文件。
   conf/ :这个目录下是一些系统通用的配置文件的目录.NetBSD3.0的这个目录下有一
              个很重要文件Makefile.kern.inc,当您在很多Mikefile文件中都找不到某个
           变量的定义时,那个变量很可能就在这个文件中,对于BSD的Makefile,需要
           专门的文档来介绍。
   dev/  : 这个目录下是一些设备管理的代码,比如PCI总线啊,USB设备啊什么的。
   kern/ : 这个目录是系统的体系无关的一些通用算法的实现目录,比如系统的调度程序
           ,可执行文件的加载,系统调的实现,进程间通信的一些算法,以及虚拟文件
              系统等,这个目录是操作系统原理中介绍的内容的实现的主要目录。
   lib/  :系统的一些库函数,注意,这里是系统内核的库函数,不是应用编程中那个
             库函数的的概念,也就是说,内核的很多部分会用到一些通用例程,比如C
           语言的一些字符串出来的例程,就在这个目录下的libsa目录中。由于内核是
           静态连接,而且其没有像应用程序那样有系统调用和共享库可以用,所以内核
           中的所有函数调用是一个封闭的系统,不像应用程序,就算是静态编译,最
           后的系统调用还是要调用外部函数(就是要调用内核中的函数)。
   net/ :  这个目录是网络部分于协议无关的部分的实现
   
   netinet/ :
           这个目录是IPv4的协议的实现。
   sys/ : 这个目录是系统无关的内核头文件的目录
   uvm/ :  这个目录是NetBSD和OpenBSD的虚拟内存管理实现的目录,我个人是极力推荐
           看一看这个虚拟内存管理,设计简洁,运行高效,不像有些系统,都不知道
           哪些代码在干什么。

2. 体系结构相关的目录
   主要就是arch目录下的东西,在arch目录下,NetBSD和OpenBSD都会根据具体的体系
   结构有一个目录,这个体系结构的所有体系相关的功能的实现就都在这个目录下了,
   比如Intel的x86体系结构的代码就在arch/i386/下面。在arch/machine/(machine表
   示某个体系结构)下面,会分成很多子目录,现在我们假设位于arch/machine/目录下
   面。一般体系相关的代码在machine下,启动相关的代码位于stand/下,配置目录为
   conf/,编译目录为compile,体协相关的内核头文件位于include/下,还有其他一些
   目录都是一些体系相关的外设的或者体系相关的一些特殊功能的实现。

3. BSD系统的启动流程
   BSD系统是把内核当成一个可执行文件通过启动程序加载到内存中,所有他的启动程序
   要做很多工作。现在的BSD的启动程序几乎就想一个支持elf文件格式和ufs文件系统的
   一个单任务的小的操作系统,启动程序同时也支持一些简单的命令。

   这里以i386平台为例,介绍OpenBSD的启动流程,NetBSD的启动流程类似。
   这个是arch/i386/stand/biosboot/biosboot.S文件开头的注释,实际上它已经详细说
   明了系统的启动流程:BIOS加载MBR到0x7C00, 然后把自己拷贝到0x7A00, 然后MBR加载
   biosboot.S到0x7C00, biosboot.S加载/boot到 4000:0000, 然后/boot加载内核到相
   应的内存,再把控制权传给内核。相应的一些文件都在stand目录下, mbr目录下是MBR
   的,boot下是/boot下的,用于从磁盘启动,cdboot下是cdrom的启动代码,pxeboot下
   是网络启动的代码,具体的细节就需要读者自己去读代码了。
*
* Memory layout:
*
* 0x00000 -> 0x079FF        our stack                (to  30k5)
* 0x07A00 -> 0x07BFF        typical MBR loc                (at  30k5)
* 0x07C00 -> 0x07DFF        our code                (at  31k)
* 0x07E00 -> ...            /boot inode block        (at  31k5)
* 0x07E00 -> ...            (indirect block if nec)
* 0x40000 -> ...        /boot                        (at 256k)
*
* The BIOS loads the MBR at physical address 0x07C00.  It then relocates
* itself to (typically) 0x07A00.
*
* The MBR then loads us at physical address 0x07C00.
*
* We use a long jmp to normalise our address to seg:offset 07C0:0000.
* (In real mode on x86, segment registers contain a base address in
* paragraphs (16 bytes).  0000:00010 is the same as 0001:0000.)
*
* We set the stack to start at 0000:79FC (grows down on i386)
*
* We then read the inode for /boot into memory just above us at
* 07E0:0000, and run through the direct block table (and the first
* indirect block table, if necessary).
*
* We load /boot at seg:offset 4000:0000.
*
   此时OpenBSD就进入了arch/i386/i386/locore.S的start:处,当然引导程序会传很
   多参数给内核,然后是操作系统的初始化代码了,现在就可以跟着代码读下去了。

   NetBSD的启动流程虽然和这个不一样,但类似。他是三级启动。其启动代码也在stand
   目录下,由mbr/mbr.S加载bootxx/pbr.S,然后pbr.S加载bootxx的其余部分,bootxx
   再加载boot/下的程序,这个程序就是/boot, /boot在运行netbsd,这样内核就启动了。

   内核被加载后执行的代码是arch/machine/machine/locore.S文件,对于i386, 内核执
   行这个文件时已经时保护模式下了,到了这个文件之后,就是系统的一些初始化相关
   的工作了,然后就可以跟着代码读下去了。
   
   总的来说,除了网络,其他部分OpenBSD处理的比NetBSD要简单一些,我的意思是要好
   懂一些。

4. 读BSD内核的相关资料

   第一本要看的书是《The Design of the UNIX Operating System》。这本书是看所有
   UNIX操作系统比看的书。

   OpenBSD的内核还是比较传统的,如果不管网络,《the Design and Implementation
   of the 4.4BSD Operating System》 和uvm作者的博士论文就差不多了。OpenBSD的
   网络是一大块,现在我还没有了解过,所以不做说明,还请知道的朋友能否介绍一下。
   
   NetBSD的内核和4.4BSD相比就改了很多了,增加了很多新的功能,比如线程调度,
   多处理器支持等等,NetBSD的官方网站上有很多很有用的资料。关于它的线程调度,
   我一直没有找到很好的资料,那位朋友知道的话不知能否能介绍一下。

相关网址:
1. 三套系统的官方网站:
   FreeBSD:www.freebsd.org
   NetBSD : www.netbsd.org
   OpenBSD :www.openbsd.org
2. uvm作者的主页:http://chuck.cranor.org
   uvm的论文的下载地址http://chuck.cranor.org/p/diss.pdf


上面的介绍中肯定有很多不妥之处,欢迎大家讨论,同时也希望能引出更多的美玉出来。

欢迎大家来信和我讨论关于BSD和plan9的问题(BSD和plan9都在学习中)。
email:zhurabbit@gmail.com

[ 本帖最后由 zhuzj 于 2006-8-29 09:07 编辑 ]

论坛徽章:
0
发表于 2006-08-28 09:23 |显示全部楼层
很好,太需要了!

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
发表于 2006-08-28 17:22 |显示全部楼层
没看过OB的,对比NB和FB,初学者的我也觉得是NB要清晰些。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP