驱动编程小记

宏: __KERNEL__, MODULE, __VERSION__
__KERNEL__:表明这将是用于内核的代码,否则很多内核过程将无法使用。
MODULE:如果是以模块方式编译,需要定义这个宏;
__VERSION__:定义这个宏则需要驱动程序的内核版本要和内核版本一致。

module_init()/module_exit(): [spioc_init()/spioc_exit()]
每个驱动程序都要有这两个函数,它们分别用于设备驱动程序的加载和撤消。

static struct file_operations spioc_fops:
每个驱动程序都要有这样的结构体,可能不止一个。用register_chrdev()
注册驱动程序时这个结构体的起始地址被传送到内核的设备表中。

SPIOC_MAJOR:
每个设备驱动程序有一个主设备号(major number)。不同设备驱动程序不能
使用相同的主设备号。一个设备驱动程序可以管理不同的(但一般是同一类的)
设备,通过次设备号(minor number)区分。

spioc_ open()/close(),read()/write(), ioctl():
根据具体驱动程序定义和使用。一般open()/close()总是需要的,而且
open()和close()一定要成对出现。

设备驱动程序被静态编译到内核中的情况:
module_init()指示内核在启动过程中运行设备的初始化函数,如spioc_init()函数。驱动程序的加载随内核的启动一起完成。
静态编译的内核模块不能被动态卸载,只有到系统关闭时由内核执行相应的卸载函数,如spioc_exit()。
嵌入式操作系统一般使用静态内核模块以减少系统的尺寸和复杂性。

设备驱动程序被动态加载到内核中的情况:
首先,驱动程序需要被编译成目标文件,如spioc.o,内核2.6之后为spioco.ko。
在操作系统运行之后,使用insmod命令将驱动程序模块动态加载到内核中
$ insmod spioc.o
使用insmod命令动态加载的内核模块可以使用rmmod命令动态地从内核中卸载
$ rmmod spioc.o
使用内核的动态模块加载/卸载功能需要内核支持kmod功能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值