设备驱动开发详解 读书笔记
文章平均质量分 65
yuweixian
好好学习
展开
-
参考10定时器 成功外部中断 IRQ_EINT1 没有底半部
api#include #include #include #include #include #include main(){ int fd; int counter = 0; int old_counter = 0; fd = open("/dev/irq", 0); if(fd0)printf("open api ok !!! /n"); while(1); close(fd); printf("cl原创 2010-07-03 13:13:00 · 556 阅读 · 0 评论 -
6--1 globalmem虚拟设备
<br />基于虚拟的globalmem 设备进行字符设备驱动的讲解。<br />globalmem 意味着‘全局内存’,在globalmem字符设备驱动中会分配一片大小为GLOBALMEM_SIZE(4KB)的内存空间,并在驱动中提供针对该片内存的读写,控制和定位函数,以供用户空间的进程能通过linux系统调用访问这片内存<br /> <br /> <br />学习本章了解的:<br /> struct globalmem_dev *globalmem_devp;<br />原创 2010-06-06 11:38:00 · 1305 阅读 · 1 评论 -
7--1linux设备驱动中的并发控制
信号量(semephore)是用于保护临界区的一种常用方法。他的使用方法与自旋锁类似。相同之处:只有得到信号量的进程才能进入执行临界区代码。不同之处:当获取不到信号量时,进程不会原地打转,而是进入 休眠 等待状态。获得信号量:int down_interruptible(struct semaphore *sem);该函数功能与down()类似,不同之处为,因为down()而进入睡眠状态的进程不能被信号打断,而因为down_interruptible()而进入睡眠状态的进程能被信号打断,信号也会导致该原创 2010-06-06 13:17:00 · 657 阅读 · 0 评论 -
9--2支持异步通知的globalfifo驱动
在设备驱动和应用程序的异步通知交互中,仅仅在应用程序端捕获信号时不够的,因为信号 没有的源头在设备驱动端。因此,应该在合适的时机让设备驱动释放信号,在设备驱动程序中增加信号释放的相关代码。原创 2010-06-07 20:21:00 · 649 阅读 · 0 评论 -
11--0外篇之 MMU内存管理单元
MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权。 许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还有用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个原创 2010-06-08 12:34:00 · 697 阅读 · 0 评论 -
8--4支持轮询操作的globalfifo驱动
<br />在用户程序中,selectI()和poll()也是与设备阻塞和非阻塞访问息息相关的论题。<br /> <br />使用非阻塞I/O的应用程序通常会使用select()和Poll()系统调用查询是否可对设备进行无阻塞的访问。<br />select()和Poll()系统调用最终引发设备驱动中的Poll()函数被执行<br />详细 见书本<br /> <br /> <br />需要 后台操作 ./pollmoniter &<br />然后 可以 输入<br />原创 2010-06-06 19:45:00 · 670 阅读 · 1 评论 -
9--1异步通知的概念和作用
<br />阻塞与非阻塞访问。Poll()函数提供了较好的解决设备访问的机制,但是如果有了异步通知整套机制,就更加完整了。<br />中断:<br /> 上半部:中断处理程序<br /> 下半部:软中断 tasklet 工作队列 workqueue<-work_struct<br />进程: runqueue 运行队列<br /> struct runqueue{<br /> 。。。。<br /> struct task_st原创 2010-06-07 16:43:00 · 919 阅读 · 0 评论 -
9--外篇--linux 头文件
<br /><!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;}转载 2010-06-07 16:44:00 · 447 阅读 · 0 评论 -
10--1 中断
<br />********************************************************<br />具体的内容 以后 在 加<br />********************************************************<br /> <br />下半部<br /> 软中断 tasklet 工作队列(workqueue)原创 2010-06-07 20:52:00 · 391 阅读 · 0 评论 -
10--2 内核定时器
内核定时器编程 软件意义上的定时器最终依赖硬件定时器来实现。内核在时钟中断发生后检测个各定时器是否到期,到期后的定时器处理函数将作为软中断在地半部执行。 在linux设备驱动编程中,可以利用linux内核中提供的一组函数和数据结构来完成定时出发工作或者完成某周期性的事务。 linux内核所提供的用于操作定时器的数据结构和函数如下: struct tiemr_list { struct list_head entry; //定时器列表 unsign原创 2010-06-07 21:33:00 · 489 阅读 · 0 评论 -
5--1 ioctl--幻数
<br />[转载]来源http://www.linuxeden.com/edu/doctext.php?docid=1860<br /><br />我这里说的ioctl函数是在驱动程序里的,因为我不知道还有没有别的场合用到了ioctl,<br />所以就规定了我们讨论的范围。为什么要写篇文章呢,是因为我前一阵子被ioctl给搞混<br />了,这几天才弄明白它,于是在这里清理一下头脑。 <br /><br />一、 什么是ioctl。 <br />ioctl是设备驱动程序中对设备的I/原创 2010-06-06 09:55:00 · 1002 阅读 · 0 评论 -
5——linux文件系统与设备文件系统
<br />文件系统的相关调用:<br /> int open(const char *pathname,int flags,mode_t mode)<br /> 路径名称,默认时认为在当前路径下面<br /> int read(int fd,const void *buf,size_t length)读取fd文件length个字节到所指的缓冲区buf中<br />原创 2010-06-06 08:51:00 · 425 阅读 · 0 评论 -
4_linux内核模块介绍
模块具有特点: 模块本身不被编译进入内核镜像(什么意思zImage内核镜像),从而控制了内核的大小。 模块一旦被加载,他就和内核中的其他部分完全一样。模块参数 module_param(参数名,参数类型,参数读/写权限) static char *book="深入浅出linux设备驱动"; static int num=4000; module_param(book,charp,S_IRUGO); module_param(num,int,S_IRUGO);/*========原创 2010-06-05 21:57:00 · 546 阅读 · 0 评论 -
总结----字符设备
<br />1.字符设备<br /> 1 申请设备号<br /> 2 分配内存<br /> 3 注册设备<br /> <br /> <br />2 并发、竞态 。。共享数据导致 并发、竞态<br /> 1 自旋锁 spin_lock_interruptible();<br /> spin_unlock_inter原创 2010-07-02 10:52:00 · 670 阅读 · 0 评论 -
参考 10定时器 成功外部中断 IRQ_EINT1 有底半部 workqueue
<br />api<br /> <br /> <br />#include <sys/types.h>#include <sys/stat.h>#include <stdio.h>#include <fcntl.h>#include <unistd.h>#include <sys/time.h> main(){ int fd; int counter = 0; int old_counter = 0; fd = open("/dev/irq", 0原创 2010-07-03 19:32:00 · 544 阅读 · 0 评论 -
参考 10定时器 成功外部中断 IRQ_EINT1 有底半部 workqueue 使用 copy_to_user()显示 中断次数 成功!
<br /> <br /> <br /> <br />api<br /> <br /> <br /> <br /> <br /> <br />#include <sys/types.h>#include <sys/stat.h>#include <stdio.h>#include <fcntl.h>#include <unistd.h>#include <sys/time.h> main(){ int fd; int counter = 0; int old_c原创 2010-07-03 20:15:00 · 642 阅读 · 0 评论 -
需要 好好了解下 应用程序 中 read write 函数的使用 有很多不明白?????
<br />需要 好好了解下 应用程序 中 read write 函数的使用 有很多不明白?????原创 2010-07-03 20:18:00 · 587 阅读 · 0 评论 -
内存与I/O访问
typedef void (*lpFunction) ();//定义一个无参数,无返回类型的函数指针类型//定义一个函数指针,指向cpu启动后所执行的第一条指令的位置lpFunction lpReset = (lpFunction)0xF000FFF0;lpReset();//调用函数 MMU停供虚拟地址和物理地址的映射、内存访问权限保护和Cache缓存控制等硬件支持。操作转载 2010-05-25 18:09:00 · 853 阅读 · 0 评论 -
第五章 开头。。。一切都是文件
<br />字符设备,块设备-----------一切都是文件原创 2010-06-05 22:23:00 · 496 阅读 · 0 评论 -
8--1阻塞 中断 进程
中断: 软中断 tasklet 工作队列work_queue 进程: runqueue 运行队列 { .......... task_struct *curr; 当前运行任务 task_struct *idle; 该处理器的空任务 ........... }并发 竞态: spinl原创 2010-06-06 14:38:00 · 660 阅读 · 0 评论 -
8--3疑问 echo 怎么样 系统调用write()函数???
echo 怎么样 系统调用write()函数??原创 2010-06-06 15:55:00 · 1994 阅读 · 0 评论 -
8--2支持阻塞操作的globalfifo设备驱动
<br />在用户空间验证 globalfifo的读写:<br /> <br />编译 globalfifo.c并insmod模块即创建设备文件节点'/dev/globalfifo'后,启动两个进程,一个进程"cat /dev/globalfifo&",在后台执行<br />另一个进程echo 字符串 >/dev/globalfifo"在前台执行 如果想从后台到前台 执行 fg <br /> <br />1.当执行 cat /dev/globalfifo 时,没有后台操作,光标会在等待,进程进入睡眠。。原创 2010-06-06 16:10:00 · 1418 阅读 · 0 评论 -
10--4 内核延时
<br />linux内核提供了如下三种函数分别进行 纳米 微秒 毫秒 的延时<br />void ndelay(unsigned long nsecs);<br />void udelay(unsigned long usecs);<br />void mdelay(unsigned long msecs);<br /> <br />本质 是 忙等待 他根据cpu频率进行一定次数的循环 有时候 可以用如下的代码<br /> void delay(unsigned int time)<br />{原创 2010-06-07 22:15:00 · 442 阅读 · 0 评论