Linux驱动学习(一):什么是Linux驱动


前言

一、设备驱动简介

驱动程序在 Linux 内核里扮演着特殊的角色. 它们是截然不同的"黑盒子", 使硬件的特殊的一部分响 应定义好的内部编程接口. 它们完全隐藏了设备工作的细节. 用户的活动通过一套标准化的调用来进行, 这些调用与特别的驱动是独立的; 设备驱动的角色就是将这些调用映射到作用于实际硬件的和设备相关 的操作上. 这个编程接口是这样, 驱动可以与内核的其他部分分开建立, 并在需要的时候在运行时"插 入". 这种模块化使得 Linux 驱动易写, 以致于目前有几百个驱动可用.

那么现在我们来回答什么是驱动:
驱动从字面上理解就是让它动起来,驱动的本质是电力驱动,而驱动代码只是给出了操作方法。
Linux体系架构
在这里插入图片描述

驱动分类

分3类:字符设备驱动、块设备驱动、网络设备驱动
分类原则:设备本身读写操作的特征差异

三类驱动程序对比
在这里插入图片描述

  1. 字符设备,准确的说应该叫“字节设备”,软件操作设备时是以字节为单位进行的。典型的如LCD、串口、LED、蜂鸣器、触摸屏······
  2. 块设备,块设备是相对于字符设备定义的,块设备被软件操作时是以块(多个字节构成的一个单位)为单位的。设备的块大小是设备本身设计时定义好的,软件是不能去更改的,不同设备的块大小可以不一样。常见的块设备都是存储类设备,如:硬盘、NandFlash、iNand、SD····
  3. 网络设备,网络设备是专为网卡设计的驱动模型,linux中网络设备驱动主要目的是为了支持API中socket相关的那些函数工作。

二、模块的编译和加载

Linux设备驱动属于内核的一部分,Linux内核的一个模块可以以两种方式被编译和加载:

  1. 直接编译进Linux内核,随同Linux启动时加载
  2. Linux设备驱动属于内核的一部分,Linux内核的一个模块可以以两种方式被编译和加载:

下面是内核模块的例子:

#include <linux/module.h> //所有模块都需要的头文件 
#include <linux/init.h> // init&exit相关宏 
MODULE_LICENSE("GPL"); 
static int __init hello_init (void) 
{
 printk("Hello module init\n");
  return 0; 
  } 
static void __exit hello_exit (void) 
{
 printk("Hello module exit\n");
  } 
module_init(hello_init); 
module_exit(hello_exit);

分析上述程序,发现一个Linux内核模块需包含模块初始化和模块卸载函数,前者在insmod的时候运行,后者在rmmod的时候运行。初始化与卸载函数必须在宏module_init和module_exit使用前定义,否则会出现编译错误。
初始化与卸载函数必须在宏module_init和module_exit使用前定义,否则会出现编译错误。 程序中的MODULE_LICENSE(“GPL”)用于声明模块的许可证。 如果要把上述程序编译为一个运行时加载和删除的模块,则编译命令为:

gcc -D__KERNEL__ -DMODULE -DLINUX -I /usr/local/src/linux2.4/include -c -o hello.o hello.c

由此可见,Linux内核模块的编译需要给gcc指示-D__KERNEL__ -DMODULE -DLINUX参数。-I选项跟着Linux内核源代码中Include目录的路径。 下列命令将可加载hello模块:

insmod ./hello.o

下列命令完成相反过程:

rmmod hello

如果要将其直接编译入Linux内核,则需要将源代码文件拷贝入Linux内核源代码的相应路径里,并修改Makefile。


总结

模块初始化函数的任务是为以后调用模块的函数做准备; 好像是模块说, " 我在这里, 这是我能做的."模块的退出函数( 例子里是 hello_exit )就在模块被卸载时调用. 它好像告诉内核, "我不 再在那里了, 不要要求我做任何事了."这种编程的方法类似于事件驱动的编程, 但是虽然 不是所有的应用程序都是事件驱动的, 每个内核模块都是. 另外一个主要的不同, 在事件 驱动的应用程序和内核代码之间, 是退出函数: 一个终止的应用程序可以在释放资源方面 懒惰, 或者完全不做清理工作, 但是模块的退出函数必须小心恢复每个由初始化函数建立 的东西, 否则会保留一些东西直到系统重启.

  • 5
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值