当前位置:文档之家› 最新LINUX设备驱动开发及内核原理

最新LINUX设备驱动开发及内核原理

它通过文件系统节点被访问. e.g: /dev/tty1, /dev/lp0 字符设备与一般文件(regular file)的区别
可以在一般文件中前后移动(lseek), 但只能顺序访问字符设备. 当然, 也有特例: frame grabbers.
块设备: 能支持文件系统的设备
传统的UNIX: 只能以block(512B)为单位访问块设备 Linux: 能以访问字符设备的方式访问块设备, 即以字节文单位访问
模块的加载卸载和查看
加载使用insmod 卸载使用rmmod 查看使用lsmod
模块代码
static int __init initialization_function(void) { /*initialization code here*/ } module_init(initialization_function);
mechanism: What capabilities are provided. policy: How these capabilities can be used.
Kernel的作用
Kernel可划分为下列功能单元
进程管理: 进程调度, 资源分配, 进程间通信. 内存管理: 其实也算是资源分配的一部分 文件系统: 管理, 组织物理媒介上数据的方法 设备控制: 设备驱动(ldd3所关注的) 网络: 实质上是进程间通信. 但它不局限于一个特
模块代码
static void __exit cleanup_function(void) { /* Cleanup code here*/ } module_exit(cleanup_function);
如何处理加载中的失败
int __init my_init_function(void)
建立开发环境
ldd3例子开发环境linux2.6.10 2.6驱动开发需要预先安装内核源码 源码需要从官方下载 或者其他发行版的官方下载 直接解压到/usr/src目录下
版本影响
内核官方版本注意 注意发行版的内部版本 最新内核版本linux2.6.20/21工作队列接口变化 小版本变动不会对驱动的架构造成太大影响 对于不同发行版,不同内核版本要做少量移植和测试
内核模块VS应用程序
执行机制不同
模块初始化 模块退出 类似事件编程
使用库不一样
无法使用标准库 只能调用内核提供的函数
用户空间VS内核空间
用户空间VS内核空间
应用程序运行在用户空间 设备模块运行在内核空间 运行模式不一样 内存地址映射也不一样
用户空间和内核空间的转换
可能发生在进程中的系统调用时或者硬件中断 系统调用虽然在内核中执行,但是依然是在进程的上下文中进
行的,所以可以访问到进程中的数据。 中断处理和进程是异步的了,而且不和任何进程有关系
模块跨越两个空间,有两个触发入口
一些函数作为系统调用的一部分执行 一些函数负责中断处理
内核中的并发
应用程序很多时候是按照顺序来执行的 内核处于并发的执行环境当中
内核当中有并发的进程 中断需要响应和处理 内核中的服务也在运行 对称多处理器导致并行
也有一些module不能严格地划分类型.
USB module: 它工作在内核的USB子系统之上 实际的USB设备可以是字符设备, 块设备, 也可以
是网络接口
在设备驱动之外, 别的功能, 不论硬件和软 件, 在内核中排
设备驱动简介 建立和运行模块
建立和运行模块
LINUX设备驱动开发及内核原 理
日程安排
设备驱动简介
设备驱动简介
驱动是什么
Driver is a software layer that lies between the applications and the actual device
驱动程序的角色
提供机制, 而不是策略
隐藏在UNIX中的哲学
块设备.
Linux中字符设备与块设备的区别
内核内部对数据的组织和管理不同, 对驱动开发者来说透明 接口不同: 使用两套不同的interface
网络设备
网络接口: 能与其他主机通信的设备
它可以是硬件设备, 也可以是软件设备, 比如lo. (参考 TCP/IP详解p26)
网络接口只管收发数据包, 而不管这些数据包被什么协议 所使用
{
int err;
/* registration takes a pointer and a name */
err = register_this(ptr1, "skull");
if (err)
goto fail_this;
err = register_that(ptr2, "skull");
if (err)
goto fail_that;
err = register_those(ptr3, "skull");
不同于字符设备和块设备, 网络接口没有对应的文件系统 节点. 虽然可以通过类似eth0这样的"文件名"来访问网络 接口, 但文件系统节点中却没有针对网络接口的节点
内核与网络接口之间的通信也不同于内核与字符/块设备 之间的通信(read, write), 它们之间使用特定的传输数据包 的函数调用
其他设备
设备和模块的分类
模块分为这些类型,每种类型的模块驱动 对应类型的设备
character module, block module, network interface other module
字符设备和块设备
字符设备: 以字节流的形式被访问的设备。e.g: /dev/console : 文本控制台. /dev/ttyS0 : 串口
定的进程. 它关注收/发packets, 路由, 地址解析...
Kernel的结构
模块
可加载模块(lodable modules)
module: 可实时加载到内核中的代码, 它可动态 连接到内核(insmod, rmmod)
设备驱动就是module的代表, 但module还包括文 件系统等等.
相关主题