2018年2月14日

Linux内核(13) - 子系统的初始化之以PCI子系统为例

摘要: 由Kconfig这张地图的分布来看,PCI这块儿的代码应该分布在两个地方,drivers/pci和arch/i386/pci,两岸三地都属于一个中国,不管是drivers/pci那儿的,还是arch/i386/pci那儿的,也都只属于一个PCI子系统,本着一个中国的原则,咱们要统筹的全面的考察分析位 阅读全文

posted @ 2018-02-14 20:21 AlanTu 阅读(1013) 评论(0) 推荐(0) 编辑

Linux内核(12) - 子系统的初始化之那些入口函数

摘要: 内核选项的解析完成之后,各个子系统的初始化即进入第二部分—入口函数的调用。通常USB、PCI这样的子系统都会有一个名为subsys_initcall的入口,如果你选择它们作为研究内核的切入点,那么就请首先找到它。 朱德庸在《关于上班这件事》里说,要花前半生找入口,花后半生找出口。可见寻找入口对于咱们 阅读全文

posted @ 2018-02-14 20:20 AlanTu 阅读(775) 评论(0) 推荐(0) 编辑

Linux内核(11) - 子系统的初始化之内核选项解析

摘要: 首先感谢国家。其次感谢上大的钟莉颖,让我知道了大学不仅有校花,还有校鸡,而且很多时候这两者其实没什么差别。最后感谢清华女刘静,让我深刻体会到了素质教育的重要性,让我感到有责任写写子系统的初始化。 各个子系统的初始化是内核整个初始化过程必然要完成的基本任务,这些任务按照固定的模式来处理,可以归纳为两个 阅读全文

posted @ 2018-02-14 20:19 AlanTu 阅读(761) 评论(0) 推荐(0) 编辑

Linux内核(10) - 内核中的链表

摘要: 早上上班坐地铁要排队,到了公司楼下等电梯要排队,中午吃饭要排队,下班了追求一个女孩子也要排队,甚至在网上下载个什么门的短片也要排队,每次看见人群排成一条长龙时,才真正意识到自己是龙的传人。那么下面咱们就说说队列(链表)。 使用链表的目的很明确,因为有很多事情要做,于是就把它放进链表里,一件事一件事的 阅读全文

posted @ 2018-02-14 20:18 AlanTu 阅读(268) 评论(0) 推荐(0) 编辑

Linux内核(9) - 精华版 之 方法论

摘要: 到目前为之,博客上分享的精华篇都可以归为方法论的范畴,在很多时候,都是方法论要比细节紧要得多。而这些精华篇又可细分为三个专题:Linux大史记;内核学习的方法论;驱动开发的方法论。 Linux大史记 除去那些精彩的“门”,我们生活中乏味的事情太多了,所以不希望再去按惯例花个一二页的篇幅乏味的写个“L 阅读全文

posted @ 2018-02-14 20:17 AlanTu 阅读(236) 评论(0) 推荐(0) 编辑

Linux内核(8) - 设备模型(下)

摘要: 设备模型拍得再玄幻,它也只是个模型,必须得落实在具体的子系统,否则就只能抱着个最佳技术奖空遗恨。既然前面已经以USB子系统的实现分析示例了分析内核源码应该如何入手,那么这里就仍然以USB子系统为例,看看设备模型是如何软着陆的。 内核中USB子系统的结构 我们已经知道了USB子系统的代码都位于driv 阅读全文

posted @ 2018-02-14 20:15 AlanTu 阅读(338) 评论(0) 推荐(0) 编辑

Linux内核(7) - 设备模型(上)

摘要: 对于驱动开发来说,设备模型的理解是根本,毫不夸张得说,理解了设备模型,再去看那些五花八门的驱动程序,你会发现自己站在了另一个高度,从而有了一种俯视的感觉,就像凤姐俯视知音和故事会,韩峰同志俯视女下属。 顾名而思义就知道设备模型是关于设备的模型,既不是任小强们的房模,也不是张导的炮模。对咱们写驱动的和 阅读全文

posted @ 2018-02-14 20:14 AlanTu 阅读(321) 评论(0) 推荐(0) 编辑

Linux内核“问题门” - 学习问题、经验集锦

摘要: 陈宪章说:“学贵有疑,小疑则小进,大疑则大进。疑者,觉悟之机也,一番觉悟一番长进。” 培根说:“多问的人将多得。” 还在学校的时候导师在激情讲演之后对着会议室里形态各异但均静默不语的我们痛心疾首的说:“会提问题很重要啊,同志们!不会提问题怎么有资格做研究!” 这样铿锵有力的训诫今日想起仍觉深受刺激, 阅读全文

posted @ 2018-02-14 20:13 AlanTu 阅读(268) 评论(0) 推荐(0) 编辑

Linux内核(6) - 模块机制与“Hello World!

摘要: 有一种感动,叫内牛满面,有一种机制,叫模块机制。显然,这种模块机制给那些Linux的发烧友们带来了方便,因为模块机制意味着人们可以把庞大的Linux内核划分为许许多多个小的模块。对于编写设备驱动程序的开发者来说,从此以后他们可以编写设备驱动程序却不需要把她编译进内核,不用reboot机器,她只是一个 阅读全文

posted @ 2018-02-14 20:09 AlanTu 阅读(278) 评论(0) 推荐(0) 编辑

Linux内核(5) - 内核学习的相关资源

摘要: “世界上最缺的不是金钱,而是资源。”当我在一份报纸上看到这句大大标题时,我的第一反应是——作者一定是个自然环保主义者,然后我在羞愧得反省自身的同时油然生出一股对这样的无产主义理想者无比崇敬的情绪来。 于是,我继续往下看,“因此在XXX还未正式面市之时,前来咨询的客户已经不少,这些有眼光的购房者明白, 阅读全文

posted @ 2018-02-14 20:04 AlanTu 阅读(272) 评论(0) 推荐(0) 编辑

Linux内核(4) - 内核学习的心理问题

摘要: 对于学习来说,无论是在学校的课堂学习,还是这里说的内核学习,效果好或者坏,最主要取决于两个方面——方法论和心理。注意,我无视了智商的差异,这玩意儿玄之又玄,岔开了说,属于迷信的范畴。 前面又是Kernel地图,又是如何入手,说的都是方法论的问题,那么这里要面对的就主要是心理上的问题。 而心理上的问题 阅读全文

posted @ 2018-02-14 20:02 AlanTu 阅读(235) 评论(0) 推荐(0) 编辑

Linux内核(3) - 分析内核源码如何入手(下)

摘要: 下面的分析,米卢教练说了,内容不重要,重要的是态度。就像韩局长对待日记的态度那样,严谨而细致。 只要你使用这样的态度开始分析内核,那么无论你选择内核的哪个部分作为切入点,比如USB,比如进程管理,在花费相对不算很多的时间之后,你就会发现你对内核的理解会上升到另外一个高度,一个抱着情景分析,抱着0.1 阅读全文

posted @ 2018-02-14 20:01 AlanTu 阅读(611) 评论(0) 推荐(0) 编辑

Linux内核(2) - 分析内核源码如何入手(上)

摘要: 透过现象看本质,兽兽们无非就是一些人体艺术展示。同样往本质里看过去,学习内核,就是学习内核的源代码,任何内核有关的书籍都是基于内核,而又不高于内核的。 既然要学习内核源码,就要经常对内核代码进行分析,而内核代码千千万,还前仆后继的不断往里加,这就让大部分人都有种雾里看花花不见的无助感。不过不要怕,孔 阅读全文

posted @ 2018-02-14 20:00 AlanTu 阅读(478) 评论(0) 推荐(0) 编辑

Linux内核(1) - Kernel地图:Kconfig与Makefile

摘要: Makefile不是Make Love 从前在学校,混了四年,没有学到任何东西,每天就是逃课,上网,玩游戏,睡觉。毕业的时候,人家跟我说Makefile我完全不知,但是一说Make Love我就来劲了,现在想来依然觉得丢人。 毫不夸张地说,Kconfig和Makefile是我们浏览内核代码时最为依仗 阅读全文

posted @ 2018-02-14 19:53 AlanTu 阅读(453) 评论(0) 推荐(0) 编辑

书单

只有注册用户登录后才能阅读该文。 阅读全文

posted @ 2018-02-14 19:14 AlanTu 阅读(65) 评论(0) 推荐(0) 编辑

Linux时间子系统(十六) clockevent

摘要: 一、clock event控制的通用逻辑 1、产生clock event的设备 各种系统的timer硬件形形色色,不过在general clock event device layer,struct clock_event_device被来抽象一个可以产生clock event的timer硬件设备, 阅读全文

posted @ 2018-02-14 14:39 AlanTu 阅读(855) 评论(0) 推荐(0) 编辑

Linux时间子系统(十七) ARM generic timer驱动代码分析

摘要: 一、前言 关注ARM平台上timer driver(clocksource chip driver和clockevent chip driver)的驱动工程师应该会注意到timer硬件的演化过程。在单核时代,各个SOC vendor厂商购买ARM core的IP,然后自己设计SOC上的periphe 阅读全文

posted @ 2018-02-14 14:39 AlanTu 阅读(1116) 评论(0) 推荐(0) 编辑

Linux时间子系统(十五) clocksource

摘要: 一、前言 和洋葱一样,软件也是有层次的,内核往往需要对形形色色的某类型的驱动进行抽象,屏蔽掉其具体的特质,获取该类驱动共同的逻辑,而又根据这些逻辑撰写该类驱动的抽象层。嵌入式系统总是会提供timer的硬件block,软件需要对timer硬件提供的功能进行抽象:linux kernel将timer类型 阅读全文

posted @ 2018-02-14 14:38 AlanTu 阅读(1981) 评论(0) 推荐(0) 编辑

Linux时间子系统(十三) Tick Device layer综述

摘要: 一、前言 时间子系统中的tick device layer主要涉及kernel/time/tick-*相关的文件,本文的主要内容就是从high level层次(不纠缠在具体的每行代码)描述tick device layer的运作逻辑。 如果说每个.c文件是一个模块的话,我们可以首先简单描述tick 阅读全文

posted @ 2018-02-14 14:37 AlanTu 阅读(983) 评论(0) 推荐(0) 编辑

Linux时间子系统(十四) tick broadcast framework

摘要: 一、前言 在内核中,有cpuidle framework可以控制cpu的节电:当没有进程调度到该cpu上执行的时候,swapper进程粉墨登场,将该cpu会被推入到idle状态。当然CPU的idle状态有深有浅,当CPU睡的比较深入的时候,有可能会关闭本地的timer硬件。这样就会引入一个很有意思的 阅读全文

posted @ 2018-02-14 14:37 AlanTu 阅读(941) 评论(0) 推荐(0) 编辑

Linux时间子系统(十二) periodic tick

摘要: 一、tick device概念介绍 1、数据结构 在内核中,使用struct tick_device来抽象系统中的tick设备,如下: struct tick_device { struct clock_event_device *evtdev; enum tick_device_mode mode 阅读全文

posted @ 2018-02-14 14:36 AlanTu 阅读(752) 评论(0) 推荐(0) 编辑

Linux时间子系统(五) POSIX Clock

摘要: 一、前言 clock是timer的基础,任何一个timer都需要运作在一个指定的clock上来。内核中维护了若干的clock,本文第二章描述了clock的基本概念和一些静态定义的posix clock。根据计时的特点,clock分成两种:一种是真实世界的时间概念,另外一个是仅仅计算CPU执行时间 , 阅读全文

posted @ 2018-02-14 14:35 AlanTu 阅读(640) 评论(0) 推荐(0) 编辑

Linux时间子系统(六) POSIX timer

摘要: 一、前言 在用户空间接口函数文档中,我们描述了和POSIX timer相关的操作,主要包括创建一个timer、设定timer、获取timer的状态、获取timer overrun的信息、删除timer。本文将沿着这些用户空间的接口定义来看看内核态的实现。虽然POSIX timer可以基于各种不同的c 阅读全文

posted @ 2018-02-14 14:35 AlanTu 阅读(983) 评论(0) 推荐(0) 编辑

Linux时间子系统(四) timekeeping

摘要: 一、前言 timekeeping模块是一个提供时间服务的基础模块。Linux内核提供各种time line,real time clock,monotonic clock、monotonic raw clock等,timekeeping模块就是负责跟踪、维护这些timeline的,并且向其他模块(t 阅读全文

posted @ 2018-02-14 14:34 AlanTu 阅读(1161) 评论(0) 推荐(0) 编辑

Linux时间子系统(三) 用户空间接口函数

摘要: 一、前言 从应用程序的角度看,内核需要提供的和时间相关的服务有三种: 1、和系统时间相关的服务。例如,在向数据库写入一条记录的时候,需要记录操作时间(何年何月何日何时)。 2、让进程睡眠一段时间 3、和timer相关的服务。在一段指定的时间过去后,kernel要alert用户进程 本文主要描述和时间 阅读全文

posted @ 2018-02-14 14:33 AlanTu 阅读(850) 评论(0) 推荐(0) 编辑

Linux时间子系统(一) 基本概念

摘要: 本文使用Q & A的方式来和大家以前探讨一下时间的基本概念 一、什么是时间? 这个问题实在是太复杂了,我都不知道这是一个物理学、宇宙学、还是热力学异或是哲学问题,我只是想从几个侧面来了解一下时间这个概念。本节内容都是我坐在公交车上瞎想的,对物理学有兴趣的人可以指出我的错误(一个搞linux kern 阅读全文

posted @ 2018-02-14 14:32 AlanTu 阅读(406) 评论(0) 推荐(0) 编辑

Linux时间子系统(二) 软件架构

摘要: 一、前言 本文的主要内容是描述内核时间子系统的软件框架。首先介绍了从旧的时间子系统迁移到新的时间子系统的源由,介绍新的时间子系统的优势。第三章汇整了时间子系统的相关文件以及内核配置。最后描述各种内核配置下的时间子系统的数据流和控制流。 二、背景介绍 1、传统内核时间子系统的软件架构 让我们先回到远古 阅读全文

posted @ 2018-02-14 14:32 AlanTu 阅读(1201) 评论(0) 推荐(0) 编辑

2018年2月13日

中断唤醒系统流程

摘要: 1. 前言 曾几何时,不知道你是否想过外部中断是如何产生的呢?又是如何唤醒系统的呢?在项目中,一般具有中断唤醒的设备会有一个interrupt pin硬件连接到SoC的gpio pin。一般来说,当设备需要唤醒系统的时候,会通过改变interrupt pin电平状态,而SoC会检测到这个变化,将So 阅读全文

posted @ 2018-02-13 22:51 AlanTu 阅读(4660) 评论(0) 推荐(0) 编辑

逆向映射的演进

摘要: 一、前言 数学大师陈省身有一句话是这样说的:了解历史的变化是了解这门学科的一个步骤。今天,我把这句话应用到一个具体的Linux模块:了解逆向映射的最好的方法是了解它的历史。本文介绍了Linux内核中的逆向映射机制如何从无到有,如何从笨重到轻盈的历史过程,通过这些历史的演进过程,希望能对逆向映射有更加 阅读全文

posted @ 2018-02-13 22:50 AlanTu 阅读(1044) 评论(0) 推荐(0) 编辑

Linux内存管理基本概念

摘要: 1. 前言 内存(memory)在Linux系统中是一种牵涉面极广的资源,上至应用程序、下至kernel和driver,无不为之魂牵梦绕。加上它天然的稀缺性,导致内存管理(Memory Management,简称MM)是linux kernel中非常重要又非常复杂的一个子系统。 重要性就不多说了,K 阅读全文

posted @ 2018-02-13 22:49 AlanTu 阅读(1007) 评论(0) 推荐(1) 编辑

/proc/meminfo分析(一)

摘要: 本文主要分析/proc/meminfo文件的各种输出信息的具体含义。 一、MemTotal MemTotal对应当前系统中可以使用的物理内存。 这个域实际是对应内核中的totalram_pages这个全局变量的,定义如下: unsigned long totalram_pages __read_mo 阅读全文

posted @ 2018-02-13 22:45 AlanTu 阅读(4752) 评论(0) 推荐(1) 编辑

Linux页面回收概述

摘要: 本文主要介绍了一些page reclaim机制中的基本概念。这份文档其实也可以看成阅读ULK第17章第一小节的一个读书笔记。虽然ULK已经读了很多遍,不过每一遍还是觉得有收获。Linux内核虽然不断在演进,但是页面回收的基本概念是不变的,所以ULK仍然值得内核发烧友仔细品味。 一、什么是page f 阅读全文

posted @ 2018-02-13 22:45 AlanTu 阅读(1188) 评论(0) 推荐(0) 编辑

Dynamic DMA mapping Guide

摘要: 一、前言 这是一篇指导驱动工程师如何使用DMA API的文档,为了方便理解,文档中给出了伪代码的例程。另外一篇文档dma-api.txt给出了相关API的简明描述,有兴趣也可以看看那一篇,这两份文档在DMA API的描述方面是一致的。 二、从CPU角度看到的地址和从DMA控制器看到的地址有什么不同? 阅读全文

posted @ 2018-02-13 22:44 AlanTu 阅读(4787) 评论(0) 推荐(0) 编辑

Linux时钟

摘要: 一、前言 时钟或者钟表(clock)是一种计时工具,每个人都至少有一块,可能在你的手机里,也可能佩戴在你的手腕上。如果Linux也是一个普通人的话,那么她的手腕上应该有十几块手表,包括:CLOCK_REALTIME、CLOCK_MONOTONIC、CLOCK_PROCESS_CPUTIME_ID、C 阅读全文

posted @ 2018-02-13 22:43 AlanTu 阅读(2762) 评论(0) 推荐(0) 编辑

Linux系统休眠和设备中断处理

摘要: 一、设备IRQ的suspend和resume 本小节主要解决这样一个问题:在系统休眠过程中,如何suspend设备中断(IRQ)?在从休眠中唤醒的过程中,如何resume设备IRQ? 一般而言,在系统suspend过程的后期,各个设备的IRQ (interrupt request line)会被di 阅读全文

posted @ 2018-02-13 22:42 AlanTu 阅读(1949) 评论(0) 推荐(0) 编辑

Linux调度器 - 进程优先级

摘要: 一、前言 本文主要描述的是进程优先级这个概念。从用户空间来看,进程优先级就是nice value和scheduling priority,对应到内核,有静态优先级、realtime优先级、归一化优先级和动态优先级等概念,我们希望能在第二章将这些相关的概念描述清楚。为了加深理解,在第三章我们给出了几个 阅读全文

posted @ 2018-02-13 22:40 AlanTu 阅读(3988) 评论(0) 推荐(0) 编辑

Linux调度器 - 用户空间接口

摘要: 一、前言 Linux调度器神秘而充满诱惑,每个Linux工程师都想深入其内部一探究竟。不过中国有一句古话叫做“相由心生”,一个模块精巧的内部逻辑(也就是所谓的“心”)其外延就是简洁而优雅的接口(我称之为“相”)。通过外部接口的定义,其实我们也可以收获百分之六七十的该模块的内部信息。因此,本文主要描述 阅读全文

posted @ 2018-02-13 22:39 AlanTu 阅读(986) 评论(0) 推荐(0) 编辑

Linux标识进程

摘要: 一、前言 其实两年前,本站已经有了一篇关于进程标识的文档,不过非常的简陋,而且代码是来自2.6内核。随着linux container、pid namespace等概念的引入,进程标识方面已经有了天翻地覆的变化,因此我们需要对这部分的内容进行重新整理。 本文主要分成四个部分来描述进程标识这个主题:在 阅读全文

posted @ 2018-02-13 22:38 AlanTu 阅读(1943) 评论(0) 推荐(0) 编辑

Linux内存初始化(四) 创建系统内存地址映射

摘要: 一、前言 经过内存初始化代码分析(一)和内存初始化代码分析(二)的过渡,我们终于来到了内存初始化的核心部分:paging_init。当然本文不能全部解析完该函数(那需要的篇幅太长了),我们只关注创建系统内存地址映射这部分代码实现,也就是解析paging_init中的map_mem函数。 同样的,我们 阅读全文

posted @ 2018-02-13 22:34 AlanTu 阅读(1785) 评论(0) 推荐(0) 编辑

Linux内存初始化(三) 内存布局

摘要: 一、前言 同样的,本文是内存初始化文章的一份补充文档,希望能够通过这样的一份文档,细致的展示在初始化阶段,Linux 4.4.6内核如何从device tree中提取信息,完成内存布局的任务。具体的cpu体系结构选择的是ARM64。 二、memory type region的构建 memory ty 阅读全文

posted @ 2018-02-13 22:31 AlanTu 阅读(3638) 评论(0) 推荐(0) 编辑

导航