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

上一页 1 ··· 6 7 8 9 10 11 下一页
个人学习使用,所有收集仅供参考。
摘要:Linux 内核提供了一个遵守上面语义的旗标实现, 尽管术语有些不同. 为使用旗标, 内核 代码必须包含 <asm/semaphore.h>. 相关的类型是 struct semaphore; 实际旗标可以用 几种方法来声明和初始化. 一种是直接创建一个旗标, 接着使用 sema_init 来设定它 阅读全文
posted @ 2019-07-06 09:35 樊伟胜 阅读(541) 评论(0) 推荐(0) 编辑
摘要:让我们快速看一段 scull 内存管理代码. 在写逻辑的深处, scull 必须决定它请求的内 存是否已经分配. 处理这个任务的代码是: if (!dptr->data[s_pos]) { dptr->data[s_pos] = kmalloc(quantum, GFP_KERNEL); if (! 阅读全文
posted @ 2019-07-06 09:33 樊伟胜 阅读(167) 评论(0) 推荐(0) 编辑
摘要:用户模式 Linux (UML) 是一个有趣的概念. 它被构建为一个分开的 Linux 内核移植, 有 它自己的 arch/um 子目录. 它不在一个新的硬件类型上运行, 但是; 相反, 它运行在一 个由 Linux 系统调用接口实现的虚拟机上. 如此, UML 使用 Linux 内核来运行, 作为 阅读全文
posted @ 2019-07-06 09:32 樊伟胜 阅读(287) 评论(0) 推荐(0) 编辑
摘要:目前为止我们看到的 2 个交互式调试方法( 使用 gdb 于 /proc/kcore 和 kdb) 都缺乏 应用程序开发者已经熟悉的那种环境. 如果有一个真正的内核调试器支持改变变量, 断点 等特色, 不是很好? 确实, 有这样一个解决方案 2 个分开的补丁在流通中, 它允许 gdb, 具 备完全功 阅读全文
posted @ 2019-07-06 09:29 樊伟胜 阅读(358) 评论(0) 推荐(0) 编辑
摘要:gdb 对于看系统内部是非常有用. 在这个级别精通调试器的使用要求对 gdb 命令有信心, 需要理解目标平台的汇编代码, 以及对应源码和优化的汇编码的能力. gdb 对于看系统内部是非常有用. 在这个级别精通调试器的使用要求对 gdb 命令有信心, 需要理解目标平台的汇编代码, 以及对应源码和优化的 阅读全文
posted @ 2019-07-06 09:17 樊伟胜 阅读(488) 评论(0) 推荐(0) 编辑
摘要:尽管内核代码的大部分 bug 以 oops 消息结束, 有时候它们可能完全挂起系统. 如果系 统挂起, 没有消息打印. 例如, 如果代码进入一个无限循环, 内核停止调度,[15]15 并且系 统不会响应任何动作, 包括魔术 Ctrl-Alt-Del 组合键. 你有 2 个选择来处理系统挂起- - 或 阅读全文
posted @ 2019-07-06 09:14 樊伟胜 阅读(1202) 评论(0) 推荐(0) 编辑
摘要:大部分 bug 以解引用 NULL 指针或者使用其他不正确指针值来表现自己的. 此类 bug 通 常的输出是一个 oops 消息. 处理器使用的任何地址几乎都是一个虚拟地址, 通过一个复杂的页表结构映射为物理地址 (例外是内存管理子系统自己使用的物理地址). 当解引用一个无效的指针, 分页机制无法 阅读全文
posted @ 2019-07-06 09:13 樊伟胜 阅读(644) 评论(0) 推荐(0) 编辑
摘要:有时小问题可以通过观察用户空间的应用程序的行为来追踪. 监视程序也有助于建立对驱 动正确工作的信心. 例如, 我们能够对 scull 感到有信心, 在看了它的读实现如何响应 不同数量数据的读请求之后. 73 有时小问题可以通过观察用户空间的应用程序的行为来追踪. 监视程序也有助于建立对驱 动正确工作 阅读全文
posted @ 2019-07-06 09:12 樊伟胜 阅读(357) 评论(0) 推荐(0) 编辑
摘要:ioctl, 我们在第 1 章展示给你如何使用, 是一个系统调用, 作用于一个文件描述符; 它 接收一个确定要进行的命令的数字和(可选地)另一个参数, 常常是一个指针. 作为一个使 用 /proc 文件系统的替代, 你可以实现几个用来调试用的 ioctl 命令. 这些命令可以从 驱动拷贝相关的数据结 阅读全文
posted @ 2019-07-06 08:53 樊伟胜 阅读(1692) 评论(0) 推荐(0) 编辑
摘要:如我们上面提到的, 在 /proc 下的大文件的实现有点麻烦. 一直以来, /proc 方法因为 当输出数量变大时的错误实现变得声名狼藉. 作为一种清理 /proc 代码以及使内核开发 者活得轻松些的方法, 添加了 seq_file 接口. 这个接口提供了简单的一套函数来实现大 内核虚拟文件. se 阅读全文
posted @ 2019-07-06 08:52 樊伟胜 阅读(517) 评论(0) 推荐(0) 编辑
摘要:一旦你有一个定义好的 read_proc 函数, 你应当连接它到 /proc 层次中的一个入口项. 使用一个 creat_proc_read_entry 调用: struct proc_dir_entry *create_proc_read_entry(const char *name,mode_t 阅读全文
posted @ 2019-07-06 08:48 樊伟胜 阅读(1614) 评论(0) 推荐(0) 编辑
摘要:所有使用 /proc 的模块应当包含 <linux/proc_fs.h> 来定义正确的函数. 要创建一个只读 /proc 文件, 你的驱动必须实现一个函数来在文件被读时产生数据. 当 某个进程读文件时(使用 read 系统调用), 这个请求通过这个函数到达你的模块. 我们先 看看这个函数并在本章后面 阅读全文
posted @ 2019-07-06 08:45 樊伟胜 阅读(514) 评论(0) 推荐(0) 编辑
摘要:/proc 文件系统是一个特殊的软件创建的文件系统, 内核用来输出消息到外界. /proc 下 的每个文件都绑到一个内核函数上, 当文件被读的时候即时产生文件内容. 我们已经见到 一些这样的文件起作用; 例如, /proc/modules, 常常返回当前已加载的模块列表. /proc 在 Linux 阅读全文
posted @ 2019-07-06 08:44 樊伟胜 阅读(435) 评论(0) 推荐(0) 编辑
摘要:偶尔地, 当从一个驱动打印消息, 你会想打印与感兴趣的硬件相关联的设备号. 打印主次 编号不是特别难, 但是, 为一致性考虑, 内核提供了一些实用的宏定义( 在 <linux/kdev_t.h> 中定义)用于这个目的: int print_dev_t(char *buffer, dev_t dev) 阅读全文
posted @ 2019-07-06 08:39 樊伟胜 阅读(254) 评论(0) 推荐(0) 编辑
摘要:前面一节描述了 printk 是任何工作的以及怎样使用它. 没有谈到的是它的缺点. 大量使用 printk 能够显著地拖慢系统, 即便你降低 cosole_loglevel 来避免加载控制 台设备, 因为 syslogd 会不停地同步它的输出文件; 因此, 要打印的每一行都引起一次 磁盘操作. 从 阅读全文
posted @ 2019-07-06 08:39 樊伟胜 阅读(143) 评论(0) 推荐(0) 编辑
摘要:在驱动开发的早期, printk 非常有助于调试和测试新代码. 当你正式发行驱动时, 换句 话说, 你应当去掉, 或者至少关闭, 这些打印语句. 不幸的是, 你很可能会发现, 就在你 认为你不再需要这些消息并去掉它们时, 你要在驱动中实现一个新特性(或者有人发现了 一个 bug), 你想要至少再打开 阅读全文
posted @ 2019-07-06 08:38 樊伟胜 阅读(463) 评论(0) 推荐(0) 编辑
摘要:如果你不小心, 你会发现自己用 printk 产生了上千条消息, 压倒了控制台并且, 可能地, 使系统日志文件溢出. 当使用一个慢速控制台设备(例如, 一个串口), 过量的消息速率也 能拖慢系统或者只是使它不反应了. 非常难于着手于系统出错的地方, 当控制台不停地输 出数据. 因此, 你应当非常注意 阅读全文
posted @ 2019-07-06 08:38 樊伟胜 阅读(242) 评论(0) 推荐(0) 编辑
摘要:printk 函数将消息写入一个 LOG_BUF_LEN 字节长的环形缓存, 长度值从 4 KB 到 1 MB, 由配置内核时选择. 这个函数接着唤醒任何在等待消息的进程, 就是说, 任何在系统 调用中睡眠或者在读取 /proc/kmsg 的进程. 这 2 个日志引擎的接口几乎是等同的, 但 是注意 阅读全文
posted @ 2019-07-06 08:33 樊伟胜 阅读(181) 评论(0) 推荐(0) 编辑
摘要:Linux 在控制台记录策略上允许一些灵活性, 它允许你发送消息到一个指定的虚拟控制台 (如果你的控制台使用的是文本屏幕). 缺省地, 这个"控制台"是当前虚拟终端. 为了选择 一个不同地虚拟终端来接收消息, 你可对任何控制台设备调用 ioctl(TIOCLINUX). 下面 的程序, setcon 阅读全文
posted @ 2019-07-06 08:32 樊伟胜 阅读(687) 评论(0) 推荐(0) 编辑
摘要:Unix 系统已经长时间支持名为 readv 和 writev 的 2 个系统调用. 这些 read 和 write 的"矢量"版本使用一个结构数组, 每个包含一个缓存的指针和一个长度值. 一个 readv 调 用被期望来轮流读取指示的数量到每个缓存. 相反, writev 要收集每个缓存的内容到一 阅读全文
posted @ 2019-07-05 15:39 樊伟胜 阅读(1938) 评论(0) 推荐(0) 编辑

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