Linux 驱动总结

来源:互联网 发布:防屏蔽软件 编辑:程序博客网 时间:2024/06/07 00:32
【驱动的定义】
对设备驱动最通俗的解释就是“驱使硬件设备行动”。设备驱动与底层硬件直接打交道,按照硬件设备的具体工作方式读写设备寄存器,完成设备的轮询、中断处理、DMA 通信,进行物理内存向虚拟内存的映射,最终使通信设备能够收发数据,使显示设备能够显示文字和画面,使存储设备能够记录文件和数据。

BTW:驱动程序沟通着硬件和应用软件,而驱动工程师则沟通着硬件工程师和应用软件工程师。

【存储设备】
存储器可分为只读储存器(ROM)、闪存(Flash)、随机存取存储器(RAM)、光介质存储器和磁介质存储器
ROM还可再细分为不可编程ROM、可编程ROM(PROM)、可擦除可编程ROM(EPROM)和电可擦除可编程ROM(E2PROM),E2PROM 完全可以用软件来擦写,已经非常方便

目前ROM 有被Flash 替代的趋势,NOR(或非)和NAND(与非)是市场上两种主要的Flash闪存技术。
  • NOR Flash的特点是可芯片内执行(XIP,eXecute In Place),程序可以直接在NOR内运行。
  • NAND Flash与NOR Flash相比容量大、价格低;NAND Flash中每个块的最大擦写次数是100 万次,而NOR的擦写次数是10万次;NAND Flash的擦除、编程速度远超过NOR Flash。
NOR Flash和CPU的接口属于典型的类SRAM接口(如图2.5 所示),不需要增加额外的控制电路。所以可以片内执行。
公共闪存接口(Common Flash Interface,简称CFI)是一个公开的、标准的从NOR Flash器件中读取数据的接口。
IDE(Integrated Drive Electronics)接口
人们通常也把IDE 接口称为ATA(Advanced Technology Attachment)接口,技术角度而言并不准确。其实,ATA接口发展至今,已经经历了ATA-1(IDE)、ATA-2(EIDE Enhanced IDE/Fast ATA)、ATA-3(FastATA-2)、Ultra ATA、Ultra ATA/33、Ultra ATA/66、Ultra ATA/100 及Serial ATA 的发展过程。

inux Kernel 3.0经过了七个RC候选版才推出正式版本,上一个版本是5月19日的2.6.39,也是2.6系列的第39次升级维护。从版本号来讲,Linux Kernel 3.0本应该命名为2.6.40更合适。
linux 2.6版本的新特性,相比linux2.4
1.新的调度器:Linux内核使用了新的进程调度算法,它在高负载的情况下执行得极其出色。
2 .  内核抢占
3.   文件系统:增加对日志文件的支持,并支持扩展文件系统ext2,3,4
4.   音频:新的Linux音频体系结构ALSA(Advanced Linux SoundArchitecture)取代了缺陷很多的旧的OSS(Open Sound System)。新的声音体系结构支持USB音频和MIDI设备,并支持全双工重放等功能。
5.  总线:Linux 内核可以直接通过IDE驱动程序来支持IDE CD/RW设备。
6.  电源管理:支持 ACPI(高级电源配置管理界面,Advanced Configuration and Power Interface),
用于调整CPU在不同的负载下工作于不同的时钟频率以降低功耗。
7. 联网和IPSec:2.6 版本的Linux内核中加入了对IPSec的支持,加入对新的NFSv4(网络文件系统)客户机/服务器的支持,并改进了对IPv6 的支持。

Linux内核主要由进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)和进程间通信(IPC)等5 个子系统组成。

【模块加载命令】
modprobe命令比insmod命令要强大,它在加载某模块时会同时加载该模块所依赖的其他模块。
注:在装载内核模块时,用户可以向模块传递参数,形式为“insmode(或modprobe)模块名参数名=参数值”,如果不传递,参数将使用模块内定义的默认值。

【模块加载】:
1 static int _ _init initialization_function(void)
2 {
3 /* 初始化代码*/
4 }
5 module_init(initialization_function);
在 Linux 内核中,所有标识为_ _init的函数在连接的时候都放在.init.text这个区段内,此外,所有的_ _init函数在区段.initcall.init中还保存了一份函数指针,在初始化时内核会通过这些函数指针调用这些_ _init函数,并在初始化完成后释放init区段(包括.init.text,.initcall.init等)。
【模块卸载】:
1 static void _ _exit cleanup_function(void)
2 {
3 /* 释放代码*/
4 }
5 module_exit(cleanup_function);

通常来说,模块卸载函数要完成与模块加载函数相反的功能,如下所示。
l 若模块加载函数注册了XXX,则模块卸载函数应该注销XXX。
l 若模块加载函数动态申请了内存,则模块卸载函数应释放该内存。
l 若模块加载函数申请了硬件资源(中断、DMA通道、I/O 端口和I/O 内存等)的占用,则模块卸载函数应释放这些硬件资源。
l 若模块加载函数开启了硬件,则卸载函数中一般要关闭硬件。
和_ _init一样,_ _exit也可以使对应函数在运行完成后自动回收内存。

【模块参数】:
static char *book_name = "Linux设备驱动";
static int num = 4000;
module_param(num, int, S_IRUGO);
module_param(book_name, charp, S_IRUGO);



Proc
/proc文件系统是内核与内核模块向进程传递信息的方法。原来设计的目的是为了查看进程信息提供一个方便的途径,现在被用来向用户提供各种内核的内容。
注意:/proc文件是建立在内存当中。

原创粉丝点击