摘要:
经过了上一篇的配置,我们已经执行make就可以编译出一个uboot.bin,但这还不够,首先,此时的uboot并不符合三星芯片对bootloader的格式要求,同时,此时的uboot.bin也没有结合我们的开发板进行配置,还无法使用。而要进行这样的个性化配置,前提条件就是对uboot开机流程和编译系 阅读全文
摘要:
输入设备都有共性:中断驱动+字符IO ,基于分层的思想,Linux内核将这些设备的公有的部分提取出来,基于cdev提供接口,设计了输入子系统,所有使用输入子系统构建的设备都使用 主设备号13 ,同时输入子系统也 支持自动创建设备文件 ,这些文件采用阻塞的IO读写方式,被创建在 "/dev/input 阅读全文
摘要:
misc子系统在Linux中是一个非常简单的子系统,但是其清晰的框架结构非常适合用来研究设备识别模型。本文从misc子系统的使用出发,通过了解其机制来总结一套的设备识别的驱动框架,即使用 使用同一个驱动,向上提供多个设备文件接口,向下控制多个(相应的)设备 ,这就需要该驱动可以根据不同的设备文件来控 阅读全文
摘要:
为了实现对临界资源的有效管理,应用层的程序有原子变量,条件变量,信号量来控制并发,同样的问题也存在与驱动开发中,比如一个驱动同时被多个应用层程序调用,此时驱动中的全局变量会同时属于多个应用层进程的进程空间,这种情况下也要使用一些技术来实现对并发的控制。本文将讨论内核中下述并发控制技术的技术特点和应用 阅读全文
摘要:
内核定时器 软件上的定时器最终要依靠硬件时钟来实现,简单的说,内核会在时钟中断发生后检测各个注册到内核的定时器是否到期,如果到期,就回调相应的注册函数,将其作为中断底半部来执行。实际上,时钟中断处理程序会触发TIMER_SOFTIRQ软中断,运行当前处理器上到期的所有定时器。 设备驱动程序如要获得时 阅读全文
摘要:
在硬件上,中断源可以通过中断控制器向CPU提交中断,进而引发中断处理程序的执行,不过这种硬件中断体系每一种CPU都不一样,而Linux作为操作系统,需要同时支持这些中断体系,如此一来,Linux中就提出了 软中断 的概念,也有人叫 内核中断 ,其本质就是使用统一的方式对不同硬件中断体系中的中断号进行 阅读全文
摘要:
等待队列 是内核中实现进程调度的一个十分重要的数据结构,其任务是维护一个链表,链表中每一个节点都是一个PCB(进程控制块), 内核会将PCB挂在等待队列中的所有进程都调度为睡眠状态,直到某个唤醒的条件发生 。应用层的阻塞IO与非阻塞IO的使用我已经在 "Linux I/O多路复用" 一文中讨论过了, 阅读全文
摘要:
异步通知的全称是"信号驱动的异步IO",通过"信号"的方式,放期望获取的资源可用时,驱动会主动通知指定的应用程序,和应用层的"信号"相对应,这里使用的是信号" SIGIO "。操作步骤是 1. 应用层程序将自己注册为接收来自设备文件的SIGIO信号的进程 2. 驱动实现相应的接口,以期具有向所有注册 阅读全文
摘要:
DMA即Direct Memory Access,是一种允许外设直接存取内存数据而没有CPU参与的技术,当外设对于该块内存的读写完成之后,DMAC通过中断通知CPU,这种技术多用于对数据量和数据传输速度都有很高要求的外设控制,比如显示设备等。 DMA和Cache一致性 我们知道,为了提高系统运行效率 阅读全文
摘要:
ARM是对内存空间和IO空间统一编址的,所以,通过读写SFR来控制硬件也就变成了通过读写相应的SFR地址来控制硬件。这部分地址也被称为 I/O内存 。x86中对I/O地址和内存地址是分开编址的,这样的IO地址被称为 I/O端口 。本文只讨论IO内存的访问 IO内存访问流程 我们知道,为了管理最重要的 阅读全文
摘要:
先上基础,下图是Linux的内存映射模型 1. 每一个进程都有自己的进程空间,进程空间的0 3G是用户空间,3G 4G是内核空间 2. 每个进程的用户空间不在同一个物理内存页,但是所有的进程的内核空间对应同样的物理地址 3. vmalloc分配的地址可以高端内存,也可以是低端内存 4. 0 896M 阅读全文
摘要:
内核中关于GPIO的操作API主要集中在和中,前者主要是GPIO直接与设备树相关的操作,在 "Linux 设备树操作API" 中已经记录过,后者主要是针对GPIO本身的操作,常用的有下面几个。 阅读全文
摘要:
"Linux设备树语法详解" 一文中介绍了设备树的语法,这里主要介绍内核中提供的操作设备树的API,这些API通常都在 "include/of.h" 中声明。 device_node 内核中用下面的这个结构描述设备树中的一个节点,后面的API都需要一个device_node对象作为参数传入。 str 阅读全文
摘要:
平台总线是一种实现设备信息与驱动方法相分离的方法,利用这种方法,我们可以写出一个更像样一点的字符设备驱动,即使用cdev作为接口,平台总线作为分离方式: xjkeydrv_init():模块加载函数 └──platform_driver_register()将驱动对象模块注册到平台总线 └──pla 阅读全文
摘要:
在 "Linux设备树语法详解" 和 "Linux Platform驱动模型(一) _设备信息" 中我们讨论了设备信息的写法,本文主要讨论平台总线中另外一部分 驱动方法,将试图回答下面几个问题: 1. 如何填充platform_driver对象? 2. 如何将驱动方法对象注册到平台总线中? 正文前的 阅读全文
摘要:
我在 "Linux字符设备驱动框架" 一文中简单介绍了Linux字符设备编程模型,在那个模型中,只要应用程序 open() 了相应的设备文件,就可以使用ioctl通过驱动程序来控制我们的硬件,这种模型直观,但是从软件设计的角度看,却是一种十分糟糕的方式,它有一个致命的问题,就是设备信息和驱动代码冗余 阅读全文
摘要:
驱动程序就是向下控制硬件,向上提供接口,这里的向上提供的接口最终对应到应用层有三种方式: 设备文件,/proc,/sys ,其中最常用的就是使用设备文件,而Linux设备中用的最多的就是字符设备,本文就以字符设备为例来分析创建并打开一个字符设备的文件内部机制。 struct inode Linux中 阅读全文
摘要:
最近写了一个递归Makefile,目的是既可以实现子模块的单独编译,也可以不做任何修改就和整个程序的整体进行无缝衔接的编译。具体的思路是借助第三方文件,将子模块编译好的.o文件的路径自动写到config.mk文件中,在总控Makfile中只需要include这个config.mk就可以。单个模块的编 阅读全文
摘要:
我们在 "Linux设备管理(一)_kobject, kset,ktype分析" 一文中介绍了kobject的相关知识,在 "Linux设备管理(二)_从cdev_add说起" 和 "Linux设备管理(三)_总线设备的挂接" 举例介绍了内核中是如何进行设备管理的,并在 "Linux设备管理(四)_ 阅读全文
摘要:
sysfs 是一个基于ramfs的文件系统,在2.6内核开始引入,用来导出内核对象(kernel object)的数据、属性到用户空间。与同样用于查看内核数据的proc不同,sysfs只关心具有层次结构的设备信息,比如系统中的总线,驱动以及已经加载的模块等,而诸如PID等信息还是使用proc来管理。 阅读全文