Linux设备驱动程序的概念、作用以及模块
- 格式:doc
- 大小:30.50 KB
- 文档页数:2
本讲主要概述Linux设备驱动框架、驱动程序的配置文件及常用的加载驱动程序的方法;并且介绍Red Hat Linux安装程序是如何加载驱动的,通过了解这个过程,我们可以自己将驱动程序放到引导盘中;安装完系统后,使用kudzu自动配置硬件程序。
Linux设备驱动概述1.内核和驱动模块操作系统是通过各种驱动程序来驾驭硬件设备,它为用户屏蔽了各种各样的设备,驱动硬件是操作系统最基本的功能,并且提供统一的操作方式。
正如我们查看屏幕上的文档时,不用去管到底使用nVIDIA芯片,还是ATI芯片的显示卡,只需知道输入命令后,需要的文字就显示在屏幕上。
硬件驱动程序是操作系统最基本的组成部分,在Linux内核源程序中也占有较高的比例。
Linux内核中采用可加载的模块化设计(LKMs ,Loadable Kernel Modules),一般情况下编译的Linux内核是支持可插入式模块的,也就是将最基本的核心代码编译在内核中,其它的代码可以选择是在内核中,或者编译为内核的模块文件。
如果需要某种功能,比如需要访问一个NTFS分区,就加载相应的NTFS模块。
这种设计可以使内核文件不至于太大,但是又可以支持很多的功能,必要时动态地加载。
这是一种跟微内核设计不太一样,但却是切实可行的内核设计方案。
我们常见的驱动程序就是作为内核模块动态加载的,比如声卡驱动和网卡驱动等,而Linux最基础的驱动,如CPU、PCI总线、TCP/IP协议、APM(高级电源管理)、VFS等驱动程序则编译在内核文件中。
有时也把内核模块就叫做驱动程序,只不过驱动的内容不一定是硬件罢了,比如ext3文件系统的驱动。
理解这一点很重要。
因此,加载驱动时就是加载内核模块。
下面来看一下有关模块的命令,在加载驱动程序要用到它们:lsmod、modprob、insmod、rmmod、modinfo。
lsmod列出当前系统中加载的模块,例如:#lsmod (与cat /proc/modules得出的内容是一致的)Module Size Used by Not taintedradeon 115364 1 agpgart 56664 3 nls_iso8859-1 3516 1 (autoclean)loop 12120 3 (autoclean)smbfs 44528 2 (autoclean)parport_pc 19076 1 (autoclean)lp 9028 0 (autoclean)parport 37088 1 (autoclean) [parport_pc lp]autofs 13364 0 (autoclean) (unused)ds 8704 2yenta_socket 13760 2 pcmcia_core 57184 0 [ds yenta_socket]tg3 55112 1 sg 36940 0 (autoclean)sr_mod 18104 0 (autoclean)microcode 4724 0 (autoclean)ide-scsi 12208 0 scsi_mod 108968 3 [sg sr_mod ide-scsi]ide-cd 35680 0 cdrom 33696 0 [sr_mod ide-cd]nls_cp936 124988 1 (autoclean)nls_cp437 5148 1 (autoclean)vfat 13004 1 (autoclean)fat 38872 0 (autoclean) [vfat]keybdev 2976 0(unused)mousedev 5524 1 hid 22212 0 (unused)input 5888 0 [keybdev mousedev hid]ehci-hcd 20104 0 (unused)usb-uhci 26412 0 (unused)usbcore 79392 1 [hid ehci-hcd usb-uhci]ext3 91592 2 jbd 52336 2 [ext3]上面显示了当前系统中加载的模块,左边数第一列是模块名,第二列是该模块大小,第三列则是该模块使用的数量。
设备驱动程序简介1.设备驱动程序的作⽤从⼀个⾓度看,设备驱动程序的作⽤在于提供机制,⽽不是策略。
在编写驱动程序时,程序猿应该特别注意以下这个基本概念:编写訪问硬件的内核代码时,不要给⽤户强加不论什么特定策略。
由于不同的⽤户有不同的需求,驱动程序应该处理如何使硬件可⽤的问题。
⽽将如何使⽤硬件的问题留给上层应⽤程序。
从还有⼀个⾓度来看驱动程序。
它还能够看作是应⽤程序和实际设备之间的⼀个软件层。
总的来说,驱动程序设计主要还是综合考虑以下三个⽅⾯的因素:提供给⽤户尽量多的选项、编写驱动程序要占⽤的时间以及尽量保持程序简单⽽不⾄于错误丛⽣。
2.内核功能划分Unix系统⽀持多进程并发执⾏。
每⼀个进程都请求系统资源。
内核负责处理全部这些请求,依据内核完毕任务的不同,可将内核功能分为例如以下⼏部分:1.进程管理:负责创建和销魂进程。
并处理它们和外部世界之间的连接。
内核进程管理活动就是在单个或多个CPU上实现了多个进程的抽象。
2.内存管理:内存是计算机的主要资源之中的⼀个,⽤来管理内存的策略是决定系统系能的⼀个关键因素。
3.⽂件系统:内核在没有结构的硬件上构造结构化的⽂件系统。
⽽⽂件抽象在整个系统中⼴泛使⽤。
4.设备控制:差点⼉每个系统操作终于都会映射到物理设备上。
5.⽹络功能:⽹络功能也必须由操作系统来管理,系统负责在应⽤程序和⽹络接⼝之间传递数据包,并依据⽹络活动控制程序的运⾏。
全部的路由和地址解析问题都由内核处理。
可装载模块:Linux有⼀个⾮常好的特性:内核提供的特性可在执⾏时进⾏扩展。
可在执⾏时加⼊到内核的代码被称为“模块”。
Linux内核⽀持⼏种模块类型。
包含但不限于设备驱动程序。
每⼀个模块由⽬标代码组成,能够使⽤insmod程序将模块连接到正在执⾏的内核,也能够使⽤rmmod程序移除连接。
3.设备和模块的分类Linux系统将设备分成三个基本类型:字符设备、块设备、⽹络接⼝。
1.字符设备:字符设备驱动程序通常⾄少要实现open、close、read和write系统调⽤。
Linux设备驱动程序原理及框架-内核模块入门篇内核模块介绍应用层加载模块操作过程内核如何支持可安装模块内核提供的接口及作用模块实例内核模块内核模块介绍Linux采用的是整体式的内核结构,这种结构采用的是整体式的内核结构,采用的是整体式的内核结构的内核一般不能动态的增加新的功能。
为此,的内核一般不能动态的增加新的功能。
为此,Linux提供了一种全新的机制,叫(可安装) 提供了一种全新的机制,可安装) 提供了一种全新的机制模块” )。
利用这个机制“模块”(module)。
利用这个机制,可以)。
利用这个机制,根据需要,根据需要,在不必对内核重新编译链接的条件将可安装模块动态的插入运行中的内核,下,将可安装模块动态的插入运行中的内核,成为内核的一个有机组成部分;成为内核的一个有机组成部分;或者从内核移走已经安装的模块。
正是这种机制,走已经安装的模块。
正是这种机制,使得内核的内存映像保持最小,的内存映像保持最小,但却具有很大的灵活性和可扩充性。
和可扩充性。
内核模块内核模块介绍可安装模块是可以在系统运行时动态地安装和卸载的内核软件。
严格来说,卸载的内核软件。
严格来说,这种软件的作用并不限于设备驱动,并不限于设备驱动,例如有些文件系统就是以可安装模块的形式实现的。
但是,另一方面,可安装模块的形式实现的。
但是,另一方面,它主要用来实现设备驱动程序或者与设备驱动密切相关的部分(如文件系统等)。
密切相关的部分(如文件系统等)。
课程内容内核模块介绍应用层加载模块操作过程内核如何支持可安装模块内核提供的接口及作用模块实例内核模块应用层加载模块操作过程内核引导的过程中,会识别出所有已经安装的硬件设备,内核引导的过程中,会识别出所有已经安装的硬件设备,并且创建好该系统中的硬件设备的列表树:文件系统。
且创建好该系统中的硬件设备的列表树:/sys 文件系统。
(udev 服务就是通过读取该文件系统内容来创建必要的设备文件的。
)。
Linux操作系统的模块全面详解Linux操作系统中模块的概念想必很多人都不太了解。
下面由小编为大家整理了Linux操作系统的模块全面详解,希望对大家有帮助!Linux操作系统的模块全面详解一、模块简介Windows NT是一种微内核的结构,其内核的功能块被划分成独立的模块,在这些功能块之间有严格的通信机制;而Linux则不同,它是一种monolithic(单一大块)结构,也就是说,整个内核是一个单独的、非常大的程序。
在这种结构中,部件的添加和删除都相当麻烦,需要重新编译内核。
为了解决这个问题,不知道从哪个版本的内核开始,Linux引入了一种称为module(模块)的技术,可以把某些功能代码作为模块动态装载到内核中使用。
模块是一种目标对象文件,需要在内核空间执行,可以把它看作是一组已经编译好而且已经链接成可执行文件的程序。
在需要的时候,内核就会实用某种方法调用这些程序来执行特定的操作,实现特定的功能。
内核在内核符号表中维护了一个模块的链表,每个符号表对应一个模块,在把模块加载进内核时正确地对其进行解释,并将模块作为内核的一部分来执行;加载进内核中的模块具有所有的内核权限。
模块可以在系统启动时加载到系统中,也可以在系统运行的任何时刻加载;在不需要时,可以将模块动态卸载。
这样就不用每次修改系统的配置时都要重新编译内核了。
Linux操作系统的模块全面详解二、模块的优缺点内核模块的这种动态装载特性具有以下的优点:1、可以把内核映像文件保持在最小。
在编译内核时可以选择把一部分内容当成模块进行编译,这样在最终生成的内核映像文件中就可以不包含这部分内容,从而生成最小的内核映像文件。
2、灵活性好。
如果需要实用新的模块,不必重新编译内核,只要把新的模块编译后装载进系统中就可以了。
如果对内核源程序进行了修改,也不需要重新编译整个内核,只需要修改对应的部分就可以了。
但是,内核模块的引入也带来了一些问题:1、这种动态加载的特性不利于系统的性能和内存的利用,会带来负面的影响。
linux驱动开发通俗讲解Linux驱动开发是一门涉及操作系统和硬件交互的技术,它主要负责管理和控制硬件设备的操作。
比如,键盘、鼠标、打印机等设备,都需要相应的驱动程序来与操作系统进行通信。
在Linux系统中,驱动程序主要由内核提供,它们以模块的形式存在。
当我们插入一个新的设备时,操作系统会自动加载相应的驱动模块,并将其与设备进行绑定。
这样,设备就能被操作系统识别和使用了。
驱动开发涉及到硬件和软件两个方面。
首先,我们需要了解硬件设备的工作原理和通信协议。
有了这些基础知识,我们才能更好地理解设备的工作方式,并编写相应的驱动程序。
我们需要熟悉Linux内核的工作机制和API接口。
内核提供了一系列函数和数据结构,用于驱动程序与操作系统进行交互。
我们可以使用这些接口来访问设备的寄存器、发送控制命令、接收数据等。
在编写驱动程序时,我们需要按照一定的规范和流程进行。
首先,我们需要注册设备驱动程序,告诉操作系统我们要控制哪个设备。
然后,我们需要实现一系列的回调函数,用于处理设备的各种事件和操作。
这些回调函数会在相应的时机被内核调用。
在编写驱动程序时,我们还需要考虑设备的并发访问和错误处理。
由于设备可能同时被多个进程或线程访问,我们需要使用互斥锁等机制来保护共享资源,避免冲突和竞争条件的发生。
同时,我们还需要处理各种可能发生的错误和异常情况,保证系统的稳定性和可靠性。
驱动开发是一项需要耐心和细心的工作。
在编写驱动程序时,我们需要仔细阅读设备的文档和规格说明,了解其特性和限制。
我们还需要进行大量的测试和调试工作,确保驱动程序的正确性和稳定性。
总的来说,Linux驱动开发是一项非常重要的技术,它为我们提供了与硬件设备交互的能力。
通过编写驱动程序,我们可以更好地利用设备的功能,提升系统的性能和稳定性。
希望通过本文的介绍,读者能够对Linux驱动开发有一个初步的了解,并对其重要性有所认识。
一.linux设备驱动的作用内核:用于管理软硬件资源,并提供运行环境。
如分配4G虚拟空间等。
linux设备驱动:是连接硬件和内核之间的桥梁。
linux系统按个人理解可按下划分:应用层:包括POSIX接口,LIBC,图形库等,用于给用户提供访问内核的接口。
属于用户态,ARM运行在用户模式(usr)或者系统模式(sys)下。
内核层:应用程序调用相关接口后,会通过系统调用,执行SWI指令切换ARM的工作模式到超级用户(svc)模式下,根据用户函数的要求执行相应的操作。
硬件层:硬件设备,当用户需要操作硬件时,内核会根据驱动接口操作硬件设备图结构如下:举一个相对比较邪恶的类比:在深圳的酒店经常会在门缝看到一些卡片,上面说可以通过打电话送货上门提供某中服务。
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx二.内核代码树介绍linux-2.6.29|-arch : 包含和硬件体系结构相关的代码|-block : 硬盘调度算法,不是驱动|-firmware : 固件,如BOIS|-Documentation: 标准官方文档|-dirver : linux设备驱动|-fs : 内核所支持的文件体系|-include :头文件。
linux/module.h linux/init.h 常用库。
|-init :库文件代码,C库函数在内核中的实现。
init/main.c ->start_kernel->内核执行第一条代码|-ipc : 进程件通信|-mm :内存管理|-kernel : 内核核心部分,包括进程调度等|-net :网络协议|-sound : 所有音频相关|其中,跟设备驱动有关并且经常查阅的文件夹有:initinclude : linux, asm-armdrivers:arch: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx三.内核补丁:补丁一般都是基于某个版本内核生成的,用于升级旧内核。
1.驱动程序:使硬件工作的软件驱动程序为操作硬件提供良好内部接口驱动程序为应用程序提供了访问设备的机制2.字符设备字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常实现open, close, read和write 系统调用。
顺序访问3.块设备只能一次传送一个或多个长度是512字节( 或一个更大的2 次幂的数)的整块数据。
块和字符设备的区别仅仅是驱动的与内核的接口不同。
随机访问4.块(block)设备和字符(character)设备的区别块设备有缓冲,因此能选择响应请求的顺序以提高性能,读的时候是一块一块的读。
块设备能随机访问。
存储设备一般是块设备。
字符设备没有缓冲,按顺序读取。
比如键盘,鼠标都是字符设备。
大多数设备都是字符设备,因为大多数设备都不需要块设备类型的缓冲。
5.网络接口任何网络事务都通过一个接口来进行, 一个接口通常是一个硬件设备(eth0), 但是它也可以是一个纯粹的软件设备, 比如回环接口(lo)。
一个网络接口负责发送和接收数据报文。
6.Linux内核功能的划分1)进程管理内核负责创建和销毁进程, 并处理它们与外部世界的联系(输入和输出). 不同进程间通讯(通过信号, 管道, 或者进程间通讯)对整个系统功能来说是基本的, 也由内核处理. 另外, 调度器, 控制进程如何共享CPU, 是进程管理的一部分. 更通常地, 内核的进程管理活动实现了多个进程在一个单个或者几个CPU 之上的抽象.2)内存管理计算机的内存是主要的资源, 处理它所用的策略对系统性能是至关重要的. 内核为所有进程的每一个都在有限的可用资源上建立了一个虚拟地址空间. 内核的不同部分与内存管理子系统通过一套函数调用交互, 从简单的malloc/free 对到更多更复杂的功能. 3)文件系统Unix 在很大程度上基于文件系统的概念; 几乎Unix 中的任何东西都可看作一个文件. 内核在非结构化的硬件之上建立了一个结构化的文件系统, 结果是文件的抽象非常多地在整个系统中应用. 另外, Linux 支持多个文件系统类型, 就是说, 物理介质上不同的数据组织方式. 例如, 磁盘可被格式化成标准Linux 的ext3 文件系统, 普遍使用的FAT 文件系统, 或者其他几个文件系统.4)设备控制几乎每个系统操作最终都映射到一个物理设备上. 除了处理器, 内存和非常少的别的实体之外, 全部中的任何设备控制操作都由特定于要寻址的设备相关的代码来进行. 这些代码称为设备驱动. 内核中必须嵌入系统中出现的每个外设的驱动, 从硬盘驱动到键盘和磁带驱动器5)网络网络必须由操作系统来管理, 因为大部分网络操作不是特定于某一个进程: 进入系统的报文是异步事件. 报文在某一个进程接手之前必须被收集, 识别, 分发. 系统负责在程序和网络接口之间递送数据报文, 它必须根据程序的网络活动来控制程序的执行. 另外, 所有的路由和地址解析问题都在内核中实现7.驱动程序的两大任务作为系统调用的一部分而执行,运行在进程上下文。
linux内核驱动模型和实现原理Linux内核驱动模型和实现原理:Linux内核是一个模块化的系统,它允许用户通过加载和卸载模块来扩展系统功能。
内核驱动程序是一种特殊类型的模块,它负责与硬件设备进行交互,控制设备的操作,并将设备的功能暴露给用户空间。
在Linux内核中,驱动程序的实现原理和模型是非常重要的。
首先,让我们来了解Linux内核驱动的模型。
Linux内核驱动模型主要由字符设备驱动、块设备驱动和网络设备驱动组成。
每种驱动类型都有自己的特点和工作方式。
字符设备驱动主要用于与字符设备进行交互,如终端设备、串口设备等。
字符设备驱动通常使用文件系统接口,通过文件描述符来访问设备,提供读写操作。
块设备驱动主要用于与块设备进行交互,如硬盘、闪存等。
块设备驱动负责管理设备的数据块,提供块设备的读写操作,支持文件系统的操作。
网络设备驱动主要用于与网络设备进行交互,如网卡、无线网卡等。
网络设备驱动负责管理网络设备的数据传输,实现网络协议栈的功能。
在Linux内核中,每种驱动类型都有对应的数据结构和函数接口,驱动程序通过这些接口与设备进行交互。
驱动程序的核心功能包括设备的注册、初始化、数据传输和中断处理等。
驱动程序的实现原理主要涉及以下几个方面:1.设备的注册和初始化:驱动程序在加载时需要将设备注册到内核中,以便内核能够识别设备并分配资源。
设备的初始化包括对设备的配置、内存的映射、中断的注册等操作。
2.数据传输和操作:驱动程序通过设备的接口进行数据的读写操作,如字符设备驱动可以使用read和write函数来进行数据传输,块设备驱动可以使用request和transfer函数来进行块的读写操作。
3.中断处理:设备通常会触发中断,驱动程序需要注册中断处理函数来处理设备的中断事件。
中断处理函数通常包括中断的处理、数据的传输、设备的复位等操作。
4.设备的管理和资源的释放:驱动程序需要负责设备的管理和资源的释放,包括设备的打开和关闭、内存的释放、中断的注销等操作。
Linux驱动相关的知识点包括:
驱动简介:Linux的驱动本质上就是一种软件程序,上层软件可以在不了解硬件特性的情况下,通过驱动提供的接口和计算机以及外设进行通信。
驱动程序将内核与硬件之间串联起来,为应用开发屏蔽了硬件的细节,使应用能够直接操作硬件。
对于Linux来说,硬件设备就是一个设备文件,应用程序可以像操作普通文件那样对硬件设备进行操作。
驱动分类:Linux将外设和存储器分为三个基础大类,分别是块设备驱动、字符设备驱动、网络设备驱动。
字符设备驱动是较为简单和初学者首先进行学习的驱动。
设备文件:Linux系统将所有的设备都当做文件来处理,每个设备都有一个对应的设备文件,应用程序通过访问这些设备文件来访问硬件。
主设备号和次设备号:主设备号用来表明设备的类型,与一个确定的驱动程序对应;次设备号则是用于标明不同的属性,例如不同的使用方法,不同的位置,不同的操作等,它标志着某个具体的物理设备。
加载和卸载驱动:在Linux中,可以使用insmod命令加载驱动模块,使用rmmod命令卸载驱动模块。
设备操作:Linux驱动中的设备操作包括对设备的初始化和释放、数据的传送、设备错误的检测和处理等。
读写设备:读写设备的主要任务就是把内核空间的数据复制到用户空间,或者从用户空间复制到内核空间。
以上是关于Linux驱动的一些主要知识点,但请注意,这些只是基础知识,深入学习还需要参考更详细的资料和实践经验。
了解Linux系统内核和驱动程序开发Linux系统内核是OS的核心组成部分,它连接了硬件和软件,允许软件与硬件交互。
内核需要有一个能够控制硬件的驱动程序。
在本文中,我们将介绍Linux系统内核和驱动程序开发的一些基本概念,以及如何了解和学习这些概念。
Linux系统内核是一个高度定制的操作系统内核,它可以定制化来适应不同的需求。
但是,无论哪种形式的Linux内核,它都负责处理硬件和为用户空间程序提供服务。
内核需要有针对每个硬件设备的设备驱动程序,以便内核和设备之间通信。
驱动程序开发是将新硬件添加到系统时必不可少的一部分。
开发驱动程序需要对内核响应机制的了解,以及对硬件的了解。
设备驱动程序应该提供一些API,可以由需要使用设备的软件来调用这些API。
了解内核认识一个软件产品的最好方法是阅读其源文件或代码。
在Linux中,内核的源代码是免费的,并且是公开的。
这为在深入了解内核的运作方式以及设计器提供了机会。
内核可在内核文件系统中找到,其中包括全部的源文件。
学习内核在学习内核时,第一步是学习操作系统概念。
有很多优秀的操作系统课程,可用于学习操作系统基本原理。
其次,学习一些基本的数据结构和算法,如链表、栈和队列。
然后,可以学习操作系统接口和内核概念。
这些可在内核源代码中找到。
了解内核APILinux内核暴露出一些API,允许编写驱动程序,这些API包括字符设备、块设备、网络设备等。
Linux设备驱动程序还应该提供一些常规操作设备的API,例如读写、打开和关闭。
这些API 可在内核中找到,也可以找到它们的文档。
了解驱动程序开发Linux内核设备驱动程序需要了解内核数据结构、API,以及所开发的设备硬件的特殊功能。
Linux内核驱动程序包括字符、块和网络驱动程序。
字符驱动程序传输ASCII数据,块驱动程序传输二进制数据,而网络驱动程序传输数据包。
Linux内核实现驱动程序的方式是通过系统调用。
在驱动程序开发之前,需要了解每个硬件设备的功能,以确保正确地实现设备函数。
Linux设备驱动程序的概念、作用以及模块
我们首先对linux系统整个框架要有个了解。
Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G。
Linux 内核将这4G字节的空间分为两部分,分别是用户空间(0~3G)和内核空间(3G~4G)。
其中,用户空间存放的是应用程序,而内核空间存放的是内核,设备驱动和硬件。
为什么需要存在设备驱动呢?我们知道,内核是操作系统基本的部分,而操作系统是不能够直接控制硬件的,这样我们就需要设备驱动作为操作系统和硬件设备间的粘合剂,相当于一个中间人吧,负责上下两边的沟通。
驱动负责将操作系统的请求传输,转化为特定物理设备控制器能够理解的命令。
这样我们就知道,驱动需要完成两大功能:
1、为linux内核提供调用接口。
2、控制硬件。
因为寄存器是控制硬件的操作,所以驱动程序控制硬件,也就是要通过读写硬件寄存器达到控制硬件的目的。
内核是为应用程序服务的,其本质其实是函数的集合,内核要实现的功能我们可以分为两部门:基本功能和扩展功能。
其中,基本功能包括进程管理,线程管理等等,而扩展功能,可以根据用户的需求自行添加。
下面我们就来探讨一下怎样向内核添加一项功能呢?
1、我们首先想到,肯定需要写一个功能函数,假如我们命名为fun.c,那么函数写好后,必须要和linux源码一起编译,生成zImage内核镜像文件。
2、重新编译内核。
这样就得到了新的内核,这种添加的方式我们称为静态添加。
大家发现,每次修改一次fun.c,都要重新编译一次内核,灰常的麻烦,所以引进了内核模块机制,只需要加载或卸载模块,就可以动态的增加或者删除内核的功能,不用每次都重新编译,是不是很方便?那么接下来我们会想到,这个模块怎么就能和内核连接在一起呢?其实很简单,fun.c文件除了要实现功能呢,还需要包含和内核的接口,内核也提供了模块的接口,只要这两个接口一致,模块就可以融入内核,成为内核的一部分。
Linux驱动程序都是以模块的形式存在的,所以我们称之为驱动模块。
所以我们总结出添加模块的步骤是:
1、写功能函数fun.c。
怎么样编写模块的源码文件,我们以一个Hello模块实例分析。
#include <linux/module.h>
#include <linux/init.h> //①模块的头文件,在对应内核下
的include目录中{
… //②功能函数hello.c(同普通} 的.c文件)
Static int __int hellomudule_init(void) //③模块初始化函数
{
Printk(“Hello world!\n”);
Return 0;
}
Static void __ exit hellomodule_exit(void) //模块退出函数
{
Printk(“Goodbye world!\n”);
Return 0;
}
module_init(hellomodule_init); //④用module_init和module_exit module_exit(hellomodule_exit); 指定模块初始化函数和退出函数
MODULE_LICENSE(“GPL”) //⑤“GPL”
2、编译hello.c,生成内核模块文件hello.ko。
模块编译是通过内核顶层目录下的Makefile(如Linux-2.6.30.9/Makefile)文件来实现的。
以下是一个例子:
Obj-m=hello.o
KDIR=/home/linux-2.6.30.9
all:
make –C $(KDIR) SUBDIRS=$(shell pwd)modules //make module规
则就类似于make zImage KDIR:内核目录
SUBUDIRS:模块代码所在的目录
然后make一下,就生成了模块文件hello.ko。
3、将内核模块文件动态的装载到内核。
加载模块命令:insmod
例:
root# insmod ./hello.ko
显示当前加载的模块命令:Ismod
例:
root# Ismod
…
这样,我们就完成了整个添加模块的过程,过程还是比较容易理解的。
今天就写到这里,下次我再把具体做的点亮led灯的一个最简单的字符驱动程序总结一下。