从来没有写过源码阅读,这种感觉越来越强烈,虽然劣于文笔,但还是下定决心认真写一回. 源代码下载请参见上一篇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读写入口和读写的基础实现. 首先,不管是模块还是程序,必须先找到入口,用户态代码会经常去先看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完整性,还是写出来吧.接着到写流程: 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_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)&…
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的组合还是比较好的一…
在写驱动的过程中,对于入口函数与出口函数我们会用一句话来修饰他们:module_init与module_exit,那会什么经过修饰后,内核就能狗调用我们编写的入口函数与出口函数呢?下面就来分析内核调用module_init的过程(这里暂时分析编译进内核的模块,不涉及动态加载的模块),以这个过程为例子来了解内核对于不同段的函数的调用过程. 下面从内核的start_kernel函数开始分析,下面是调用过程: start_kernel rest_init kernel_init do_basic_se…
Linux源码下载: https://www.kernel.org/ https://git.kernel.org/ Linux内核源码阅读以及工具(转): https://blog.csdn.net/kkwant/article/details/82795659…
轻松学习Linux操作系统内核源码的方法 针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制:一.核心源程序的文件组织:1.Linux核心源程序通常都安装在/usr/src/linux下,而且它有一个非常简单的编号约定:任何偶数的核心(例如2.0.30)都是一个稳定地发行的核心,而任何奇数的核心(例如2.1.42)都是一个开发中的核心. 本文基于稳定的2.2.5源代码,第二部分的实现平台为 RedHat Lin…
来源:http://blog.csdn.net/eastmoon502136/article/details/8711104 推荐阅读:linux内核源码最初版linux内核源代码,简单易懂,适合初学者  http://download.csdn.net/download/are2008/2001389 注:以下大部分内容摘自linux内核编程入门篇和linux内核完全注释 在工作的这段时间,发现我的visio画图熟悉了点点,总喜欢把什么源码啊,结构啊之类的就当作流程图来画来理解,因为对于图,有…
一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都知道,想成为优秀的程序员,需要大量的实践和代码的编写.编程固然重要,但是往往只编程的人很容易把自己局限在自己的知识领域内.如果要扩展自己知识的广度,我们需要多接触其他人编写的代码,尤其是水平比我们更高的人编写的代码.通过这种途径,我们可以跳出自己知识圈的束缚,进入他人的知识圈,了解更多甚至我们一般短…
一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都知道,想成为优秀的程序员,需要大量的实践和代码的编写.编程固然重要,但是往往只编程的人很容易把自己局限在自己的知识领域内.如果要扩展自己知识的广度,我们需要多接触其他人编写的代码,尤其是水平比我们更高的人编写的代码.通过这种途径,我们可以跳出自己知识圈的束缚,进入他人的知识圈,了解更多甚至我们一般短…
Linux内核源码分析方法 转自:http://www.cnblogs.com/fanzhidongyzby/archive/2013/03/20/2970624.html 一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都知道,想成为优秀的程序员,需要大量的实践和代码的编写.编程固然重要,但是往往只编程的人很容易把自己局限在自己的知识领域内.如果…
/** ****************************************************************************** * @author    暴走的小哥哥 * @version   V1.0.0 * @date       2016-02-25 ****************************************************************************** * <  Beijing university…
http://blog.chinaunix.net/uid-20543672-id-3157283.html Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 2012-04-01 10:26:01 在构架相关的汇编代码运行完之后,程序跳入了构架无关的内核C语言代码:init/main.c中的start_kernel函数,在这个函数中Linux内核开始真正进入初始化阶段,      下面我就顺这代码逐个函数的解释,但是这里并不会过于深入…
前言 Linux内核源码分析 Antz系统编写已经开始了内核部分了,在编写时同时也参考学习一点Linux内核知识. 自制Antz操作系统 一个自制的操作系统,Antz .半图形化半命令式系统,同时嵌入Antzscript脚本语言(写在之后). Github地址 博客中相关代码均可在Github上找到 目录 概述 从认识操作系统开始 初探Linux Linux文件系统概览 内存寻址 内存地址 逻辑地址 线性地址 物理地址 硬件的分段单元 段寄存器 段描述符 段选择符 参考 概述 可以参考我的另一篇…
原文地址:Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938396.html     在基本分析完内核启动流程的之后,还有一个比较重要的初始化函数没有分析,那就是do_basic_setup.在内核init线程中调用了do_basic_setup,这个函数也做了很多内核和驱动的初始化工…
原文地址:Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938393.html 在分析start_kernel函数的时候,其中有构架相关的初始化函数setup_arch. 此函数根据构架而异,对于ARM构架的详细分析如下: void __init setup_arch(char **cmdlin…
Linux内核源码详解——命令篇之iostat 转自:http://www.cnblogs.com/york-hust/p/4846497.html 本文主要分析了Linux的iostat命令的源码,iostat的主要功能见博客:性能测试进阶指南——基础篇之磁盘IO iostat源码共563行,应该算是Linux系统命令代码比较少的了.源代码中主要涉及到如下几个Linux的内核文件: 1./proc/diskstats——该文件是内核2.6以上的系统中的,记录了从Linux系统启动之后,所有磁盘…
题外话:Linux内核从2.x和3.x到现在最新的4.x变化非常大,最直观的表现就是很多书上的内核代码已经无法直接继续使用,所以看看新的源码是非常有意义的! (下文中的内核源码都来自于 kernel 4.0.4 版本,本人都验证过正确,正文假设读者对 linux系统下mount命令有操作经验.另外,linux内核源码中关于文件操作的代码量比内存管理或者设备管理多了不止一个数量级,所以想要把每一 个地方完全说清楚是远在我能力之外的..这篇文章的意义就是帮助建立起来一个超级块,索引和目录的有层次的模…
崇拜并且转载的: http://ilinuxkernel.com/files/5/Linux_Kernel_Source_Code.htm Linux内核源码特殊用法 1 前言 Linux内核源码主要以C语言为主,有一小部分涉及汇编语言,编译器使用的是Gcc.初次看内核源码,会遇到一些难以理解.晦涩的代码:而恰恰是这些晦涩的代码,在内核源码中经常出现.把一些晦涩.常见的代码看懂后,大家会发现看内核代码越来越顺利. 本文以x86_64架构中的Linux 2.6.32-71.el6(RHEL 6)源…
我突然发现,我是这么爱Linux内核源码.... 真幸福死了....   int vsprintf(char *buf, const char *fmt, va_list args)   这函数的实现...我竟然在Linux内核源码里面找到了....   一共140+行,不到145行.比微软源码里面的1700行+几时个宏+几十个函数名字的代码看着舒服多了....   以后还要好好学习Linux,内核源码,一定要好好读....   宝贝,你在哪里,你帮我一起读好不好.…
1. 概述 接着上一篇<Linux内核源码分析之setup_arch (一)>继续分析,本文首先分析arm_memblock_init函数,然后分析内核启动阶段的是如何进行内存管理的. 2. arm_memblock_init 该函数的功能比较简单,主要就是把meminfo中记录的内存条信息添加到memblock.memory中,然后把内核镜像所在内存区域添加到memblock.reserved中,arm_mm_memblock_reserve把页表所在内存区域添加到memblock.rese…
1. 前言 在 Linux内核源码分析之setup_arch (二) 中介绍了当前启动阶段的内存分配函数memblock_alloc,该内存分配函数在本篇将要介绍paging_init中用于页表和内存的分配,paging_init函数大致流程如下图所示. 2. paging_init 2.1 build_mem_type_table 该函数根据具体的CPU架构对静态定义的mem_types数组中定义的属性进行调整. 2.2 prepare_page_table 该函数的作用是把页目录项清零,源码…
前言 Linux内核源码分析之setup_arch (三) 基本上把setup_arch主要的函数都分析了,由于距离上一篇时间比较久了,所以这里重新贴一下大致的流程图,本文主要分析的是bootmem_init函数. 代码分析 bootmem_init函数的结构如下: find_limits通过存储在meminfo中的内存条信息得到低端内存和高端内存的页框编号,分别放入到min.max_low.max_high中. static void __init find_limits(unsigned l…
前两天看到一群里在讨论 Tomcat 参数调优,看到不止一个人说通过 accept-count 来配置线程池大小,我笑了笑,看来其实很多人并不太了解我们用的最多的 WebServer Tomcat,这篇文章就来聊下 Tomcat 调优,重点介绍下线程池调优及 TCP 半连接.全连接队列调优. Tomcat 线程池 先来说下线程池调优,就拿 SpringBoot 内置的 Tomcat 来说,确实是支持线程池参数配置的,但不是 accept-count 参数,可以通过 threads.max 和 t…
阅读Linux Kernel Source Code 假如你在Linux系统下面阅读Linux内核源代码,那么需要准备一些工具. ①Linux的内核源码 内核源码的下载地址:Index of /pub/linux/kernel ②代码阅读工具(Vim+Ctags+Cscope+Taglist)…
Linux内核源代码位于/usr/src/linux目录下,其结构分布如图1.3所示,每一个目录或子目录可以看作一个模块,其目录之间的连线表示“子目录或子模块”的关系.下面是对每一个目录的简单描述. Arch 目录包括了所有和体系结构相关的核心代码.它下面的每一个子目录都代表一种Linux支持的体系结构,例如X86就是Intel CPU及与之相兼容体系结构的子目录.Arch目录下的子目录包括:/arch/kernel./arch/mm./arch/include./arch/boot./arch…