嵌入式linux
牛犊儿爸
这个作者很懒,什么都没留下…
展开
-
Linux SPI
Linux的SPI子系统采用主机驱动和外设驱动分离的思想,首先主机SPI控制器是一种平台设备,因此它以platform的方式注册进内核,外设的信息是以boardinfo形式静态定义的,在创建spi_master时,会根据外设的bus_num和主机的bus_num是否相等,来选择是否将该外设挂接在该SPI主控制器下。先看SPI子系统中几个关键的数据结构:struct spi_master用来转载 2017-07-11 11:04:33 · 1418 阅读 · 0 评论 -
linux 设备管理之 mem proc sysfs devfs udev
Jack:淫龙,Linux实现的设备管理机制是什么样子的呢?我:在2.4内核里,主流的解决方案是devfs。Jack:我知道。在2.6里,devfs已经被udev替代了。我:这种说法是不准确的,是一种外行看热闹的说法。Jack:怎么说?我:让我给你讲一讲proc文件系统的起源吧。听完了,你自然就明白了。Jack:proc文件系统?穿越了。我:在很久很久很久以前,Linux内核的所有代码都是写死的,原创 2017-07-07 09:25:54 · 317 阅读 · 0 评论 -
linux IIC
关于probe函数Linux中总线、设备、驱动这3者是非常重要的数据结构,它们互相之间都有联系一旦一个设备和一个驱动能够匹配上,就会执行驱动里的probe。总之一句话,probe函数作为driver的最基本的函数指针,一旦你的device和driver匹配(match,由总(bus)来完成,匹配工作发生在device_register()和drvier_register()的时候),probe函数原创 2017-07-07 09:25:57 · 556 阅读 · 0 评论 -
内存和IO访问
一、1 .内存空间和IO空间 x86 CPU下存在IO空间 的概念,等于IO端口(外设寄存器)和IO内存(外设内存)。IO空间可寻址16位达到64K2.统一编址和独立地址CPU访问各种外设有2种方式:一种是类似于访问内存的方式,即把外设的寄存器当作一个内存地址来读写,从而以访问内存相同的方式来操作外设寄存器,这时,IO与内存统一编址,IO的地址与内存的地址在同一个地址空间下,这种编址方式叫做IO与原创 2017-07-07 09:25:48 · 2184 阅读 · 0 评论 -
ARM MMU工作原理剖析
一、MMU的产生 许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为原创 2017-07-07 09:25:45 · 240 阅读 · 0 评论 -
linux内核模块
首先,一个内核模块,就是一个ELF文件。内核本身也是一个ELF文件。一个模块,可能是一个协议,一个文件系统,一个驱动,一种具体的应用,等等任何东西。也可能是多种东西的组合。内核在运行时,通过动态加载/卸载内核模块,可以动态扩展/删减内核的功能。每个模块在编译时(假设模块名为xxx),会自动生成一个xxx.mod.c的文件,该文件会链接到xxx模块中去。Linux使用下方把模块内部的变量或函数声明为原创 2017-07-07 09:25:39 · 229 阅读 · 0 评论 -
信号
1 信号本质软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而原创 2017-07-07 09:25:36 · 254 阅读 · 0 评论 -
linux输入子系统
Linux 系统提供了input 子系统,按键、触摸屏、键盘、鼠标、摇杆等输入都可以利用input 接口函数来实现设备驱动。input子系统仍然是字符设备驱动程序,但是代码量减少很多,input子系统只需要完成两个工作:初始化和事件报告struct input_dev *xx_dev;xx_init(){ xx_dev = input_allocate_device(); input原创 2017-07-07 09:25:33 · 233 阅读 · 0 评论 -
异步和同步
异步通知,就是信号,信号类似于在软件层次上对中断机制的一种模拟。原来上,系统收到一个信号和一个中断是一样的。同步和异步的区别是是否步调一致,同步等返回结果,异步不等返回结果。阻塞和非阻塞是指等结果返回前的两种处理方式,阻塞会挂起睡眠,非阻塞不睡眠直接返回结果。1、概念剖析相信很多从事linux后台开发工作的都接触过同步&异步、阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞、异原创 2017-07-07 09:25:30 · 867 阅读 · 0 评论 -
Linux软中断机制
中断服务程序往往都是在CPU关中断的条件下执行的,以避免中断嵌套而使控制复杂化。但是CPU关中断的时间不能太长,否则容易丢失中断信号。为此, Linux将中断服务程序一分为二,各称作“Top Half”和“Bottom Half”。前者通常对时间要求较为严格,必须在中断请求发生后立即或至少在一定的时间限制内完成。因此为了保证这种处理能原子地完成,Top Half通常是在CPU关中断的条件下执行的。原创 2017-07-07 09:25:27 · 438 阅读 · 0 评论 -
Linux阻塞和非阻塞
阻塞(休眠)调用是没有获得资源则挂起进程,被挂起的进程进入休眠状态,调用的函数只有在得到结果之后才返回,进程继续。非阻塞(休眠)是不能进行设备操作时不挂起,或返回,或反复查询,直到可以进行操作为止,被调用的函数不会阻塞当前进程,而会立刻返回。因为阻塞的进程会进入休眠状态,因此,必须确保有一个地方能够唤醒休眠的进程。唤醒进程的地方最大可能发生在中断里面,因为硬件资源获得的同时往往伴随着一个中断。使用原创 2017-07-07 09:25:19 · 1218 阅读 · 0 评论 -
自旋锁 读写锁 顺序锁
三者功能区别: 自旋锁:读写均互斥;读写锁:读读可并发,其他互斥;顺序锁:读读、读写可并发;三者写写均互斥。自旋锁 自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的 并发可简单采用关闭中断的方式,不需要自旋锁)。 自旋锁最多只能被一个内核任务持有,如果一个内核任务试图请求一个已被争用(已经被持有)的自旋锁原创 2017-07-07 09:25:16 · 857 阅读 · 0 评论 -
Linux RCU
RCU的设计思想比较明确,通过新老指针替换的方式来实现免锁方式的共享保护。但是具体到代码的层面,理解起来多少还是会有些困难。在《深入Linux设备驱动程序内核机制》第4章中,已经非常明确地叙述了RCU背后所遵循的规则,这些规则是从一个比较高的视角来看,因为我觉得过多的代码分析反而容易让读者在细节上迷失方向。最近拿到书后,我又重头仔细看了RCU部分的文字,觉得还应该补充一点点内容,因为有些东西不一定原创 2017-07-07 09:25:08 · 245 阅读 · 0 评论 -
linux内核定时器
timer的用法还是很简单的。主要需要定义一个timer_list变量timer、先初始化timerinit_timer(&timer);then 对timer的相关参数赋值:timer.function = fun;timer.expires = jiffies + TIMER_DELAY;add_timer(&timer);在定时器时间到的时候,会执行fun,如果继续定时,可以通过在fun中执原创 2017-07-07 09:24:59 · 162 阅读 · 0 评论 -
《深入理解Linux内核》软中断/tasklet/工作队列
软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来。下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任务队列的函数都消失了,只剩下了前三者。本文重点在于介绍这三者之间的关系。(函数细节将不会在本文中出现,可以参考文献,点这里)(1)上半部和下半部的区别上半部指的是中断处理程序,下半部则指的是一些虽然与原创 2017-07-07 09:24:55 · 393 阅读 · 0 评论 -
中断屏蔽 原子操作 信号量
在设计自己的驱动程序时,第一个要记住的规则是:只要可能,就应该避免资源的共享。若没有并发访问,就不会有竞态。这种思想的最明显的应用是避免使用全局变量。临界区:临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性,临界区同一时间只能被一个进程访问。一、中断屏蔽:local_irq_disable()和local_irq_enable()原创 2017-07-07 09:24:43 · 1100 阅读 · 0 评论 -
Linux 内核综述
OS主要目的:(1)与硬件交互;(2)为应用程序提供可执行的环境。OS尽量禁止用户程序直接与底层硬件打交道或随意访问内存,因此Linux分为用户模式和内核模式。要实现两种模式,需要CPU硬件支持,ARM处理器中,CPSR(当前程序寄存器)用了5个bit来识别处理器的7种模式,其中两种与linux两模式对应,其他5模式标识不同中断或出错场景。单核处理器是 分时的并发;多核处理器是真正并发运行。lin原创 2017-07-07 09:24:41 · 185 阅读 · 0 评论 -
linux命令总结
linux命令后参数繁多,很难记忆,也容易忘掉。经常linux开发的靠多用来记忆,并结合以下方式来缓解:(1)指令参数多 大多用“manual ”命令 man 命令名 格式来查询该指令的参数详细说明。(2)alias[别名]=[指令名称] 例如 alias ll='ls -alF',很多工程师建立自己的别名指令库。(3)Up键可以查看到之前输入过的命令,ctrl+r可以输入过的命原创 2017-07-07 09:24:38 · 176 阅读 · 0 评论 -
设备I/O 端口和I/O 内存的访问
几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器、状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址。根据CPU体系结构的不同,CPU对IO端口的编址方式有两种: (1)I/O映射方式(I/O-mapped) 典型地,如X86处理器为外设专门实现了一个单独的地址空间,称为"I/O地址空间"或者"I/O端口空间",CPU通过专门的I/O指令(如X86的IN和OUT指令原创 2017-07-07 09:25:51 · 429 阅读 · 0 评论