NetBSD系列介绍--设备管理

1. 设备的初始化
    NetBSD 中设备是以设备之间的总线关系进行管理的,编译的时候根据配置文件生成一个设备树。设备树在编译kernel前执行config命令的时候生成,设备之间的关系在src/sys/arch//config/中描述,比如src/sys/arch/i386/config/GENERIC中就描述了一般i386 PC的设备之间的关系。这些设备中有一个叫mainbus,这个是根节点,i386 PC中mainbus上挂cpubus,pcibus等等,pcibus上又挂usbbus或者某个pci设备,系统初始化的时候会一层一层的扫描这些总线,直到所以设备初始化完毕。
    NetBSD 在 src/sys/kern/init_main.c 中的 main() 中的调用configure()完成设备的初始化,在 configure()中会调用cpu_configure(),这个函数负责完成平台相关的设备初始化,因为不同平台的设备模型可能是不一样的,在cpu_configure()中会找mainbus,找到mainbus后会attach mainbus,然后根据设备树的结构一层一层的初始化设备节点数上的每个设备。调用顺序是              
     main()->configure()->config_init()
                        ->cpu_configure()->config_rootfound("mainbus",)->mainbus_attach()
config_init()负责初始化自动配置相关的数据结构,这些数据结构有config生成,在执行config的时候会在编译目录里生成3个*.c的文件,其中两个devsw.c和ioconf.c, 和设备初始化相关。cpu_configure()会从由config_init()生成的表中查找设备和相应的驱动程序。
在初始华mainbus的时候,在mainbus_attach()中初始化所有设备。

2. 设备的使用
    在根文件系统的/dev/目录下,有很多设备节点,这些设备需要先打开,然后才能读写。通过open()系统调用就能打开这些设备,当执行open()的时候,文件名是一个参数,NetBSD kenel拿到这个文件名之后会把这个文件名转换成一个vnode,在NetBSD中每一个文件,每一个目录都会有一个vnode表示,这相关的内容是文件系统的东西,将在文件系统中介绍。比如/dev/console,如果你的根文件系统是ffs,你要访问这个设备,当你open 这个设备的时候,系统走到kernel里面会转到sys_open(),调用流程是sys_open()->vn_open()->namei()->do_namei()->lookup()->ufs_lookup->ffs_vget()->ufs_vinit()
这个调用流程不是具体的,只是指出一个顺序,具体实现还有认真分析代码。ffs_vget会读出这个inode所在的磁盘的内容,然后在ufs_vinit()中会根据读出来的inode的类型初始化vnode中的v_op指针,如果是设备节点就初始化为specops,这样以后的read/write就转到specfs中去了,specfs的实现在src/sys/miscfs/specfs中。在specfs中,再根据设备号查找相应的设备驱动程序,完成对设备的操作。

3. 关于NetBSD设备管理的一些说明
    NetBSD的设备关系是在编译内核前就指定了的,所以不能动态加载配置中没有的设备驱动,但现在引入了一个叫drvctl的设备,实现在src/sys/kern/kern_drvctl.c,具体是干什么用的,我还不是很清楚,还没有仔细研究,看着像是一种支持动态加载设备的框架。只有实现了vget()的文件系统才能做根文件系统,否则将不能支持设备管理,也就是文件系统必须支持从inode的属性判断该文件的类型,并能保存设备的一些信息,主要是设备号,这样才能查找设备驱动。
12-16 14:09