Linux设备驱动程序第三版学习笔记
Hens007
一无所有
展开
-
Linux设备驱动程序第三版学习(11)- 分配内存
一、kmalloc函数内幕 kmalloc的使用已经比较熟悉了,它的函数原型是: 1: #include 2: void *kmalloc(size_t size, int flags); <!-- .csharpcode, .csharpcode pre {font-size:small; color:black; font-family:consol转载 2012-02-16 15:18:00 · 622 阅读 · 0 评论 -
Linux设备驱动程序第三版学习(7)- 高级字符驱动程序操作(续2)- poll/select .
第六章:高级字符驱动程序操作(续2) 以下为第三部分:poll/select系统调用 poll方法执行了两个任务: 第一项任务:调用poll_wait方法向poll_table结构添加一个等待队列 第二项任务:返回一个位掩码(mask),该位掩码秒数了哪个操作可以立即执行而不会被阻塞。 对于位掩码,定义在asm-generic/poll.h中,为了以后方便查阅,记录如下:转载 2012-02-16 15:11:22 · 675 阅读 · 0 评论 -
Linux设备驱动程序第三版学习(6)- 高级字符驱动程序操作(续1)- 进程休眠 .
第六章:高级字符驱动程序操作(续1) 以下是第2部分:掌握如何使进程休眠(并唤醒) 分为4个小的部分(都是通过分析源码的形式,必要时加以总结): 1、进程休眠的细节 2、进程唤醒的细节 3、scullpipe中read的实现 4、scullpipe中write的实现 1、 进程休眠的细节 Linux内核中最简单的休眠方式就是称为wait_event的宏(以及它的几个变种转载 2012-02-16 15:09:35 · 1099 阅读 · 0 评论 -
Linux设备驱动程序第三版学习(8)- 高级字符驱动程序操作(续3)- 异步通知 .
第六章:高级字符驱动程序操作(续3) 以下为第四部分:异步通知 使用poll轮询方式的时候,相当于应用程序在需要的时候询问设备“准备好了吗?”,如果有这样一种情况,一个进程在低优先级正在执行长的循环计算,但又需要“尽可能快”的处理输入数据,如果采用poll的方式,那么需要这个应用程序周期性的调用poll来检测数据,也就是周期性的询问设备“准备好了吗?” 显然这种情况下poll并不是最佳的方转载 2012-02-16 15:12:55 · 562 阅读 · 0 评论 -
Linux设备驱动程序第三版学习(4)- 并发和竟态
第五章学习:并发和竟态 其实可以拿上“公共厕所”来做一个比喻,就是那种在大街上只有一个隔间的小型公厕。更容易理解并发、竟态和信号量。 把“临界区”理解为“公共厕所”(临界区:在任意给定的时刻,代码只能被一个线程执行。/ 公共厕所:在任意给定的时刻,厕所只能被一个人使用。),“公共厕所”的来源是“并发”的(很多人可以一起去上厕所),假设A同学已经进去了,如果厕所什么标记都没有(没有信号量),那么转载 2012-02-16 15:04:56 · 671 阅读 · 0 评论 -
Linux设备驱动程序第三版学习(1)(2)-字符设备驱动程序源码分析
一、insmod模块时调用module_init(scull_init_module),就来看一下这个函数: int scull_init_module(void) 二、 [cpp] view plaincopyprint? int scull_init_module(void) { int result, i; //声明两个整形变量 result,i de转载 2012-02-16 14:57:31 · 861 阅读 · 0 评论 -
Linux设备驱动程序第三版学习(10)- 时间、延迟及延缓操作
接下来学习第七章:时间、延迟及延缓操作。本章主要学习了内核代码如何对时间问题进行处理。 关于Linux时钟处理机制的详细内容,参考本博客转载的“Linux 时钟处理机制”一文【赵 健博 (zhaojianbo@ncic.ac.cn), 硕士, 中国科学院计算技术研究所】 一、时间。 内核通过定时器中断来跟踪时间流。定时器中断是硬件产生的,是周期性的。不同的硬件平台的周期不一样,例如x86转载 2012-02-16 15:16:30 · 645 阅读 · 0 评论 -
Linux设备驱动程序第三版学习(9)- 高级字符驱动程序操作(续4) - llseek定位设备
第六章:高级字符驱动程序操作(续4) 以下为第五部分:定位设备 这部分相当简单,需要注意的是即使大多数设备进行定位操作没有意义,但是也不能步声明llseek操作,因为默认是允许定位的。而是应该在open中调用nonseekable_open,这样内核就不会让lseek调用成功。 下面是scull驱动的main.c中的llseek实现。 [cpp] view plaincop转载 2012-02-16 15:14:21 · 691 阅读 · 0 评论 -
Linux设备驱动程序第三版学习(5)- 高级字符驱动程序操作 - ioctl .
第六章:高级字符驱动程序操作 这章有以下几个部分主要内容: 1) 学习实现ioctl系统调用,它是用于设备控制的公共接口 2) 掌握如何使进程休眠(并唤醒) 3) poll/select 4) 异步通知 5) 定位设备 6) 设备文件的访问控制 以下为第1部分, ioctl的学习。 定义(摘自百度百科): ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。转载 2012-02-16 15:07:23 · 649 阅读 · 0 评论 -
Linux设备驱动程序第三版学习(3)- 调试
开始书中第四章的学习:调试技术。 主要有三种调试方式:打印、查询和监视。 一、说说打印方式: 1)主要使用printk这个内核方法来进行。 2)printk方法可以附加日志级别:KERN_EMERG、KERN_ALERT、KERN_CRIT、KERN_ERR、KERN_WARNINT、KERN_NOTICE、KERN_INFO、KERN_DEBUG。 默认的级别在我现在转载 2012-02-16 15:02:57 · 662 阅读 · 0 评论 -
Linux设备驱动程序第三版学习(12)- 与硬件通信
继续往下学习第九章的内容。从这一章开始才接触到了一些实际的硬件设备,硬件是我的强项啊,呵呵。加油! 一、I/O端口和I/O内存 在学习这部分之前,需要先明确一个概念:side effect。明确这个概念有助于理解内存操作和IO寄存器操作的不同。LDD3中将这个词翻译成了“边际效应”,对此我持保留意见,至少我当时学习的时候就被这个词搞得一头雾水(我本身是搞硬件的,自认为对寄存器还是很转载 2012-02-16 15:20:02 · 810 阅读 · 0 评论