宏:
__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功能。
__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功能。