首先内核空间分代码区,堆栈区,全局变量区。每个内核线程还有用户进程都有一个独立的内核堆栈区,Linux内核的堆栈一般是8K,所以在写内核程序的时候一定要小心,防止函数递归的出现,递归可能导致内核堆栈溢出。其次整个内核空间共用相同的页表,所以内核堆栈的在线性空间的起始地址都是不同的(有待考证,个人暂时猜测)
先从常说的进程控制块(PCB)说起,我们知道所谓的PCB就是task_struct变量,task_struct的许多模块都需要变内核中的一些函数修改或者仿问,所以task_struct应该在全局变量区。而task_struct指针就存放在一个task数组中,该数组的大小也就是系统中所有能容纳的进程的数目,当然是包括内核线程,因为内核线程也是用task_struct数据结构来表示的。
这个结构体包含的模块非常多,包括进程状态,进程标识符,IPC等等。今天 kernel结构之一要讲的就是File Sys。进程可以打开或者关闭文件,还能对文件进程其他操作,文件属于系统资源,linux将设备也抽像成文件。task_struct里面有两个数据结构和文件系统有关,就是fs_struct和file_struct。fs_struct中记录了两个VFS inode,当前工作目录和可执行文件镜像的目录。file_struct记录了进程打开的文件描述符。file_struct里面的数据是指针,指向file结构体,而每一个file结构体表示了每一个被打开的文件,file结构体中有f_flags,f_pos,f_count等成员。每个file 结构体都指向一个file_operations 结构体,这个结构体的成员都是函数指针,指向实现各种文件操作的内核函数。file_opertions结构体是一个非常常见的数据结构,说起来我们写的驱动程序其实也只不过是填充file_operations结构体。另外每个file 结构体都有一个指向dentry结构体的指针,每个dentry结构体都有一个指针指向inode 结构体。inode 结构体保存着从磁盘inode读上来的信息。inode 结构体有一个指向super_block结构体的指针。super_block结构体保存着从磁盘分区的超级块读上来的信息,例如文件系统类型、块大小等。
以上大概描述了,VFS如何对文件系统的挂载实现,以及如何如何把设备抽像成文件进行操作的实现。
阅读(707) | 评论(0) | 转发(0) |