标题: 内核日记
unix1998
自由撰稿人
Rank: 4
荣誉版主



UID 5331
精华 4
积分 0(积分有什么用?)
帖子 2177
阅读权限 10
注册 2001-10-24
状态 离线
发表于 2003-4-29 19:17  资料  个人空间  短消息  加为好友 
是的,读核很累。
不过好在你无须按顺序去读。
比如分内存,fs,驱动,net等大块去攻。
我觉得应该编写程序边读,能记得牢些。否则很容易忘,mm我就忘差不多了(是内存管理,不是MM哦)。
而我在读核时,写了一些驱动程序,所以fs_operation这些就比较熟。驱动这块的代码读了差不多,再读其他的,会容易些,至少很多数据结构都已经见过,不是那么陌生了。


通过读核,检验出本人属于没有毅力的一类:)

顶部
gqhua
小试牛刀
Rank: 2
注册用户



UID 42295
精华 1
积分 0(积分有什么用?)
帖子 63
阅读权限 10
注册 2003-4-17
来自 华南理工大学
状态 离线
发表于 2003-4-30 19:23  资料  个人空间  短消息  加为好友 
2003.04.30读核日记--关于FAT文件系统的结构

应blueflame的提问,我把FAT更详细的一些数据结构写出,供大家参考:
总体结构依次是:
IPL(引导区),fat表1,fat表2,根目录,数据区。
fat表2与fat表1一样,主要是起备份作用。数据区以簇为基本单位进行分配。
IPL即起引导系统作用,又含有类似超级块的数据,所以应该从这里取超级块的信息。
fat表有两个作用,一个是起记录空闲块的作用,一个起文件数据链指针的作用。fat其实是个数组,它的每一项(fat12是12位算一项,即1.5个字节,fat16是2字节一项),每一项记录它对应的簇的使用情况。当它为0,表示此簇空闲,当不为0,表示文件的下一簇的簇号(别外有几个特殊的数有特殊意义,如
fat16时,0xffff表示文件结束,即没有下一簇了。)
在fat中的簇与ext2中的块是一个意思,都为基本分配单位。

从fat的结构可见,它比ext2简单多了。文件的不同块通过fat表联起来,而不象
ext2,把它放在i节点,或文件内部(指二级,三级索引所需的块)

下面为各部具体的结构:
1。IPL(initial program loader)结构:
占一个扇区
偏移(16进制)              长度(字节)                  内容
======================================
00                             3               短跳指令
03                             8               OEM厂家名和版本
0b                             2               每扇字节数
0d                             1               每簇扇数
0e                             2                预约的扇区数
10                             1                FAT的个数
11                             2                根目录项数
13                             2                逻辑扇区数
15                             1                 介质描述符
16                             2                每FAT的扇区数
18                             2                每磁道扇区数
1a                             2                磁头数
1c                             2                隐含的扇区数
--------------
1e                IPL引导程序
---------------
4个分区表

2。FAT表的数值含义(指12位和16位的)

簇值(0x)                   内容
========================
000(fat12)                 空闲簇
0000(fat16)
---------------------------------------
001                不用的代码
0001
---------------------------------------
ff7                不良簇(即簇可能有坏区)
fff7
--------------------------------------
ff8--fff                文件结束标志
fff8-ffff
---------------------------------------
002--ff6                下一个簇号
0002--fff6
=======================


3。 目录项的结构:每项32字节
偏移               字节数            内容
========================
00-07                8        文件名
08-0a                3        扩展名
0b                1        文件属性
0x-15                10        保留区
16-17                2        最终编辑时间
18-19                2        最终编辑日期
1a-1b                2        起始簇号
1c-1f                4        文件大小

文件名第一字节含义
00表示此目录未使用
e5表示此目录项被删
2e,若第2字节也是2E,则表示为父目录(..)
       若第2字节不是2E,则表示为本身目录(.)

文件属性:
0        只读
1          隐含
2        系统
3        卷标
4        子目录
5        存档

4。一些数据的计算:
  注意:簇号从2开始排
  逻辑扇区号=(簇号-2)*簇长+数据区起始扇号
  逻辑扇区数=预约扇区数+(扇数每FAT)*FAT表数+根目录扇区数+簇数*(扇数每簇)
根目录扇区数=(根目录项数*32)/(字节每扇区)
最大簇号=簇数+1
FAT簇数<=4085 :用FAT12
              >=4086 :用FAT16

如有错误,欢迎指正
也请有知道fat32,ntfs结构的人补充。





宝剑锋从磨砺出,梅花香自苦寒来 积硅步至千里 , 集小流成江河
顶部
不容错过的IBM 集群技术资源汇总
blueflame
实习记者
Rank: 5Rank: 5
荣誉版主



UID 24711
精华 2
积分 0(积分有什么用?)
帖子 744
阅读权限 10
注册 2002-9-18
来自 BJ
状态 离线
发表于 2003-5-7 08:58  资料  个人空间  短消息  加为好友 
2003.04.28读核日记--高速缓存的数据结构的理解
你说的缓冲区高速缓存,一个页框中可能会有几个缓冲区.还有那7条练,在我的印象中好像那是关于文件缓冲用的.而你说第三种页高速缓存才是用于文件缓存.我对于这几种缓存的叫法一直比较模糊.缓冲区高速缓存是不是buffer cache.那应该好像不会用于文件缓冲的.这种页的mapping结构应该是null.[/Color]





依然记得从你口中说出再见坚决如铁,昏暗中有种烈日灼身的错觉; 依然记得从你眼中滑落的泪伤心欲绝,混乱中有种热泪烧伤的错觉....
顶部
不容错过的IBM 集群技术资源汇总
gqhua
小试牛刀
Rank: 2
注册用户



UID 42295
精华 1
积分 0(积分有什么用?)
帖子 63
阅读权限 10
注册 2003-4-17
来自 华南理工大学
状态 离线
发表于 2003-5-8 00:57  资料  个人空间  短消息  加为好友 
buffer cache就指得是缓冲区高缓,page cache指得是页高缓,也就是你所说的文件高缓,因为文件就是以页为单位进行读写,所以文件用的高缓就是指页高缓。
这两个名英文名词,我感觉给人一个错觉,比如buffer一般让人理解为一个缓冲区,无论其大小,但此处的buffer cache中的buffer 强调的是磁盘块大小了缓冲区,它直接与磁盘读写联系,即磁盘上一个盘块通过DMA读入后,就首先放在buffer cache的一个buffer中,所以我感觉把这个buffer cache理解block cache
更让人好理解。

因为一个文件的一页,在磁盘上可能对应几个磁盘块(因为1页>1块),且这几个块可能不是连续的,所以当把这个文件的一个页读入内存,就必须把这个页框分成几个块(由页划分的块显然连续),当磁盘上此页的几个磁盘块读入内存后,就连续的放入到此页中,即几个连续块中。所以完成了由不连续的磁盘块到连续的内存块的映射。同时完成了外存的一页到内存的一页的映射。

所以说页高缓最终要利用buffer高缓,来完成外存的读写,或者说它层次是:
外存文件的一页(分解为几块,可能不连续)------外存的磁盘块-----内存的buffer块-------内存文件的一页(由一个页框划分的几个连续buffer构成).----页高缓系统

2.4中用的address_space其实并没什么新鲜的,它不过是把页高缓的管理数据更加集中存放罢了。所以只要懂2.2版,再看2.4就没什么难的。

表达能力有限,总感觉说不清楚,understanding linux kernel的第一版(2.2内核)和第二版(2.4内核)吧,它讲得比较透彻。





宝剑锋从磨砺出,梅花香自苦寒来 积硅步至千里 , 集小流成江河
顶部
不容错过的IBM 集群技术资源汇总
ykwj121
实习记者
Rank: 5Rank: 5
注册用户



UID 9756
精华 0
积分 0(积分有什么用?)
帖子 793
阅读权限 10
注册 2002-1-29
来自 -)
状态 离线
发表于 2003-5-8 12:36  资料  个人空间  短消息  加为好友 
我在
http://joyfire.net/jln/kernel/3.html#I377
看了下一段话,贴出来给你们看一下,我觉得有不少提示作用。

QUOTE:
2.4的改进:page cache和buffer cache耦合得更好了。在2.2里,磁盘文件的读使用page cache,而写绕过page cache,直接使用buffer cache,因此带来了同步的问题:写完之后必须使用update_vm_cache()更新可能有的page cache。2.4中page cache做了比较大的改进,文件可以通过page cache直接写了,page cache优先使用high memory。而且,2.4引入了新的对象:file address space,它包含用来读写一整页数据的方法。这些方法考虑到了inode的更新、page cache处理和临时buffer的使用。page cache和buffer cache的同步问题就消除了。原来使用inode+offset查找page cache变成通过file address space+offset;原来struct page 中的inode成员被address_space类型的mapping成员取代。这个改进还使得匿名内存的共享成为可能(这个在2.2很难实现,许多讨论过)。


顶部
ykwj121
实习记者
Rank: 5Rank: 5
注册用户



UID 9756
精华 0
积分 0(积分有什么用?)
帖子 793
阅读权限 10
注册 2002-1-29
来自 -)
状态 离线
发表于 2003-5-8 12:53  资料  个人空间  短消息  加为好友 
目前我用的是redhat8.0的2.4.18-14内核,出了一个问题,逼得我只好开始读mm和fs部分的代码。也许你们愿意带着问题去读内核,我把问题贴在如下:

问题是:当我在系统里写文件的时候,系统的内存会不断的降低(降的数字就是文件大小),只有通过rm的时候内存才会如数回到原来的数字。当一个劲写文件的时候,内存降到大约还有十几兆的时候,就不会再降了,但这时候如果还有其它内存需要就有可能会使用swap(使用swap是我不能接受的)。
从free或vmstat命令观察到写的文件都在内存memory的cached里面。就是说内存被大量吃掉是因为cached的原因。
从cat /proc/meminfo可以看到吃掉的内存全部在Inact_dirty里面,为什么Inact_dirty无法释放出来?
过了很多个小时也仍然不会释放,那内存不够用的时候为什么不先从Inact_dirty里面查找过期的块呢?
内存降到十几兆的时候就不会降了,这是因为DMA zone的那16M的原因吗?还是因为其它,我是否可以控制它?

顶部
不容错过的IBM 集群技术资源汇总
blueflame
实习记者
Rank: 5Rank: 5
荣誉版主



UID 24711
精华 2
积分 0(积分有什么用?)
帖子 744
阅读权限 10
注册 2002-9-18
来自 BJ
状态 离线
发表于 2003-5-9 17:33  资料  个人空间  短消息  加为好友 
我觉得http://www-900.ibm.com/developer ... nt/tune/index.shtml
3.3节应该可以解决这个问题.[/Color]





依然记得从你口中说出再见坚决如铁,昏暗中有种烈日灼身的错觉; 依然记得从你眼中滑落的泪伤心欲绝,混乱中有种热泪烧伤的错觉....
顶部
不容错过的IBM 集群技术资源汇总
gqhua
小试牛刀
Rank: 2
注册用户



UID 42295
精华 1
积分 0(积分有什么用?)
帖子 63
阅读权限 10
注册 2003-4-17
来自 华南理工大学
状态 离线
发表于 2003-5-9 18:45  资料  个人空间  短消息  加为好友 
我看了blueflame推荐的那篇文章,但好象有几个地方是不是有问题:
"我们知道越是靠磁盘外部的柱面,旋转越快,而且每次旋转时,磁盘读写头可以覆盖较多的区域,也就意味着靠外部的柱面可以得到较好的性能。所以在分区时,我们应该考虑将访问频率高的,对系统性能影响相对较大的分区置于磁盘的靠外部分"
1。硬盘的磁道是从里到外编号,还是从外到里?我没查过资料,但光盘是从里到外编号应该没什么问题吧,这从刻光盘时就可看出来,所以我想谁能查一下资料证实一下。
(他讲的好象是从外到里,而我怀疑)
2。他那么分区我认为没有用。因为磁盘转速并不是匀速的,而是当磁头从里到外移动时,为了保持基本不变的读数据的线速,必须不断的调整转速,使读数据的线速基本不变,所以我怀疑他说的在磁头在外面时,读速快,是一种想当然的认识,也请大家证实一下。

3。他讲到用软raid技术,我认为这不能提高性能,最多是增加了磁盘的冗余度,从而提高了可靠性而已。
因为把同一个盘划成不同的区,这些区必然有内外之别(这与用不同的硬盘作raid是两码事,因为不同的硬盘可并行操作,而同一个盘划成不同区,也只能串行寻道,而且为了找不同的区,还必须不停的寻道)。所以我怀疑性能有提高这种说法,也请大家证实一下。





宝剑锋从磨砺出,梅花香自苦寒来 积硅步至千里 , 集小流成江河
顶部
ykwj121
实习记者
Rank: 5Rank: 5
注册用户



UID 9756
精华 0
积分 0(积分有什么用?)
帖子 793
阅读权限 10
注册 2002-1-29
来自 -)
状态 离线
发表于 2003-5-9 18:54  资料  个人空间  短消息  加为好友 
这篇文章我很早就拜读过了,这里面的方法基本上都亲身体验过。
不知道blueflame指的可以解决问题的是哪段?

顶部
不容错过的IBM 集群技术资源汇总
gqhua
小试牛刀
Rank: 2
注册用户



UID 42295
精华 1
积分 0(积分有什么用?)
帖子 63
阅读权限 10
注册 2003-4-17
来自 华南理工大学
状态 离线
发表于 2003-5-9 21:38  资料  个人空间  短消息  加为好友 
不要指望交换算法能让你满意了,若让你满意了,别人就不满意了。你若想让自己满意,就必须使算法的天平向你倾斜。
我看了understanding the linux kernel,总算明白了这个道理:

”As a matter of fact,the hardest job of a developer working on the virtual memory subsystem consists of finding an algorithm that ensures acceptable performances both to desktop machines and to high-level machines like large database servers.

Unfortunately,finding a good page frame reclaiming algorithm is a rather empirical job,with very little support for theory.The situation is somewhat similar to evaluation the parameters that achieve good system performance,without asking too many questions about why it works well.Often,it's just a matter of "let's  try this approach and see what happens..."An unpleasant side effect of this empirical approach is the code changes quickly,even in the evennumbered versions of Linux,which are supposed to be stable.


所以,应该用”let's try this approach and see what happens..."心态去
读这一部分的算法,理解作者的用意便可。你要是不服气,改改它,让它适合你的胃口。
比如:你上面不断的写文件,显然不要缓冲,只要写回文件到硬盘才是最佳的算法。





宝剑锋从磨砺出,梅花香自苦寒来 积硅步至千里 , 集小流成江河
顶部
 



当前时区 GMT+8, 现在时间是 2008-5-17 00:52

    Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
Processed in 0.134585 second(s), 5 queries

清除 Cookies - 联系我们 - Linux伊甸园 - Archiver - WAP