上一页 1 ··· 156 157 158 159 160 161 162 163 164 ··· 280 下一页
摘要: 一些主设备编号是静态分派给最普通的设备的. 一个这些设备的列表在内核源码树的 Documentation/devices.txt 中. 分配给你的新驱动使用一个已经分配的静态编号的机会 很小, 但是, 并且新编号没在分配. 因此, 作为一个驱动编写者, 你有一个选择: 你可以 简单地捡一个看来没有用 阅读全文
posted @ 2019-07-05 15:23 樊伟胜 阅读(303) 评论(0) 推荐(0) 编辑
摘要: 在建立一个字符驱动时你的驱动需要做的第一件事是获取一个或多个设备编号来使用. 为 此目的的必要的函数是 register_chrdev_region, 在 <linux/fs.h>中声明: int register_chrdev_region(dev_t first, unsigned int co 阅读全文
posted @ 2019-07-05 15:11 樊伟胜 阅读(443) 评论(0) 推荐(0) 编辑
摘要: 在内核中, dev_t 类型(在 <linux/types.h>中定义)用来持有设备编号 -- 主次部分都包 括. 对于 2.6.0 内核, dev_t 是 32 位的量, 12 位用作主编号, 20 位用作次编号. 你的 代码应当, 当然, 对于设备编号的内部组织从不做任何假设; 相反, 应当利用 阅读全文
posted @ 2019-07-05 15:10 樊伟胜 阅读(630) 评论(0) 推荐(0) 编辑
摘要: 字符设备通过文件系统中的名子来存取. 那些名子称为文件系统的特殊文件, 或者设备文 件, 或者文件系统的简单结点; 惯例上它们位于 /dev 目录. 字符驱动的特殊文件由使用 ls -l 的输出的第一列的"c"标识. 块设备也出现在 /dev 中, 但是它们由"b"标识. 本章 集中在字符设备, 但 阅读全文
posted @ 2019-07-05 15:09 樊伟胜 阅读(347) 评论(0) 推荐(0) 编辑
摘要: 驱动需要知道的几个参数因不同的系统而不同. 从使用的设备号( 如我们在下一章见到的 ) 到驱动应当任何操作的几个方面. 例如, SCSI 适配器的驱动常常有选项控制标记命令队列 的使用, IDE 驱动允许用户控制 DMA 操作. 如果你的驱动控制老的硬件, 还需要被明确告 知哪里去找硬件的 I/O 阅读全文
posted @ 2019-07-05 15:06 樊伟胜 阅读(918) 评论(0) 推荐(0) 编辑
摘要: 编写驱动的第一步是定义驱动将要提供给用户程序的能力(机制).因为我们的"设备"是计算 机内存的一部分, 我们可自由做我们想做的事情. 它可以是一个顺序的或者随机存取的设 备, 一个或多个设备, 等等. 为使 scull 作为一个模板来编写真实设备的真实驱动, 我们将展示给你如何在计算机内存 上实现几 阅读全文
posted @ 2019-07-05 15:06 樊伟胜 阅读(494) 评论(0) 推荐(0) 编辑
摘要: 到目前, 我们的讨论已来到一个模块加载的重要方面: 竞争情况. 如果你在如何编写你的 初始化函数上不小心, 你可能造成威胁到整个系统的稳定的情形. 我们将在本书稍后讨论 竞争情况; 现在, 快速提几点就足够了: 首先时你应该一直记住, 内核的某些别的部分会在注册完成之后马上使用任何你注册的设 施. 阅读全文
posted @ 2019-07-05 15:05 樊伟胜 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 每个非试验性的模块也要求有一个清理函数, 它注销接口, 在模块被去除之前返回所有资 源给系统. 这个函数定义为: static void exit cleanup_function(void) { /* Cleanup code here */ } module_exit(cleanup_funct 阅读全文
posted @ 2019-07-05 15:04 樊伟胜 阅读(310) 评论(0) 推荐(0) 编辑
摘要: 你必须记住一件事, 在注册内核设施时, 注册可能失败. 即便最简单的动作常常需要内存 分配, 分配的内存可能不可用. 因此模块代码必须一直检查返回值, 并且确认要求的操作 实际上已经成功. 如果在你注册工具时发生任何错误, 首先第一的事情是决定模块是否能够无论如何继续初 始化它自己. 常常, 在一个 阅读全文
posted @ 2019-07-05 15:04 樊伟胜 阅读(570) 评论(0) 推荐(0) 编辑
摘要: 如已提到的, 模块初始化函数注册模块提供的任何功能. 这些功能, 我们指的是新功能, 可以由应用程序存取的或者一整个驱动或者一个新软件抽象. 实际的初始化函数定义常常 如: static int init initialization_function(void) { /* Initializati 阅读全文
posted @ 2019-07-05 15:03 樊伟胜 阅读(189) 评论(0) 推荐(0) 编辑
上一页 1 ··· 156 157 158 159 160 161 162 163 164 ··· 280 下一页