- 博客(15)
- 资源 (14)
- 收藏
- 关注
原创 Ext2磁盘数据结构
要学习ext2文件系统,首先要学习ext2的磁盘设计,也就是说,ext2将一个磁盘分区格式化成一个什么样子。本篇博文就来介绍一下一个ext2文件系统的磁盘分区布局,重点关注它的数据结构。任何Ext2分区中的第一个块从不受Ext2文件系统的管理,因为这一块是为分区的引导扇区所保留的。Ext2分区的其余部分分成块组(block group),每个块组的分布图如图所示。正如你从图中所看到的,一些数据结构正好可以放在一块中,而另一些可能需要更多的块。在Ext2文件系统中的所有块组大小相同并被顺序存放,因此,内核可以
2010-06-22 10:10:00 4346 2
原创 Ext2的一般特征
<br />前面对虚拟文件系统VFS的讨论就告一段落了,VFS主要是提供一个系统调用接口,然后将相关文件系统对象与具体的文件系统串联起来。从本篇博文开始,我们将选择一个具体的文件系统进行研究,这个文件系统就是第二扩展文件系统(Ext2)。为啥要特别学习这个东西呢?因为ext2是Linux所固有的,事实上已在每个Linux系统中得以使用,因此我们自然要对Ext2进行讨论。此外,Ext2在对现代文件系统的高性能支持方面也显示出很多良好的实践性。固然,Linux支持的其他文件系统有很多有趣的特点,但比较扩展文件系
2010-06-22 09:45:00 2020 1
原创 VFS系统调用的实现
<br />至此,虚拟文件系统中主要的数据结构,以及最重要的path_lookup()函数我们都讲完了,那么就可以来讨论VFS的系统调用是如何实现的了。<br /> <br />当然,一篇博文讨论所有的系统调用是不现实的,所以我们不打算对所有VFS系统调用的实现进行讨论,这里只讲讲“开、读、写、关”四大VFS系统调用,而且是粗略的流程,请重点关注VFS的数据结构怎样互相用。至于其中的细节,由于涉及到页缓存、回收页框、mmap、块设备驱动等,别急,相关博文会来个详细分解的。<br /> <br />我们重新考
2010-06-22 00:30:00 3687 2
原创 路径名查找(续)
<br />上一篇博文我们分析了极其复杂的路径名查找流程,如果实在看不懂,还是用老方法,先理清相关的数据结构,然后再在纸上画一画。相信大家都欣赏到了Linux内核的复杂性了吧,不过事儿还没完呢,我们还留了两个尾巴,一个是父路径名查找问题,还有一个就是符号链接的查找问题,不过呢,如果上一篇文章你大致上读懂了话,这两个东西也不难。<br /> 1 父路径名查找<br /> <br />在很多情况下,查找操作的真正目的并不是路径名的最后一个分量,而是最后一个分量的前一个分量。例如,当文件被创建时,最后一个分量表示
2010-06-22 00:09:00 2524
原创 路径名查找
当进程必须识别一个文件时,就把它的文件路径名传递给某个VFS系统调用,如open()、mkdir()、rename()或stat()。我们这里要说明VFS如何实现路径名查找,也就是说如何从文件路径名导出相应的索引节点。执行这一任务的标准过程就是分析路径名并把它拆分成一个文件名序列。除了最后一个文件名以外,所有的文件名都必定是目录。如果路径名的第一个字符是“/”,例如:/usr/share/system-configure-ext2/test.conf,那么这个路径名是绝对路径,因此从current->fs-
2010-06-22 00:02:00 3450 1
原创 文件系统安装
<br />上一篇博文我们详细讲解了与文件系统安装相关的数据结构,现在我们就来谈谈一个特定的文件系统是怎么安装的。<br /> 1 安装普通文件系统<br /> <br />在sys_mount中调用do_mount()函数执行文件系统安装实务:<br />retval = do_mount((char *)dev_page, dir_page, (char *)type_page,<br /> flags, (void *)data_page);<br /> <br />do_mount()函数通
2010-06-21 23:54:00 3418
原创 文件系统安装预备知识
<br />就像每个传统的Unix系统一样,Linux也使用系统的根文件系统(system's root filesystem):它由内核在引导阶段直接安装,并拥有系统初始化脚本以及最基本的系统程序。<br /> <br />其他文件系统要么由初始化脚本安装,要么由用户直接安装在已安装文件系统的目录上。作为一个目录树,每个文件系统都拥有自己的根目录(root directory)。安装文件系统的这个目录称之为安装点(mount point)。已安装文件系统属于安装点目录的一个子文件系统。例如,/proc虚拟
2010-06-21 23:44:00 2909
原创 文件系统注册
<br />前面主要把VFS对象,以及他们如何串联起来的内容介绍得差不多了。相信走大现在,大家对大概的VFS工作机制有了相应的了解,接下来要做的事,就是把那些重要的细节描述清楚。首先,Linux内核支持很多不同的文件系统类型。本篇博文,我们将讨论文件系统注册——也就是通常在系统初始化期间并且在使用文件系统类型之前必须执行的基本操作。一旦文件系统被注册,其特定的那些虚拟文件模型中的对象中的函数对内核就是可用的了,因此文件系统类型可以安装在系统的目录树上。<br /> <br />接下来,我们再介绍一些特殊的文
2010-06-21 22:07:00 2434
原创 把Linux中的VFS对象串联起来
<br />上一篇博文讲到了内核提供的通用虚拟文件模型中四大数据结构极其操作,那么,为了使各种文件系统和谐相处,这些对象又是怎么串联起来的呢。本博,我们就重点讨论他们怎样与内核交互,包括如何与进程打交道,以及介绍一些相关的缓存机制。<br /> 1 与进程相关的文件<br /> <br />首先,文件必须由进程打开,每个进程都有它自己当前的工作目录和它自己的根目录。这仅仅是内核用来表示进程与文件系统相互作用所必须维护的数据中的两个例子。类型为fs_struct的整个数据结构就用于此目的,且每个进程描述符ta
2010-06-21 14:52:00 5343 1
原创 Linux I/O体系结构
<br />为了确保计算机能够正常工作,必须提供数据通路,让信息在连接到个人计算机的CPU、RAM和I/O设备之间流动。这些数据通路总称为总线,担当计算机内部主通信通道的作用。<br /><br />所有计算机都拥有一条系统总线,它连接大部分内部硬件设备。一种典型的系统总线是PCI(Peripheral Component Interconnect)总线。目前使用其他类型的总线也很多,如ISA、EISA、MCA、SCSI和USB。<br /><br />典型的情况是,一台计算机包括几种不同类型的总线
2010-06-07 12:03:00 5556 1
原创 VFS对象数据结构
<br />前面讲了,为了使各种文件系统和谐相处,内核提供了一个通用的虚拟文件模型。本博,我们就重点讨论组成这个通用文件模型的那些对象的数据结构。<br /> <br />每个VFS对象都存放在一个恰当的数据结构中,其中包括对象的属性和指向对象方法表的指针。内核可以动态地修改对象的方法,因此可以为对象建立专用的行为。<br /> <br />所有的VFS对象都放在include/linux/Fs.h中。<br /> 1 超级块对象<br /> <br />超级块对象由super_block结构组成:<br
2010-06-02 12:41:00 3814
原创 虚拟文件系统
现在我们的主流价值观是社会和谐、世界和谐。同样,Linux成功的关键因素之一是它具有与其他操作系统和谐共存的能力。你能够透明地安装具有其他操作系统文件格式的磁盘或分区,这些操作系统如Windows、其他版本的Unix,甚至像Amiga那样的市场占有率很低的系统。通过所谓的虚拟文件系统概念,Linux使用与其他Unix变体相同的方式设法支持多种文件系统类型。虚拟文件系统所隐含的思想是把表示很多不同种类文件系统的共同信息放入内核;其中有一个字段或函数来支持Linux所支持的所有实际文件系统所提供的任何操作。
2010-06-01 19:19:00 5524 2
原创 堆的管理
<br />一般人喜欢把堆和栈来做对比,网上资料也很多,这里我只分享一下我本人的理解。堆这个东西跟栈没有直接的关联,它只给程序员提供一个手工分配和释放的内存空间,仅此而已。<br /><br />对于每个Unix进程来说,都拥有一个特殊的线性区,这个线性区就是所谓的堆(heap),堆用于满足进程的动态内存请求。内存描述符的start_brk与brk字段分别限定了这个区的开始地址和结束地址。<br /><br />进程可以使用下面的C语言API来请求和释放动态内存:<br /><br />mall
2010-06-01 17:35:00 2047
原创 创建和删除进程的地址空间
<br />本博,我们重点关注fork()系统调用为子进程创建一个完整的新地址空间。相反,当进程结束时,内核撤消它的地址空间。我们重点来讨论Linux如何执行这两种操作。<br />1 创建进程的地址空间<br /><br />回忆一下“进程的创建 —— do_fork()函数详解”博文:当创建一个新的进程时内核调用copy_mm()函数。这个函数通过建立新进程的所有页表和内存描述符来创建进程一的地址空间:<br /><br />static int copy_mm(unsigned long
2010-06-01 17:17:00 3914
原创 处理非连续内存区访问
<br />回忆一下“缺页异常处理程序”,当出现缺页异常,并且是进程处于内核态,即do_page_fault()中的那个if (unlikely(address >= TASK_SIZE))分支语句后,将通过vmalloc_fault(address)判断该发生缺页异常的地址address是否处于非连续内存区:(arch/i386/mm/Fault.c)<br />static inline int vmalloc_fault(unsigned long address)<br />{<br /
2010-06-01 10:55:00 2605
NFS文件系统
2012-04-08
数据结构与算法——面向对象C++设计模式
2011-11-27
高性能分布式监控系统Ganglia详解
2011-07-10
疯狂内核之——内核初始化
2011-05-30
疯狂内核之——Linux虚拟内存
2011-05-30
疯狂内核之——进程管理子系统
2011-05-30
疯狂内核之——Linux预备知识.pdf
2011-05-30
基于C++语言的GoF23种设计模式
2011-05-29
从8086到Pentium Ⅲ微型计算机及接口技术3
2010-09-24
Linux sysfs 文件系统机制详解
2009-12-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人