小白的linux字符驱动程序

关于如何编译一个测试型的字符驱动程序,网上一搜还是很多的在此给出一个不错的教程http://blog.chinaunix.net/uid-11829250-id-337300.html

我主要是在搜索ioctl的时候才有自己编写一个字符驱动的想法,因为刚工作的时候就看到有同事在用ioctl,当时在网上搜了下ioctl也没怎么明白。现在才发现原来ioctl就是对应的设备驱动程序里的ioctl函数。好了,废话就不多说了。写这篇文档的主要意义在于给后来编写驱动程序的新手们提示几个可能会遇到的问题,希望能对大家有所帮助,前车之鉴后车之师吧。

问题1:按照上面的教程码完了,编译提示头文件都找不到,什么鬼!

解答:

刚开始还以为是头文件包含路径不对,于是修改成绝对路径貌似还是没有解决。

 查看gcc/g++默认include路径的方法为:`gcc -print-prog-name=cc1plus` -v

后来发现原来编译驱动程序最好参考其他驱动模块的Makefile文件,复制过来修改一下即可解决此问题。

问题2:按照1的解答修改好了,不过执行make的时候提示错误,错误原因是没有生成makefile的规则

解答:

刚开始以为必须在linux源代码里的drivers文件夹下编写,心想这也太不人性化了吧,后来才发现原来驱动程序对应的makefile文件名字必须是"Makefile",修改下名字即可编译通过了。

最后想强调一下教程作者说的最后一段关于makefile的描述:自己编写的Makefile被调用两次,第一次调用的时候走的是else分支,找到linux/目录下的Makefile文件并执行modules规则,在此过程中会生成.o文件。由于指定了M选项所以中途会返回M所指定的路径查找并执行Makefile中的if分支。即两次进入自己编写的Makefile文件。

时间: 2024-10-10 07:51:32

小白的linux字符驱动程序的相关文章

Linux 字符驱动程序(一)

Linux 字符驱动程序(一) 在linux内核中设备主要有三种: 1 字符设备: ?字符设备的读写以字节为单位,存取时没有缓存. ?对字符设备发出读写请求时,实际的硬件I/O紧接着就发生了.一般来说,字符设备不支持随机访问. ?典型的字符设备包括鼠标.键盘及串行口等. 2 块设备: ?块设备读写以块为单位,典型的块大小为512或1024字节. ?利用一块系统内存作为缓冲区,当用户进程对设备发出读写请求时,驱动程序先察看缓冲区中的内容,若缓冲区中的数据能满足用户的要求就返回相应的数据,否则就调用

20150216简单的Linux字符设备驱动程序

20150216简单的Linux字符设备驱动程序 2015-02-16 李海沿 关于字符设备驱动程序详细的知识点,本文就不再介绍了,很多同志,看了知识点,还是一头雾水,写不出来,所以,本文从实战出发,带领各位同胞们来实现一个字符设备驱动程序,改程序可作为字符设备的通用模板. 好了废话不多说,先上驱动程序,在驱动程序中加入详细注释: 1 /****************************** 2 linux 字符设备驱动程序 3 *****************************/

LINUX设备驱动程序笔记(三)字符设备驱动程序

      <一>.主设备号和次设备号        对字符设备的访问时通过文件系统内的设备名称进行的.那些设备名称简单称之为文件系统树的节点,它们通常位于/dev目录.字符设备驱动程序的设备文件可通过ls -l命令输出的第一列中的'c'来识别.块设备同样位于/dev下,由字符'b'标识 crw-rw----  1 root root    253,   0 2013-09-11 20:33 usbmon0 crw-rw----  1 root root    253,   1 2013-09

Linux 设备驱动程序 字符设备

已经无法再精简,适合入门. 1 #include<linux/module.h> 2 #include<linux/init.h> 3 4 #include<asm/uaccess.h> 5 #include <linux/types.h> 6 #include<linux/fs.h> 7 #include<linux/cdev.h> 8 struct mengc_dev{ 9 char data[64]; 10 struct cde

linux字符设备驱动程序框架

#include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/fs.h> #include <linux/delay.h> #include <asm/uaccess.h> #include <asm/irq.h> #include <asm/io.h> #include <asm/a

linux字符设备驱动程序框架(老方法)

#include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/fs.h> #include <linux/delay.h> #include <asm/uaccess.h> #include <asm/irq.h> #include <asm/io.h> #include <asm/a

浅析Linux字符设备驱动程序内核机制

前段时间在学习linux设备驱动的时候,看了陈学松著的<深入Linux设备驱动程序内核机制>一书. 说实话.这是一本非常好的书,作者不但给出了在设备驱动程序开发过程中的所须要的知识点(如对应的函数和数据结构),还深入到linux内核里去分析了这些函数或数据结构的原理.对设备驱动开发的整个过程和原理都分析的非常到位.但可能是因为知识点太多.原理也比較深的原因,这本书在知识点的排版上跨度有些大.所以读起来显得有点吃力,可是假设第一遍看的比較认真的话,再回头看第二次就真的可以非常好地理解作者的写作思

linux字符设备驱动程序源码分析

本文主要分析linux-2.6.28内核版本的字符设备抽象层源码文件char_dev.c.该文件代码量不大,但其为linux应用程序访问实际字符型硬件设备搭建了桥梁,进一步限定了linux字符设备驱动的设计框架. void __init chrdev_init(void) {  cdev_map = kobj_map_init(base_probe, &chrdevs_lock);  bdi_init(&directly_mappable_cdev_bdi); } 该函数在系统初始化启动时

linux字符设备驱动

一.字符设备.字符设备驱动与用户空间访问该设备的程序三者之间的关系. 如图,在Linux内核中使用cdev结构体来描述字符设备,通过其成员dev_t来定义设备号(分为主.次设备号)以确定字符设备的唯一性.通过其成员file_operations来定义字符设备驱动提供给VFS的接口函数,如常见的open().read().write()等. 在Linux字符设备驱动中,模块加载函数通过register_chrdev_region( ) 或alloc_chrdev_region( )来静态或者动态获