linux驱动开发
飞奔的蜗牛-Ryze
莫使青春踌躇,莫为未来伤优。每天进步一点点,快快乐乐每一天。
展开
-
设备驱动概述(1)
设备驱动概述(1) 成于坚持,败于止步 设备驱动的作用 任何一个计算机系统的运行都是系统中软硬件协作的结果,没有硬件的软件是空中楼阁,而没有软件的硬件则只是一堆废铁。硬件是底层基础,是所有软件得以运行的平台,代码最终会落实为硬件上的组合逻辑与时序逻辑;软件则实现了具体应用,它按照各种不同的业务需求而设计,满足了用户的需求。硬件较固定,软件则很灵活,可以适应各种复杂多变的应用。可以说,计算机系统的软...转载 2019-04-26 11:21:40 · 348 阅读 · 0 评论 -
Linux 文件系统与设备文件系统(3)
Linux 文件系统与设备文件系统(3) 成于坚持,败于止步 sysfs 文件系统与 Linux 设备模型 1.sysfs 文件系统 Linux 2.6 内核引入了 sysfs 文件系统,sysfs 被看成是与 proc、devfs 和 devpty 同类别的文件系统,该文件系统是一个虚拟的文件系统,它可以产生一个包括所有系统硬件的层级视图,与提供进程和状态信息的 proc 文件系统十分类似。 s...转载 2019-04-28 10:10:21 · 432 阅读 · 0 评论 -
字符设备驱动(1)
字符设备驱动(1) 成于坚持,败于止步 Linux 字符设备驱动结构 cdev 结构体 在 Linux 2.6 内核中使用 cdev 结构体描述字符设备,cdev 结构体的定义如代码所示。 1 struct cdev 2 { 3 struct kobject kobj; /* 内嵌的 kobject 对象 */ 4 struct module *owner; /所属模块/ 5 ...转载 2019-04-28 10:11:08 · 190 阅读 · 0 评论 -
Linux设备驱动开发详解-Note(13)--- 字符设备驱动(2)
字符设备驱动(2) 成于坚持,败于止步 globalmem程序源码 #include <linux/module.h> #include <linux/types.h> #include <linux/fs.h> #include <linux/errno.h> #include <linux/mm.h> #include <lin...转载 2019-04-30 13:32:40 · 253 阅读 · 0 评论 -
Linux设备驱动开发详解-Note(14)--- Linux 设备驱动中的并发控制(1)
Linux 设备驱动中的并发控制(1) 成于坚持,败于止步 并发与竞态 并发(concurrency)指的是多个执行单元同时、并行被执行,而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问则很容易导致竞态(race conditions)。例如,对于 globalmem 设备,假设一个执行单元 A 对其写入 3000 个字符“a”,而另一个执行单元 B 对其写入 4000 ...转载 2019-04-30 13:34:57 · 285 阅读 · 0 评论 -
Linux设备驱动开发详解-Note(15)--- Linux 设备驱动中的并发控制(2)
Linux 设备驱动中的并发控制(2) 成于坚持,败于止步 信号量 信号量的使用 信号量(semaphore)是用于保护临界区的一种常用方法,它的使用方式和自旋锁类似。与自旋锁相同,只有得到信号量的进程才能执行临界区代码。但是,与自旋锁不同的是,当获取不到信号量时,进程不会原地打转而是进入休眠等待状态。 Linux 系统中与信号量相关的操作主要有如下 4 种。 1.定义信号量 下列代码定义名称为 ...转载 2019-04-30 13:35:39 · 282 阅读 · 0 评论 -
Linux设备驱动开发详解-Note(16)---Linux 设备驱动中的阻塞与非阻塞 I/O(1)
Linux 设备驱动中的阻塞与非阻塞 I/O(1) 成于坚持,败于止步 阻塞与非阻塞 I/O 阻塞操作是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作。被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足。而非阻塞操作的进程在不能进行设备操作时并不挂起,它或者放 弃,或者不停地查询,直至可以进行操作为止。 驱动程序通常需要提供这样的能力:当应用程序...转载 2019-04-30 13:36:26 · 179 阅读 · 0 评论 -
Linux设备驱动开发详解-Note(17)---Linux 设备驱动中的阻塞与非阻塞 I/O(2)
Linux 设备驱动中的阻塞与非阻塞 I/O(2) 成于坚持,败于止步 轮询操作 轮询的概念与作用 在用户程序中,select()和 poll()也是与设备阻塞与非阻塞访问息息相关的论题。使用非阻塞 I/O 的应用程序通常会使用 select()和 poll()系统调用查询是否可对设备进行无阻塞的访问。select()和 poll()系统调用最终会引发设备驱动中的 poll()函数被执行,在 2....转载 2019-04-30 13:37:01 · 154 阅读 · 0 评论 -
Linux设备驱动开发详解-Note(18)---Linux 设备驱动中的异步通知与异步 I/O(1)
Linux 设备驱动中的异步通知与异步 I/O(1) 成于坚持,败于止步 异步通知的概念与作用 阻塞与非阻塞访问、poll()函数提供了较好的解决设备访问的机制,但是如果有了异步通知整套机制就更加完整了。 异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上“中断”的概念,比较准确的称谓是“信号驱动的异步 I/O”。信号是在软件层次上对中...转载 2019-04-30 13:37:40 · 248 阅读 · 0 评论 -
Linux 文件系统与设备文件系统(2)
Linux 文件系统与设备文件系统(2) 成于坚持,败于止步 Linux 文件系统目录结构 进入 Linux 根目录(即“/”,Linux 文件系统的入口,也是处于最高一级的目录),运行“ls –l”命令,可以看到 Linux 系统包含以下目录。 1./bin 包含基本命令,如 ls、cp、mkdir 等,这个目录中的文件都是可执行的。 2./boot Linux 系统的内核及引导系统程序所需要的...转载 2019-04-28 10:09:27 · 251 阅读 · 0 评论 -
Linux 文件系统与设备文件系统(1)
Linux 文件系统与设备文件系统(1) 成于坚持,败于止步 文件操作的相关系统调用 Linux 的文件操作系统调用(在 Windows 编程领域,习惯称操作系统提供的接口为 API)涉及创建、打开、读写和关闭文件。 1.创建 int creat(const char *filename, mode_t mode); 参数 mode 指定新建文件的存取权限,它同 umask 一起决定文件的最终权限...转载 2019-04-28 10:08:38 · 190 阅读 · 0 评论 -
Linux 内核模块(2)
Linux 内核模块(2) 成于坚持,败于止步 模块加载函数 Linux 内核模块加载函数一般以_ _init 标识声明,典型的模块加载函数的形式如代码所示: 1 static int _ _init initialization_function(void) 2 { 3 /* 初始化代码 */ 4 } 5 module_init(initialization_function...转载 2019-04-28 10:07:52 · 262 阅读 · 0 评论 -
设备驱动概述(2)
设备驱动概述(2) 成于坚持,败于止步 Linux 设备驱动 设备的分类及特点 计算机系统的硬件主要由 CPU、存储器和外设组成。随着 IC 制造工艺的发展,目前,芯片的集成度越来越高,往往在 CPU 内部就集成了存储器和外设适配器。ARM、PowerPC、MIPS 等处理器都集成了 UART、I2C 控制器、USB 控制器、SDRAM 控制器等,有的处理器还集成了片内 RAM 和 Flash。 ...转载 2019-04-26 11:22:59 · 222 阅读 · 0 评论 -
驱动设计的硬件基础(1)
驱动设计的硬件基础(1) 成于坚持,败于止步 处理器分类 不做过多说明,处理器类型很多,大同小异 存储器 存储器可分为只读储存器(ROM)、闪存(Flash)、随机存取存储器(RAM)、光介质存储器和磁介质存储器。 ROM 还可再细分为不可编程 ROM、可编程 ROM(PROM)、可擦除可编程 ROM(EPROM)和电可擦除可编程 ROM(E2PROM),E2PROM 完全可以用软件来擦写,已经非...转载 2019-04-26 11:23:41 · 239 阅读 · 0 评论 -
驱动设计的硬件基础(2)
驱动设计的硬件基础(2) 成于坚持,败于止步 接口与总线 串口 RS-232、RS-422 与 RS-485 都是串行数据接口标准,最初都是由电子工业协会(EIA)制定并发布的。 RS-232 在 1962 年发布,命名为 EIA-232-E。之后发布的 RS-422 定义了一种平衡通信接口,它是一种单机发送、多机接收的单向、平衡传输规范,被命名为TIA/EIA-422-A 标准。RS-422 改...转载 2019-04-26 11:26:48 · 316 阅读 · 0 评论 -
驱动设计的硬件基础(1)
成于坚持,败于止步 处理器分类 不做过多说明,处理器类型很多,大同小异 存储器 存储器可分为只读储存器(ROM)、闪存(Flash)、随机存取存储器(RAM)、光介质存储器和磁介质存储器。 ROM 还可再细分为不可编程 ROM、可编程 ROM(PROM)、可擦除可编程 ROM(EPROM)和电可擦除可编程 ROM(E2PROM),E2PROM 完全可以用软件来擦写,已经非常方便了。 目前 ROM ...转载 2019-04-28 10:02:24 · 215 阅读 · 0 评论 -
驱动设计的硬件基础(2)
驱动设计的硬件基础(2) 成于坚持,败于止步 接口与总线 串口 RS-232、RS-422 与 RS-485 都是串行数据接口标准,最初都是由电子工业协会(EIA)制定并发布的。 RS-232 在 1962 年发布,命名为 EIA-232-E。之后发布的 RS-422 定义了一种平衡通信接口,它是一种单机发送、多机接收的单向、平衡传输规范,被命名为TIA/EIA-422-A 标准。RS-422 改...转载 2019-04-28 10:03:25 · 160 阅读 · 0 评论 -
Linux 内核及内核编程(1)
Linux 内核及内核编程(1) 成于坚持,败于止步 Linux 2.6 内核的特点 Linux 2.6 相对于 Linux 2.4 有相当大的改进,主要体现在如下几个方面。 1.新的调度器 2.6 版本的 Linux 内核使用了新的进程调度算法,它在高负载的情况下执行得极其出色,并且当有很多处理器时也可以很好地扩展。 2.内核抢占 在 2.6 版本的 Linux 内核中,内核任务可以被抢占,从而...转载 2019-04-28 10:05:00 · 115 阅读 · 0 评论 -
Linux 内核及内核编程(2)
Linux 内核及内核编程(2) 成于坚持,败于止步 Linux 下的C编程举例 零长度数组 GNU C 允许使用零长度数组,在定义变长对象的头结构时,这个特性非常有用。例如: struct var_data { int len; char data[0]; }; char data[0]仅仅意味着程序中通过 var_data 结构体实例的 data[index]成员可以访问 len 之后的第 i...转载 2019-04-28 10:06:28 · 199 阅读 · 0 评论 -
Linux 内核模块(1)
Linux 内核模块(1) 成于坚持,败于止步 Linux 内核模块简介 Linux 内核的整体结构非常庞大,其包含的组件也非常多。我们怎样把需要的部分都包含在内核中呢? 一种方法是把所有需要的功能都编译到 Linux 内核。这会导致两个问题,一是生成的内核会很大,二是如果我们要在现有的内核中新增或删除功能,将不得不重新编译内核。 有没有一种机制使得编译出的内核本身并不需要包含所有功能,而在这些功...转载 2019-04-28 10:07:08 · 156 阅读 · 0 评论 -
Linux设备驱动开发详解-Note(19)---Linux 设备驱动中的异步通知与异步 I/O(2)
Linux 设备驱动中的异步通知与异步 I/O(2) 成于坚持,败于止步 Linux 2.6 异步 I/O AIO 概念与 GNU C 库函数 Linux 系统中最常用的输入/输出(I/O)模型是同步 I/O。在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足为止。这是很好的一种解决方案,因为调用应用程序在等待 I/O 请求完成时不需要使用任何中央处理单元(CPU)。但是在某 些情况下,...转载 2019-04-30 13:38:28 · 281 阅读 · 0 评论