什么是linux 平台驱动开发

作者&投稿:父君 (若有异议请与网页底部的电邮联系)
linux 驱动开发 是干什么的~

介绍本书给你看
一本超越谭浩强、K&R的C语言编程著作《 Linux C编程一站式学习》

本书有以下特点:
• 不是孤立地讲C语言,而是和编译原理、操作系统、计算机体系结构结合起来讲。或者说,本书的内容只是以C语言为载体,真正讲的是计算机的原理和程序的原理。
• 强调基本概念和基本原理,在编排顺序上非常重视概念之间的依赖关系,每次引入一个新的概念,只依赖于前面章节已经讲过的概念,而绝不会依赖后面章节要讲的概念。有些地方为了叙述得完整,也会引用后面要讲的内容,比如说“有关XX我们到XX章再仔细讲解”,凡是这种引用都不是必要的依赖,可以当它不存在,只管继续往下看就行了。
• 尽量做到每个知识点直到要用的时候才引入。过早引入一个知识点,讲完了又不用它,读者很快就会遗忘,这是不符合认知规律的。

驱动一般是指硬件驱动,当然也有数据库驱动程序。
至于为什么要在Linux下开发,主要是为了在Linux下使用测试。
驱动程序就是Linux内核的一个重要组成部分。

在学习之前一直对驱动开发非常的陌生,感觉有点神秘。不知道驱动开发和普通的程序开发究竟有什么不同;它的基本框架又是什么样的;他的开发环境有什么特殊的地方;以及怎么写编写一个简单的字符设备驱动前编译加载,下面我就对这些问题一个一个的介绍。
一、驱动的基本框架
1. 那么究竟什么是驱动程序,它有什么用呢:
l 驱动是硬件设备与应用程序之间的一个中间软件层
l 它使得某个特定硬件能够响应一个定义良好的内部编程接口,同时完全隐蔽了设备的工作细节
l 用户通过一组与具体设备无关的标准化的调用来完成相应的操作
l 驱动程序的任务就是把这些标准化的系统调用映射到具体设备对于实际硬件的特定操作上
l 驱动程序是内核的一部分,可以使用中断、DMA等操作
l 驱动程序在用户态和内核态之间传递数据
2. Linux驱动的基本框架

3. Linux下设备驱动程序的一般可以分为以下三类
1) 字符设备
a) 所有能够象字节流一样访问的设备都通过字符设备来实现
b) 它们被映射为文件系统中的节点,通常在/dev/目录下面
c) 一般要包含open read write close等系统调用的实现
2) 块设备
d) 通常是指诸如磁盘、内存、Flash等可以容纳文件系统的存储设备。
e) 块设备也是通过文件系统来访问,与字符设备的区别是:内核管理数据的方式不同
f) 它允许象字符设备一样以字节流的方式来访问,也可一次传递任意多的字节。
3) 网络接口设备
g) 通常它指的是硬件设备,但有时也可能是一个软件设备(如回环接口loopback),它们由内核中网络子系统驱动,负责发送和接收数据包。
h) 它们的数据传送往往不是面向流的,因此很难将它们映射到一个文件系统的节点上。

二、怎么搭建一个驱动的开发环境
因为驱动是要编译进内核,在启动内核时就会驱动此硬件设备;或者编译生成一个.o文件, 当应用程序需要时再动态加载进内核空间运行。因此编译任何一个驱动程序都要链接到内核的源码树。所以搭建环境的第一步当然是建内核源码树
1. 怎么建内核源码树
a) 首先看你的系统有没有源码树,在你的/lib/ modules目录下会有内核信息,比如我当前的系统里有两个版本:
#ls /lib/ modules
2.6.15-rc7 2.6.21-1.3194.fc7
查看其源码位置:
## ll /lib/modules/2.6.15-rc7/build
lrwxrwxrwx 1 root root 27 2008-04-28 19:19 /lib/modules/2.6.15-rc7/build -> /root/xkli/linux-2.6.15-rc7
发现build是一个链接文件,其所对应的目录就是源码树的目录。但现在这里目标目录已经是无效的了。所以得自己重新下载
b)下载并编译源码树
有很多网站上可以下载,但官方网址是:
http://www.kernel.org/pub/linux/kernel/v2.6/
下载完后当然就是解压编译了
# tar –xzvf linux-2.6.16.54.tar.gz
#cd linux-2.6.16.54
## make menuconfig (配置内核各选项,如果没有配置就无法下一步编译,这里可以不要改任何东西)
#make

如果编译没有出错。那么恭喜你。你的开发环境已经搭建好了
三、了解驱动的基本知识
1. 设备号
1) 什么是设备号呢?我们进系统根据现有的设备来讲解就清楚了:
#ls -l /dev/
crwxrwxrwx 1 root root 1, 3 2009-05-11 16:36 null
crw------- 1 root root 4, 0 2009-05-11 16:35 systty
crw-rw-rw- 1 root tty 5, 0 2009-05-11 16:36 tty
crw-rw---- 1 root tty 4, 0 2009-05-11 16:35 tty0
在日期前面的两个数(如第一列就是1,3)就是表示的设备号,第一个是主设备号,第二个是从设备号
2) 设备号有什么用呢?
l 传统上, 主编号标识设备相连的驱动. 例如, /dev/null 和 /dev/zero 都由驱动 1 来管理, 而虚拟控制台和串口终端都由驱动 4 管理
l 次编号被内核用来决定引用哪个设备. 依据你的驱动是如何编写的自己区别
3) 设备号结构类型以及申请方式
l 在内核中, dev_t 类型(在 中定义)用来持有设备编号, 对于 2.6.0 内核, dev_t 是 32 位的量, 12 位用作主编号, 20 位用作次编号.
l 能获得一个 dev_t 的主或者次编号方式:
MAJOR(dev_t dev); //主要

MINOR(dev_t dev);//次要
l 但是如果你有主次编号, 需要将其转换为一个 dev_t, 使用: MKDEV(int major, int minor);
4) 怎么在程序中分配和释放设备号
在建立一个字符驱动时需要做的第一件事是获取一个或多个设备编号来使用. 可以达到此功能的函数有两个:
l 一个是你自己事先知道设备号的
register_chrdev_region, 在 中声明:
int register_chrdev_region(dev_t first, unsigned int count, char *name);
first 是你要分配的起始设备编号. first 的次编号部分常常是 0,count 是你请求的连续设备编号的总数. name 是应当连接到这个编号范围的设备的名子; 它会出现在 /proc/devices 和 sysfs 中.
l 第二个是动态动态分配设备编号
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);
使用这个函数, dev 是一个只输出的参数, 它在函数成功完成时持有你的分配范围的第一个数. fisetminor 应当是请求的第一个要用的次编号; 它常常是 0. count 和 name 参数如同给 request_chrdev_region 的一样.
5) 设备编号的释放使用
不管你是采用哪些方式分配的设备号。使用之后肯定是要释放的,其方式如下:
void unregister_chrdev_region(dev_t first, unsigned int count);
6)
2. 驱动程序的二个最重要数据结构
1) file_operation
倒如字符设备scull的一般定义如下:
struct file_operations scull_fops = {
.owner = THIS_MODULE,
.llseek = scull_llseek,
.read = scull_read,
.write = scull_write,
.ioctl = scull_ioctl,
.open = scull_open,
.release = scull_release,
};

file_operation也称为设备驱动程序接口
定义在 , 是一个函数指针的集合. 每个打开文件(内部用一个 file 结构来代表)与它自身的函数集合相关连( 通过包含一个称为 f_op 的成员, 它指向一个 file_operations 结构). 这些操作大部分负责实现系统调用, 因此, 命名为 open, read, 等等
2) File
定义位于include/fs.h
struct file结构与驱动相关的成员
l mode_t f_mode 标识文件的读写权限
l loff_t f_pos 当前读写位置
l unsigned int_f_flag 文件标志,主要进行阻塞/非阻塞型操作时检查
l struct file_operation * f_op 文件操作的结构指针
l void * private_data 驱动程序一般将它指向已经分配的数据
l struct dentry* f_dentry 文件对应的目录项结构
3. 字符设备注册
1) 内核在内部使用类型 struct cdev 的结构来代表字符设备. 在内核调用你的设备操作前, 必须编写分配并注册一个或几个这些结构. 有 2 种方法来分配和初始化一个这些结构.
l 如果你想在运行时获得一个独立的 cdev 结构,可以这样使用:
struct cdev *my_cdev = cdev_alloc();
my_cdev->ops = &my_fops;
l 如果想将 cdev 结构嵌入一个你自己的设备特定的结构; 你应当初始化你已经分配的结构, 使用:
void cdev_init(struct cdev *cdev, struct file_operations *fops);

2) 一旦 cdev 结构建立, 最后的步骤是把它告诉内核, 调用:
int cdev_add(struct cdev *dev, dev_t num, unsigned int count);
说明:dev 是 cdev 结构, num 是这个设备响应的第一个设备号, count 是应当关联到设备的设备号的数目. 常常 count 是 1, 但是有多个设备号对应于一个特定的设备的情形.
3) 为从系统去除一个字符设备, 调用:
void cdev_del(struct cdev *dev);
4. open 和 release

17 Linux字符设备驱动概述




运城市18237842086: Linux底层软件开发是指什么开发? -
望杜扶正: 一般是指驱动开发,驱动开发又分网络/字符/块设备3块 驱动对内核层的要求比较高....所以难度比较大 当然待遇非常好..linux的驱动开发一般是对于linux-2.6.xx下drivers目录中相近文件或者设备的改写...如果会自己开发,,那就是牛人了

运城市18237842086: linux 驱动开发 是干什么的 -
望杜扶正: 介绍本书给你看 一本超越谭浩强、K&R的C语言编程著作《 Linux C编程一站式学习》本书有以下特点: • 不是孤立地讲C语言,而是和编译原理、操作系统、计算机体系结构结合起来讲.或者说,本书的内容只是以C语言为载体,真正讲的是...

运城市18237842086: Linux软件开发,这个说法具体是什么意思? -
望杜扶正: 狭义上说是在linux操作系统下开发应用程序.广义上来说,很多系统使用的是linux内核,如android等等,也可以看成基于linux内核的开发.

运城市18237842086: 什么是linux下的C语言驱动开发? -
望杜扶正: 你想想, 你的操作系统用的是linux, 理所当然, 驱动程序就应该开发适合linux操作系统的了, 你第一个问题就解决了.第二个嘛, 也很简单, 你想想, 电脑是如何识别硬件的, 是通过操作系统, 也就是linux, 操作系统调用linux内核程序, 然后内核找到相应的硬件设备并对其进行操作, 简单的来说, linux内核相当于操作系统与硬件设备的一个接口.

运城市18237842086: Linux驱动开发与Linux嵌入式开发有哪些相同点和不同点?两者都要学的基础知识有哪些? -
望杜扶正: Linux嵌入式开发包括了Linux驱动开发.Linux嵌入式开发,包括了从应用层到底层驱动等等,驱动开发就属于底层开发.都要学的基础知识,就是C语言,Linux,还有各种计算机原理那块的知识.

运城市18237842086: linux开发工程师开发什么的 -
望杜扶正: 1.开发LINUX本身,以及LINUX下的设备驱动.比如大家现在用的手机,很多linux的或者是LINUX变种的系统,都需要编写驱动.2.LINUX下的应用程序.LINUX下用的各种程序,和WINDOWS一样,比如OPEN OFFICE和MS OFFICE一样,用来...

运城市18237842086: 如何学习linux驱动开发 -
望杜扶正: 展开全部1. 那么究竟什么是驱动程序,它有什么用呢:l 驱动是硬件设备与应用程序之间的一个中间软件层 l 它使得某个特定硬件能够响应一个定义良好的内部编程接口,同时完全隐蔽了设备的工作细节 l 用户通过一组与具体设备无关的标准化的...

运城市18237842086: linux驱动开发1之什么是驱动 -
望杜扶正: 准确来说,驱动是针对于硬件设备的,比如:一个键盘,插到电脑上,那么电脑是如何使用键盘的呢,它们两者之间是如何相互交互的呢.这个过程是需要驱动程序来实现的.键盘插入电脑,引发一个中断,然后中断程序会检查设备,并将一个...

运城市18237842086: linux驱动是自己开发还是内核里有 -
望杜扶正: 首先,要理解操作系统的概念,操作系统是用户和硬件之间的一层媒介程序.不管是Linux还是Windows或者安卓、IOS,它的主要功能有两点: 1、有效管理硬件. 2、方便用户操作. 其次,Linux内核是Linux系统的核心程序,主要完成任务调度、内存管理...

运城市18237842086: Linux/Unix开发 -
望杜扶正: 总的来说可以分为三类:第一类:Linux/Unix操作系统的裁减与移植,或者根据Linux/Unix自己设计一个特殊的操作系统.第二类:Linux/Unix底层驱动程序的开发(网卡驱动,USB驱动,PCI驱动,块设备驱动等,很多驱动程序) 第三类:那就是基于Linux/Unix平台的各种应用程序的开发(像什么服务器啊,数据库啊,图形界面等很多,你可以充分发挥你的想象)

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网