Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9020
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-27 16:50
文章分类
文章存档

2015年(4)

我的朋友

分类: LINUX

2015-04-27 17:06:07

设备驱动程序简介

操控硬件,是应用程序和硬件设备之间的一个接口
    >隐藏硬件细节,提高应用软件的可移植性

提供机制,而不是提供策略
    >机制:驱动程序能实现什么功能
    >策略:用户如何使用这些功能

字符设备的特点:

    >像字节流一样来存取的设备,如同文件,对它的读写是以字节为单位的,比如串口在进行收发数据时就是一个字节一个字节进行
    >通常至少需要实现open,close,read和write等系统调用
    >应用程序可以通过/dev下的文件系统节点来访问字符设备
    >比如 :/dev/led /dev/ttySAC0
    >只能顺序访问的数据通道,不能前后移动访问指针
    >特例:比如framebuffer设备就是这样的设备,应用程序可以使用mmap或lseek访问图像的各个区域

块设备的特点:
    >块设备上的数据以块的形式存放,比如Nand Flash上的数据就是以页为单位存放的
    >块设备驱动程序向用户层提供的接口与字符设备一样,应用程序也可以通过对应得设备文件来调用open,close,read,write等系统调用,与块设备传送任意字节的数据,比如/dev/mtdblock0
    >快设备和字符设备的区别仅仅在于内核内部管理数据的方式
    >以块为单位实现数据的读写
    >块设备按照一定的格式存放数据,不同的文件系统类型就是用来定义这些格式的
    >块设备驱动程序必须向内核的文件系统提供专门的接口,而这些接口使得在块设备上存放文件系统,挂载块设备

网络设备的特点:
    >特殊的一类设备,传输的数据是有结构的、成块的报文、包、帧,但是块的大小又不是固定的
    >任何一个网络事物都通过一个网络接口,即一个能够和其他主机交换数据的设备
    >一个网络接口负责发送和接收数据报文
    >内核调用一套和数据包传输相关的函数与网络设备交互

驱动程序加入内核的方法:
    >把所有的功能都编译到内核中
    >模块机制

Linux提供了被称为模块的机制,包括但不限于设备驱动
    >insmod动态加载模块
    >rmmod卸载模块
    >lsmod查看内核中已装载的模块

Linux内核模块的程序结构
    >module_init()模块加载函数,必须存在
    >module_exit()模块卸载函数,必须存在
    >module_param()添加参数

>内核支持的模块参数类型包括byte/short/int/long/charp
>参数数组module_param_array(数组名,数组类型,数组长,参数读/写权限)

装载模块时改变参数:
    >insmod hello_ext.ko howmany=5 whom=”abc”
    >modprobe也可以从它的配置文件(etc/modprobe.conf)读取参数的值

模块导出符号:
    >EXPORT_SYMBOL(name)
    >EXPORT_SYMBOL_GPL(name)

内核符号表:/proc/kallsyms 记录内核模块中导出符号及所在的内核地址

模块声明与描述:
    MODULE_AUTHOR(author);—声明模块的作者
    MODULE_DESCRIPTION(description);—声明模块的描述
    MODULE_VERSION(version_string):—声明模块的版本
    MODULE_ALIAS(alternate_name);—声明模块的别名



码字很辛苦,转载请注明来自陈浩的ChinaUnix博客
阅读(318) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有return关键字的main()函数返回值

给主人留下些什么吧!~~