【转】linux驱动开发
转自:http://www.cnblogs.com/heat-man/articles/4174899.html
首先理一理驱动/内核/应用程序的一些概念,以前总没有具体的去关注过!
我们的pc直观来看就是一堆电子元器件,怎么样让这堆元器件工作起来呢?当然就需要我们的驱动程序。
linux上的驱动程序实质上和我们当年的51单片机点亮led是一样一样的。pc上每个设备都是有自己的驱动的,包括鼠标/键盘和显卡。
既然电脑上有这么多组件和每个组件的驱动,那工作的时候还不打架,你的担心灰常正确,有个人解决了这个问题,然后他就成为了比尔盖茨。
还有个人以一种无私的方式解决了这个问题,他就是林那厮.图娃子。正是比尔先生的windows操作系统才让使得让大家像傻瓜一样去用电脑,然而正是这种便捷,让大家都忽视了每日都在使用的操作系统。操作系统使用灰常简单,这都都因为大神级的程序员啊!所以今天便捷的互联网社会源自千百万个程序员夜以继日的玩命啊!
好吧!我们回到正题,其实上面含沙射影也说了,我们可以形象描述为操作系统=所有驱动+系统的管理。这系统的管理包括不同模块间的工作协调以及各种调度一样,就像 一个马路中间的交警。而我们一般认为所有驱动程序的总和就是系统的内核。
在linux系统下,系统内核分为三种类型,字符设备/块设备/网络设备。块设备一般用于像U盘,光盘这些存储设备,我们可以成块成块的去忘这些设备中投放数据,也可以访问固定块的数据,这就是我们形象的块设备。至于字符设备,和块设备刚好相反,就是它的输入量一般是不确定的,比如串口。就是他什么时候有数据或者数据量都是不确定了,当然我们也不能随意去访问它的数据。
我一直觉得,计算机这玩意要想学的快,必须马上做。当遇到问题时,要马上看书,既要理论结合实际。有个很明显的感觉,上学那会老师课堂讲的总不知道要干啥?比如数电什么的?现在要来做东西,全都用上了,而且知道怎么回事了。
对了,还有一个应用程序,应用程序就不多说了,你在快播上看爱情电影时,便是一个很好的用应用程序的例子。
在pc系统中,我们的应用程序和系统程序(内核)是不在一个空间的,也就是说他们是存在鸿沟的。就是你应用程序和内核之间不是互联互通的,中间需要一个保护的屏障,内核只向外提供接口,应用程序通过操作系统访问内核接口。这样防止小白们因无知而搞坏了系统。
这就在另一个方面说明了,驱动工程师压力山大啊!驱动工程师可是直接编写内核的人啊!应用软件工程师程序写坏了是一个程序的问题,驱动工程师一个模块驱动写坏了,系统可能就会受到影响,因此一个好的系统工程师必须是个细腻的男淫!
又罗嗦了这么多,赶紧我们的hello,word!这里我们采用模块的方式,让后动态加进内核!
补充一点,我们写驱动的目的,最终都是要加进内核的。有两种方式加进内核,一种是直接编译进内核。
另一种就是这里的动态加入内核的。一般建议在驱动程序开发阶段要采用动态加载。
关于驱动的写法我们就直接看代码吧!
//hello.c
//auther:heat nan
//programe:char driver-hello world
#include <linux/init.h>
#include
<linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
//内核2.6以上版本建议我们加上这个license
static int
hello_init(void) //驱动入口
{
printk(KERN_ALERT
"Hello, world\n");
return 0;
}
static void
hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel
world\n");
}
module_init(hello_init);
module_exit(hello_exit);
好了不多说了,这个代码常见的就是两份,一个是某开发板上带的,一个是LDD那本书上第二章的。
我真不知道这样复制来粘贴去真的好嘛?我真的为国人的创新而感到一丝丝担忧!就不会把printk里面的字符给改了吗?
好了,那我们就不多说了,入乡随俗吧!直接贴出某开发板的代码!
某些人可能会纠结这个文件该建在哪里,我刚开始也有小疑问,后来就哪里顺眼放哪里!可以单独建立一个文件,放在里面。
接下来我们的驱动程序就写完啦!没错真的写完啦,下面咱们编译。这里采用直接暴力的makefile的方法。
Makefile 文件:
obj-m:=heatnan.o
KERNELDIR:=/lib/modules/3.13.0-43-generic/build
//现在才知道学英文干什么,kerneldir
PWD:=$(shell
pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD)
modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD)
modules_install
下面来看看这个makefile文件,obj-m这句主要是说要编译成模块。
kerneldir这个说的很明白了,就是你内核头文件所在,因为我们的模块中使用了内核相关的函数,比如
输出函数。所以我们要编译这个驱动需要指定这个内核头文件所在位置。一般在lib/modules目录下,如果没有的话需要下载内核的。
关于下面的解释也都是一些程式的东西,这都是系统设计者为系统的可扩展所做出的一些工作。关于详细的解释。
详见
http://www.embedu.org/Column/Column310.htm
好上面,工作做完后,轻点一下make。结果就出来了后缀诸如.ko.o的文件,这就证明成功了。
下面用insmod指令来动态的加载驱动程序,这个时候务必要切换到root权限。
加载之后发现木有反应,是不是有一点丹丹的忧桑。
不过不要担心,问题还是可以解决的,printk是内核级别的函数,查看需要输出:dmesg |
tail
同时,也可以用lsmod列举当下的正在进行的modules。
helloword到这里就结束了,虽然还没碰到驱动开发的肉肉,但是还是远远看清楚了它的模样!
【转】linux驱动开发的更多相关文章
- 嵌入式Linux驱动开发日记
嵌入式Linux驱动开发日记 主机硬件环境 开发机:虚拟机Ubuntu12.04 内存: 1G 硬盘:80GB 目标板硬件环境 CPU: SP5V210 (开发板:QT210) SDRAM: 512M ...
- 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)
这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...
- 【转】linux驱动开发的经典书籍
原文网址:http://www.cnblogs.com/xmphoenix/archive/2012/03/27/2420044.html Linux驱动学习的最大困惑在于书籍的缺乏,市面上最常见的书 ...
- Linux驱动开发 -- 打开dev_dbg()
Linux驱动开发 -- 打开dev_dbg() -- :: 分类: LINUX linux设备驱动调试,我们在内核中看到内核使用dev_dbg来控制输出信息,这个函数的实质是调用printk(KER ...
- Linux驱动开发学习的一些必要步骤
1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, ...
- 驱动编程思想之初体验 --------------- 嵌入式linux驱动开发之点亮LED
这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...
- Linux 驱动开发
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...
- Linux驱动开发必看详解神秘内核(完全转载)
Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入L ...
- Linux内核(17) - 高效学习Linux驱动开发
这本<Linux内核修炼之道>已经开卖(网上的链接为: 卓越.当当.china-pub ),虽然是严肃文学,但为了保证流畅性,大部分文字我还都是斟词灼句,反复的念几遍才写上去的,尽量考虑到 ...
- s3c6410 Linux 驱动开发环境搭建
s3c6410 Linux 驱动开发环境搭建 -- 既然你是做Linux开发的,你还用虚拟机? 非常多人都在win下做开发,于是SD_writer.exe之类的烧写工具"大行其道" ...
随机推荐
- 001windows已遇到一个关键性问题 一分钟后自动重启
重装了系统Window7,出现了如题的提示"windows已遇到一个关键性问题 一分钟后自动重启" 查找原因: 通过事件管理器可以查看如上提示遇到的问题.一般是因为一些系统的服务没 ...
- 一些常用的html css整理--文本长度截取
div+css设置列表div超出部分显示...(单行文本) width:200px; //指定宽度: overflow:hidden; //将超出内容隐藏 text-overflow:ellipsis ...
- 12个十分实用的JavaScript小技巧
12个非常实用的JavaScript小技巧 在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操作符转换布尔值 有时候 ...
- PHPthinking邀请您一起赚Money
原文地址:http://bbs.phpthinking.com/thread-790-1-1.html 为了让大家工作或者学习之余.可以赚些money,PHPthinking为大家推荐一个赚钱的站点! ...
- ios 蓝牙相关
ios蓝牙开发项目实战 -(附小米手环实例) 前言 最近一直在开发关于蓝牙的功能,本来是不想写这一篇文章,因为网上关于ios蓝牙开发的文章实在太多了,成吨成吨的文章出现,但是很遗憾都只是一些皮 ...
- 47、ListView setSelection() 和 setSelectionFromTop()
http://blog.csdn.net/manoel/article/details/39183025 http://blog.csdn.net/a859522265/article/details ...
- Coursera课程《Machine Learning》学习笔记(week1)
这是Coursera上比较火的一门机器学习课程,主讲教师为Andrew Ng.在自己看神经网络的过程中也的确发现自己有基础不牢.一些基本概念没搞清楚的问题,因此想借这门课程来个查漏补缺.目前的计划是先 ...
- 郭大侠与Rabi-Ribi (优先队列)
最近郭大侠迷上了玩Rabi-Ribi这个游戏. Rabi-Ribi呢,是一个打兔子的动作冒险游戏,萌萌哒的兔子在地上跑来跑去,好萌好萌呀~ 这个游戏是这样玩的,郭大侠作为一个主角,拿着一个小锤子,他的 ...
- linux 终端操作快捷键
熟练使用快捷键可以很大的提高效率,以下列出一些常用的快捷键命令方便随时查阅 1. 移动光标 Ctrl + a 标移到行首.它在多数文本编辑器和 Mozilla 的 URL 字段内可以使用.Ctrl + ...
- MySQL 的约束
约束是添加在列上, 用来约束列的! 1. 主键约束(表中的某行的唯一标识) 主键的特点: 非空 唯一 被引用 创建表时, 指定主键的两种方式: // 需求: 指定 sid 列为主键列, 即为 sid ...