在写驱动的过程中,对于入口函数与出口函数我们会用一句话来修饰他们:module_init与module_exit,那会什么经过修饰后,内核就能狗调用我们编写的入口函数与出口函数呢?下面就来分析内核调用module_init的过程(这里暂时分析编译进内核的模块,不涉及动态加载的模块),以这个过程为例子来了解内核对于不同段的函数的调用过程. 下面从内核的start_kernel函数开始分析,下面是调用过程: start_kernel rest_init kernel_init do_basic_se…
http://blog.chinaunix.net/uid-20940095-id-66148.html 一 linux内核源码阅读工具 windows下当然首选source insight, 但是linux下就没有source insight这么优秀的工具了,但是也有不少的替代品,但觉绝对部分人会选择vim+ctags+cscope的组合,还有部分人或选择wine中的source insight或选择navigatror,当然对于代码阅读来说vim+ctags+cscope的组合还是比较好的一…
从来没有写过源码阅读,这种感觉越来越强烈,虽然劣于文笔,但还是下定决心认真写一回. 源代码下载请参见上一篇flashcache之我见 http://blog.csdn.net/liumangxiong/article/details/11643473 下面代码对应的是tag下面的1.0版本的. 看内核模块源码,闭着眼睛打开flashcache_init函数,区区百来行代码何足惧也. 1963int __init 1964flashcache_init(void) 1965{ 1966 int r…
前面我们的分析中重点关注正常的数据流程,这一小节关注如果有异常,那么流程是怎么走完的呢? 1)创建新任务时kcached_job申请不到 2)读写命中时cache块为忙 3)系统关机时处理,系统开机时处理,系统异常掉电后的处理 首先来看第1种情况,申请kcached_job是在函数flashcache_lookup中, 543/* 544 * dbn is the starting sector, io_size is the number of sectors. 545 */ 546stati…
上一节讲到在刷缓存的时候会调用new_kcahed_job创建kcached_job,由此我们也可以看到cache数据块与磁盘数据的对应关系.上一篇:http://blog.csdn.net/liumangxiong/article/details/11726651 现在继续从new_kcached_job函数中挖掘有用的信息.那就是cache块跟磁盘上扇区是怎么对应起来的?即329行的为什么要写的disk.sector是后面这个值呢?           job->disk.sector =…
其实到目前为止,如果对读流程已经能轻松地看懂了,那么写流程不需要太多脑细胞.我觉得再写下去没有太大的必要了,后面想想为了保持flashcache完整性,还是写出来吧.接着到写流程: 1530static void 1531flashcache_write(struct cache_c *dmc, struct bio *bio) 1532{ 1533 int index; 1534 int res; 1535 struct cacheblock *cacheblk; 1536 int queue…
这一小节介绍一下flashcache读写入口和读写的基础实现. 首先,不管是模块还是程序,必须先找到入口,用户态代码会经常去先看main函数,内核看module_init,同样看IO流时候也要找到入口.flashcache作为一个dm_target,入口就是struct target_type 的map函数,对应的是flashcache_map函数: 1581/* 1582 * Decide the mapping and perform necessary cache operations f…
flashcache数据结构都在flashcache.h文件中,但在看数据结构之前,需要先过一遍flashcache是什么,要完成哪些功能?如果是自己设计这样一个系统的话,大概要怎么设计. 前面讲过,flashcache主要用途还是在写缓存上,要写入磁盘的IO先写入速度较快的SSD盘,随后再由单独的线程将SSD盘中脏数据块同步到磁盘中.这样看来,SSD就是一个缓存,有缓存的基本特性如命中.脏.水位线.写回策略等概念. 作为一个缓存,就必须划分为块,这些块对应于磁盘上大小相同的数据块,所以需要将S…
正常流程到flashcache_map的1623行或1625行,按顺序先看读流程: 1221static void 1222flashcache_read(struct cache_c *dmc, struct bio *bio) 1223{ 1224 int index; 1225 int res; 1226 struct cacheblock *cacheblk; 1227 int queued; 1228 1229 DPRINTK("Got a %s for %llu %u bytes)&…
Linux源码下载: https://www.kernel.org/ https://git.kernel.org/ Linux内核源码阅读以及工具(转): https://blog.csdn.net/kkwant/article/details/82795659…