随笔分类 -  liunx设备驱动程序

上一页 1 ··· 7 8 9 10 11
个人学习使用,所有收集仅供参考。
摘要:write, 象 read, 可以传送少于要求的数据, 根据返回值的下列规则: 如果值等于 count, 要求的字节数已被传送. 如果正值, 但是小于 count, 只有部分数据被传送. 程序最可能重试写入剩下的数 据. 如果值为 0, 什么没有写. 这个结果不是一个错误, 没有理由返回一个错误码. 阅读全文
posted @ 2019-07-05 15:38 樊伟胜 阅读(324) 评论(0) 推荐(0) 编辑
摘要:read 的返回值由调用的应用程序解释: 如果这个值等于传递给 read 系统调用的 count 参数, 请求的字节数已经被传送. 这是最好的情况. 如果是正数, 但是小于 count, 只有部分数据被传送. 这可能由于几个原因, 依赖 于设备. 常常, 应用程序重新试着读取. 例如, 如果你使用 阅读全文
posted @ 2019-07-05 15:37 樊伟胜 阅读(330) 评论(0) 推荐(0) 编辑
摘要:读和写方法都进行类似的任务, 就是, 从和到应用程序代码拷贝数据. 因此, 它们的原型 相当相似, 可以同时介绍它们: ssize_t read(struct file *filp, char user *buff, size_t count, loff_t *offp); ssize_t writ 阅读全文
posted @ 2019-07-05 15:36 樊伟胜 阅读(236) 评论(0) 推荐(0) 编辑
摘要:在介绍读写操作前, 我们最好看看如何以及为什么 scull 进行内存分配. "如何"是需要全 面理解代码, "为什么"演示了驱动编写者需要做的选择, 尽管 scull 明确地不是典型设备. 本节只处理 scull 中的内存分配策略, 不展示给你编写真正驱动需要的硬件管理技能. 其他风味的设备由不同的 阅读全文
posted @ 2019-07-05 15:35 樊伟胜 阅读(254) 评论(0) 推荐(0) 编辑
摘要:在内部, scull 使用一个 struct scull_dev 类型的结构表示每个设备. 这个结构定义为: struct scull_dev { struct scull_qset *data; /* Pointer to first quantum set */ int quantum; /* 阅读全文
posted @ 2019-07-05 15:33 樊伟胜 阅读(192) 评论(0) 推荐(0) 编辑
摘要:如我们提过的, 内核在内部使用类型 struct cdev 的结构来代表字符设备. 在内核调用你 的设备操作前, 你编写分配并注册一个或几个这些结构. [11] 11为此, 你的代码应当包含 <linux/cdev.h>, 这个结构和它的关联帮助函数定义在这里. 有 2 种方法来分配和初始化一个这些 阅读全文
posted @ 2019-07-05 15:32 樊伟胜 阅读(500) 评论(0) 推荐(0) 编辑
摘要:inode 结构由内核在内部用来表示文件. 因此, 它和代表打开文件描述符的文件结构是不 同的. 可能有代表单个文件的多个打开描述符的许多文件结构, 但是它们都指向一个单个 inode 结构. inode 结构包含大量关于文件的信息. 作为一个通用的规则, 这个结构只有 2 个成员对于 编写驱动代码 阅读全文
posted @ 2019-07-05 15:31 樊伟胜 阅读(460) 评论(0) 推荐(0) 编辑
摘要:struct file, 定义于 <linux/fs.h>, 是设备驱动中第二个最重要的数据结构. 注意 file 与用户空间程序的 FILE 指针没有任何关系. 一个 FILE 定义在 C 库中, 从不出现在内核 代码中. 一个 struct file, 另一方面, 是一个内核结构, 从不出现在用 阅读全文
posted @ 2019-07-05 15:30 樊伟胜 阅读(794) 评论(0) 推荐(0) 编辑
摘要:一些主设备编号是静态分派给最普通的设备的. 一个这些设备的列表在内核源码树的 Documentation/devices.txt 中. 分配给你的新驱动使用一个已经分配的静态编号的机会 很小, 但是, 并且新编号没在分配. 因此, 作为一个驱动编写者, 你有一个选择: 你可以 简单地捡一个看来没有用 阅读全文
posted @ 2019-07-05 15:23 樊伟胜 阅读(301) 评论(0) 推荐(0) 编辑
摘要:在建立一个字符驱动时你的驱动需要做的第一件事是获取一个或多个设备编号来使用. 为 此目的的必要的函数是 register_chrdev_region, 在 <linux/fs.h>中声明: int register_chrdev_region(dev_t first, unsigned int co 阅读全文
posted @ 2019-07-05 15:11 樊伟胜 阅读(438) 评论(0) 推荐(0) 编辑
摘要:在内核中, dev_t 类型(在 <linux/types.h>中定义)用来持有设备编号 -- 主次部分都包 括. 对于 2.6.0 内核, dev_t 是 32 位的量, 12 位用作主编号, 20 位用作次编号. 你的 代码应当, 当然, 对于设备编号的内部组织从不做任何假设; 相反, 应当利用 阅读全文
posted @ 2019-07-05 15:10 樊伟胜 阅读(628) 评论(0) 推荐(0) 编辑
摘要:字符设备通过文件系统中的名子来存取. 那些名子称为文件系统的特殊文件, 或者设备文 件, 或者文件系统的简单结点; 惯例上它们位于 /dev 目录. 字符驱动的特殊文件由使用 ls -l 的输出的第一列的"c"标识. 块设备也出现在 /dev 中, 但是它们由"b"标识. 本章 集中在字符设备, 但 阅读全文
posted @ 2019-07-05 15:09 樊伟胜 阅读(347) 评论(0) 推荐(0) 编辑
摘要:编写驱动的第一步是定义驱动将要提供给用户程序的能力(机制).因为我们的"设备"是计算 机内存的一部分, 我们可自由做我们想做的事情. 它可以是一个顺序的或者随机存取的设 备, 一个或多个设备, 等等. 为使 scull 作为一个模板来编写真实设备的真实驱动, 我们将展示给你如何在计算机内存 上实现几 阅读全文
posted @ 2019-07-05 15:06 樊伟胜 阅读(494) 评论(0) 推荐(0) 编辑
摘要:到目前, 我们的讨论已来到一个模块加载的重要方面: 竞争情况. 如果你在如何编写你的 初始化函数上不小心, 你可能造成威胁到整个系统的稳定的情形. 我们将在本书稍后讨论 竞争情况; 现在, 快速提几点就足够了: 首先时你应该一直记住, 内核的某些别的部分会在注册完成之后马上使用任何你注册的设 施. 阅读全文
posted @ 2019-07-05 15:05 樊伟胜 阅读(161) 评论(0) 推荐(0) 编辑
摘要:每个非试验性的模块也要求有一个清理函数, 它注销接口, 在模块被去除之前返回所有资 源给系统. 这个函数定义为: static void exit cleanup_function(void) { /* Cleanup code here */ } module_exit(cleanup_funct 阅读全文
posted @ 2019-07-05 15:04 樊伟胜 阅读(306) 评论(0) 推荐(0) 编辑
摘要:你必须记住一件事, 在注册内核设施时, 注册可能失败. 即便最简单的动作常常需要内存 分配, 分配的内存可能不可用. 因此模块代码必须一直检查返回值, 并且确认要求的操作 实际上已经成功. 如果在你注册工具时发生任何错误, 首先第一的事情是决定模块是否能够无论如何继续初 始化它自己. 常常, 在一个 阅读全文
posted @ 2019-07-05 15:04 樊伟胜 阅读(569) 评论(0) 推荐(0) 编辑
摘要:如已提到的, 模块初始化函数注册模块提供的任何功能. 这些功能, 我们指的是新功能, 可以由应用程序存取的或者一整个驱动或者一个新软件抽象. 实际的初始化函数定义常常 如: static int init initialization_function(void) { /* Initializati 阅读全文
posted @ 2019-07-05 15:03 樊伟胜 阅读(189) 评论(0) 推荐(0) 编辑
摘要:我们正在接近去看一些实际的模块代码. 但是首先, 我们需要看一些需要出现在你的模块 源码文件中的东西. 内核是一个独特的环境, 它将它的要求强加于要和它接口的代码上. 大部分内核代码包含了许多数量的头文件来获得函数, 数据结构和变量的定义. 我们将在 碰到它们时检查这些文件, 但是有几个文件对模块是 阅读全文
posted @ 2019-07-05 14:56 樊伟胜 阅读(132) 评论(0) 推荐(0) 编辑
摘要:每个电脑平台有其自己的特点, 内核设计者可以自由使用所有的特性来获得更好的性能. in the target object file ??? 不象应用程序开发者, 他们必须和预编译的库一起连接他们的代码, 依附在参数传递的规 定上, 内核开发者可以专用某些处理器寄存器给特别的用途, 他们确实这样做了 阅读全文
posted @ 2019-07-05 14:54 樊伟胜 阅读(225) 评论(0) 推荐(0) 编辑
摘要:第一步, 我们需要看一下模块如何必须被建立. 模块的建立过程与用户空间的应用程序的 建立过程有显著不同; 内核是一个大的, 独立的程序, 对于它的各个部分如何组合在一起 有详细的明确的要求. 建立过程也与以前版本的内核的过程不同; 新的建立系统用起来更 简单并且产生更正确的结果, 但是它看起来与以前 阅读全文
posted @ 2019-07-05 14:53 樊伟胜 阅读(1966) 评论(0) 推荐(0) 编辑

上一页 1 ··· 7 8 9 10 11