- 博客(10)
- 资源 (4)
- 收藏
- 关注
原创 linux内核对伙伴系统的改进--migrate_type
<br />linux底层使用伙伴系统-buddy管理物理内存,buddy可以被证明是一种很有效的内存管理方式,但是它也拥有很多缺点,其中碎片避免的不完备性--仅仅寄托于释放时的合并操作而不考虑分配时的策略,这也许是它最大的不足,linux2.6内核的后期版本对这个问题进行了改进,大大避免了碎片的泛滥。在linux中,buddy是通过下列数据结构表示的(2.6的早期内核): <br />struct free_area {<br /> struct list_head free_list
2010-12-30 20:21:00 9168 2
原创 linux内核模块的版本检查机制
<br />linux内核对插入的内核模块进行严格的版本检查,即使一个小版本号不一致也会导致加载的不成功,这完全是为了内核本身运行安全。由于linux内核的发布是基于版本号的,而所有的内核模块的开发必须依赖内核头文件--其使用的内核导出符号均在头文件中,该头文件肯定属于一个特定版本的源码树,因此模块也就间接依赖了该版本的源码树。那么到底为何内核对模块的版本检查如此严格呢?因为每当一个新的版本发布,可能导致接口的改变,如果不严格检查版本则可能导致内核crash,然而如果旧版本的模块难道没有任何办法载入到新版本
2010-12-29 20:50:00 7393
原创 sync_inodes和sync_filesystems
<br />[基于2.6.8内核]<br />这两个函数在do_sync的时候都要调用两次,这是为何?sync_filesystems这个函数的作用是什么?do_sync在什么时候会被调用?<br /> 对于第一个问题,调用两次其实就是一个分类,do_sync的实现如下:<br />static void do_sync(unsigned long wait)<br />{<br /> wakeup_pdflush(0); //唤醒pdflush,使之帮忙在调用do_syn
2010-12-14 20:36:00 37743 3
原创 buffer_head和bio
<br />buffer_head完全按照设备块来进行io,块大小取决于设备但是普遍比页面小,bh的元数据比率开销过大,bio则按照页面大小进行io,然而一个bio中可以包含多个页面,因此聚集的基于page的io吞吐量更大些,这就好比用桶提水比用汤勺舀水效率高一样。因此2.6内核普遍使用bio代替了bh,然而传统的bh并没有消失,只是它完全用bio来实现了,在读取小数据的时候,基于设备块来读取还是很可取的,因此内核干脆设计出一个 bh_lru缓存结构体来缓存8个最近使用并且猜测还将被使用的bh,这可能是一些
2010-12-11 21:10:00 37381
原创 kexec机制
<br />kexec是一个内核机制,注意它的参数,一个是-l,一个是-p,-l加载的内核不能用于panic之后重启的,只有-p加载的内核才可以用于panic重启,另外使用linux的启动命令行也是可以的,效果和-p是一样的。<br />kexec -l加载的内核一般用于快速重启系统,前提是要确保硬件设备处于“和谐”状态(通过kexec重启就是为了跳过硬件的初始化这个漫长的阶段,所以只有和谐状态的硬件才能跳过的),而kexec -p加载的内核用于内核panic时转储使用,既然内核都panic了,硬件很可
2010-12-11 21:09:00 37159
原创 问题以及发现问题和解决问题
<br />发现问题比解决问题更重要,如果发现了问题的所在,解决它仅仅是一个时间的问题,可能有些问题永远解决不了,但是我们最终知道它永远解决不了也算是解决了问题。问题的实质其实是一种反差,也就是期望和实际的反差,这是好事,如果每件事都和我们期望的一致,那么我们的脑子里面就不会有问题了,思维就僵化了。解决问题的本质就是缩小这种反差,其实是两种方式,第一种方式是结果向期望靠拢,第二种方式是期望向结果靠拢,还有一种是同时向对方靠拢。将我不熟悉的东西往我们熟悉的东西上靠拢,这既是对之前经验积累的一种利用,同时又是一
2010-12-11 21:06:00 36050
原创 linux内核page结构体的PG_referenced和PG_active标志
<br />linux内核使用了lru算法来置换内存页面,但是实际上并不是纯的lru算法,里面掺杂了很多别的思想,比如第二次机会,比如双时钟指针等等。这里着重说一下第二次机会的体现。在内核中有一个mark_page_accessed函数,它实际上体现一个状态机,这是它的实现:<br />if (!PageActive(page) && PageReferenced(page) && PageLRU(page)) { <br /> activate_page(page); <br />
2010-12-11 21:03:00 7749 1
原创 linux内存管理系统后期的内核对zonelist的简化
<br />struct pglist_data {<br /> struct zone node_zones[MAX_NR_ZONES];<br /> struct zonelist node_zonelists[GFP_ZONETYPES];<br />...<br />}<br />GFP_ZONETYPES是一个宏,在2.6.8的时候它如下定义:<br />#define GFP_ZONEMASK 0x07<br />/* #define GFP_ZON
2010-12-11 21:01:00 38676 4
原创 linux内核内存管理中的pagevec结构体
<br />linux内核的内存管理中有一个2.6内核才加入的并不很张扬的结构体,那就是pagevec:<br />struct pagevec {<br /> unsigned long nr;<br /> unsigned long cold;<br /> struct page *pages[14];<br />};<br />以往要加入到lru链表的page都要加入到这个pagevec了,并不再直接往lru中加入了。可是不加入lru的page就不会被内存管理
2010-12-11 20:59:00 8862 1
原创 一个日志输出系统的设计
<br />本文介绍一个基于linux进程调度策略来调度的信息输出系统,多条信息可以显示多次,每次的显示时间也可以设置:<br />以下是头文件定义loglet.h:<br />#include <pthread.h><br />#define MAX_PRIO 8<br />#define MAX_LENGTH 512<br />static inline void __set_bit(int nr, volatile unsigned long * addr)<br />{<br
2010-12-11 20:58:00 35848
一个iptables的stateless NAT模块实现
2014-12-27
模块化的nf-HiPAC
2014-11-21
关于linux内核以及其他个人体会的文集
2009-09-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人