Device Tree(三):代码分析

作者:linuxer 发布于:2014-6-6 16:03 分类:统一设备模型

Device Tree总共有三篇,分别是:

1、为何要引入Device Tree,这个机制是用来解决什么问题的?(请参考引入Device Tree的原因

2、Device Tree的基础概念(请参考DT基础概念

3、ARM linux中和Device Tree相关的代码分析(这是本文的主题)

本文主要内容是:以Device Tree相关的数据流分析为索引,对ARM linux kernel的代码进行解析。主要的数据流包括:

1、初始化流程。也就是扫描dtb并将其转换成Device Tree Structure。

2、传递运行时参数传递以及platform的识别流程分析

3、如何将Device Tree Structure并入linux kernel的设备驱动模型。

注:本文中的linux kernel使用的是3.14版本。

阅读全文>>

标签: 设备树

评论(162) 浏览(163223)

Device Tree(二):基本概念

作者:linuxer 发布于:2014-5-30 16:47 分类:统一设备模型

一些背景知识(例如:为何要引入Device Tree,这个机制是用来解决什么问题的)请参考引入Device Tree的原因,本文主要是介绍Device Tree的基础概念。

简 单的说,如果要使用Device Tree,首先用户要了解自己的硬件配置和系统运行参数,并把这些信息组织成Device Tree source file。通过DTC(Device Tree Compiler),可以将这些适合人类阅读的Device Tree source file变成适合机器处理的Device Tree binary file(有一个更好听的名字,DTB,device tree blob)。在系统启动的时候,boot program(例如:firmware、bootloader)可以将保存在flash中的DTB copy到内存(当然也可以通过其他方式,例如可以通过bootloader的交互式命令加载DTB,或者firmware可以探测到device的信 息,组织成DTB保存在内存中),并把DTB的起始地址传递给client program(例如OS kernel,bootloader或者其他特殊功能的程序)。对于计算机系统(computer system),一般是firmware->bootloader->OS,对于嵌入式系统,一般是bootloader->OS。

本文主要描述下面两个主题:

1、Device Tree source file语法介绍

2、Device Tree binaryfile格式介绍

阅读全文>>

标签: Device tree

评论(162) 浏览(222328)

Device Tree(一):背景介绍

作者:linuxer 发布于:2014-5-22 16:46 分类:统一设备模型

作为一个多年耕耘在linux 2.6.23内核的开发者,各个不同项目中各种不同周边外设驱动的开发以及各种琐碎的、扯皮的俗务占据了大部分的时间。当有机会下载3.14的内核并准备 学习的时候,突然发现linux kernel对于我似乎变得非常的陌生了,各种新的机制,各种framework、各种新的概念让我感到阅读内核代码变得举步维艰。 还好,剖析内核的热情还在,剩下的就交给时间的。首先进入视线的是Device Tree机制,这是和porting内核非常相关的机制,如果想让将我们的硬件平台迁移到高版本的内核上,Device Tree是一个必须要扫清的障碍。

我想从下面三个方面来了解Device Tree:

1、为何要引入Device Tree,这个机制是用来解决什么问题的?(这是本文的主题)

2、Device Tree的基础概念(请参考DT基础概念

3、ARM linux中和Device Tree相关的代码分析(请参考DT代码分析

阅 读linux内核代码就像欣赏冰山,有看得到的美景(各种内核机制及其代码),也有埋在水面之下看不到的基础(机制背后的源由和目的)。沉醉于各种内核机 制的代码固然有无限乐趣,但更重要的是注入更多的思考,思考其背后的机理,真正理解软件抽象。这样才能举一反三,并应用在具体的工作和生活中。

本文主要从下面几个方面阐述为何ARM linux会引入Device Tree:

1、没有Device Tree的ARM linux是如何运转的?

2、混乱的ARM architecture代码和存在的问题

3、新内核的解决之道

阅读全文>>

标签: Device tree

评论(64) 浏览(167482)

基本电路概念之(一):什么是电压?

作者:linuxer 发布于:2014-5-16 10:40 分类:基础学科

我有一个奇葩儿子(4岁),经常问一些奇葩的问题。比如:为什么电子带负电?什么是电压?电路板是怎么生产的?发动机的内部结构是什么?……总之, 各种问题层出不穷。有一天回家,他正和他妈妈一起看几张医学的CT片子(他妈妈是医生),他妈妈正详细向他解释该病人颅部血管病变问题,各种专业术语丝毫 也没有浇灭儿子的热情,那认真的劲头,我当时就震惊了。

为了应付我这个奇葩儿子,为了始终维持爸爸的高大形象,我不得不对这个世界有更深层次的思考……这次的主题是:什么是电压?电池为什么能提供电压?

阅读全文>>

标签: 电压

评论(15) 浏览(49097)

SDRAM Internals

作者:linuxer 发布于:2014-5-14 16:25 分类:基础技术

SDRAM(synchronous dynamic random-access memory)是嵌入式系统中经常用到的器件。对于一个嵌入式软件工程师而言,了解SDRAM的机理是有益的。我们可以从下面三个方面理解SDRAM:

1、RAM很好理解,就是可以随机存取的memory。

2、 dynamic 是和static对应的,SRAM就是static random-access memory。SRAM和DRAM(dynamic random-access memory)都是由若干能够保存0和1两种状态的cell组成。对于SRAM,只要保持芯片的供电,其cell就可以保存0或者1的信息。但是对于 DRAM而言,其bit信息是用电容来保存的(charged or not charged)。由于有漏电流,因此DRAM中的bit信息只能保持若干个毫秒。这个时间听起来很短,但是对于以ns计时的CPU而言已经是足够的长 了,因此,只要及时刷新(refresh,术语总是显得高大上,通俗讲就是读出来再写进去)DRAM,信息就可以长久的保存了。

3、 synchronous 是和asynchronous 对应的。synchronous是一个有多种含义的词汇,对于硬件芯片这个场景,主要是说芯片的行为动作是在一个固定的clock信号的驱动下工作。对于 电路设计而言,synchronous 简单但是速度慢,功耗大。asynchronous 则相反,在设计过程中需要复杂的race condition的问题,其速度快,理论上只是受限于逻辑门(logic gate)的propagation delay。

1968 年,Dennard获得了DRAM的专利。随后,各大厂商和研究机构对DRAM进行了改进。例如增加了clock信号,让DRAM的电路设计变成 synchronous 类型的。2000之后,由于其卓越的性能,SDRAM完全取代了DRAM的位置。随后的发展(DDR、DDR2和DDR3)并没有改变原理,只是速度上升 了。因此,本文以SDR(Single Data Rate)SDRAM为例,讲述其内部机理。

阅读全文>>

标签: SDRAM

评论(39) 浏览(31234)

Process Creation(二)

作者:linuxer 发布于:2014-4-28 15:40 分类:进程管理

本文是Process Creation(一)的延续,主要内容包括:

1、进程描述符中Realtime Mutex相关数据结构的初始化

2、子进程如何复制父进程的credentials

3、per-task delay accounting的处理

4、子进程如何复制父进程的flag

阅读全文>>

标签: process management do_fork

评论(26) 浏览(23205)

Process Creation(一)

作者:linuxer 发布于:2014-4-23 8:39 分类:进程管理


为什么要写一个关于进程如何创建的文档?其实用do_fork作为关键字进行索引,你会发现网上的相关文档数以万计。作为一个内核工程师,对进程以及进程相关的内容当然是非常感兴趣,但是网上的资料并不能令我非常满意(也许是我没有检索到好的文章),一个简单的例子如下:

static void copy_flags(unsigned long clone_flags, struct task_struct *p)
{
    unsigned long new_flags = p->flags;

    new_flags &= ~(PF_SUPERPRIV | PF_WQ_WORKER);
    new_flags |= PF_FORKNOEXEC;
    p->flags = new_flags;
}

上 面的代码是进程创建过程的一个片段,网上的解释一般都是对代码逻辑的描述:清除PF_SUPERPRIV 和PF_WQ_WORKER这两个flag的标记,设定PF_FORKNOEXEC标记。坦率的讲,这样的代码解析没有任何意义,其实c代码都已经是非常 清楚了。当然,也有的文章进行了进一步的分析,例如对PF_SUPERPRIV 被清除进行了这样的解释:表明进程是否拥有超级用户权限的PF_SUPERPRIV标志被清0。很遗憾,这样的解释不能令人信服,因为如果父进程是超级用 户权限,其创建的子进程是要继承超级用户权限的。

正因为如此,我想对linux kernel中进程创建涉及的方方面面的系统知识进行梳理,在我的能力范围内对进程创建的source code进行逐行解析。一言以蔽之,do_fork的source code只是索引,重要的是与其相关的各个知识点。

由于进程创建是一个大工程,因此分成若干的部分。本文是第一部分,主要内容包括:

1、从用户空间看进程创建

2、系统调用层面看进程创建

3、trace的处理

4、参数检查

5、复制thread_info和task_struct

注:本文引用的内核代码来自3.14版本的linux kernel。



阅读全文>>

标签: do_fork

评论(4) 浏览(22816)

Unix的历史

作者:linuxer 发布于:2014-4-21 20:32 分类:技术漫谈

作为一个Linuxer,对unix感兴趣是顺理成章的事情,对unix的了解反过来也可以促进对GNU/Linux的理解。不过在接触unix的过程中,大家一般都会有下面的疑问:

1、unix这个商标是属于哪一个公司或者机构?

2、为何unix有那么多的变种?为何各个公司都有自己的unix,例如IBM的AIX(Advanced Interactive eXecutive)操作系统、SUN公司的Solaris操作系统、HP公司的HP-UX操作系统。

3、Linux和unix的关系为何?

……

本文和技术无关,主要想整理一些Unix的历史和Linux的演化

阅读全文>>

标签: unix历史

评论(8) 浏览(16580)

process credentials相关的用户空间文件

作者:linuxer 发布于:2014-4-2 12:54 分类:Linux应用技巧

作为对linux_fans提出建议的回应,本文主要描述在用户空间,和process credentials相关的内容,具体包括:

1/etc/passwd文件

2/etc/shadow文件

3/etc/group文件

4、从系统登录过程看如何使用这些文件

阅读全文>>

标签: process management

评论(3) 浏览(8885)

process identification

作者:linuxer 发布于:2014-3-26 12:28 分类:进程管理

一、概述

本文主要描述在linux kernel中如何标识一个或者一组和进程(线程)相关的实体,包括:

1、进程ID(线程组ID

2、线程ID

3、进程组ID

4Session ID

需要强调的是本文focusidentification,很多展开的内容会有一系列文档描述。

阅读全文>>

标签: process management

评论(9) 浏览(41163)

Copyright @ 2013-2015 蜗窝科技 All rights reserved. Powered by emlog