IPMI驱动程序设计分析_第1页
IPMI驱动程序设计分析_第2页
IPMI驱动程序设计分析_第3页
IPMI驱动程序设计分析_第4页
IPMI驱动程序设计分析_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、IPMI 驱动程序设计分析1. 引言Linux 下开发驱动程序一直都是一个难点,在这里结合 IPMI 驱动程序的开发过程,介 绍一下 Linux 下的驱动开发。2. Linux 驱动开发基础驱动程序的作用就是联系用户程序与硬件设备, Linux 操作系统(其他高级操作系统也 一样)不会把底层硬件系统直接暴露给用户以保证系统的健壮性, 因此如果用户程序需要操 作硬件设备就需要按照 Linux 系统给定的方式进行编写驱动程序, 通过系统调用的方式 访问硬件设备。Linux 系统中有一个重要的概念: “所有设备都视为文件” 。因此用户程序对外设的操作 其实都表现为对文件的操作, Linux 为用户程

2、序提供了标准的文件操作系统调用,如open,close, write, read, ioctl , select等等。例如:用户程序需要通过 IPMI设备访问BMC,首先调用open(),打开一个设备。通常 设备放在 /dev/目录下,如:fd = open("/dev/ipmi-uart",O_RDWR,S_IRUSR | S_IWUSR);这个 open 就是 Linux 系统的一个系统调用。应用程序通过 /dev/ipmi-uart ,与 IPMI 驱动程序进行 了关联,后续的操作,如 ioctl , read, write 都会调用驱动程序中相关的例程来实现。一般驱

3、动程序可以分为两个部分:1、 面向底层硬件的接口,如,通过硬件发送数据,从硬件接收数据,具体的说,UART 的地层收发接口;2、 面向用户程序的接口,为用户程序提供fops(file operations ),也就是 open, close, ioctl , write , read 系统调用在驱动中的详细实现。Linux 内核中采用可加载的模块化设计( LKMs , Loadable Kernel Modules ),一般情况 下编译的 Linux 内核是支持可插入式模块的,也就是将最基本的核心代码编译在内核中, 其他的代码可以选择在内核中, 或者编译为内核的模块文件。 常见的驱动程序也是作

4、为内核 模块动态加载的。模块相关命令:lsmod 列出当前系统加载的模块rmmod 将当前模块卸载insmod、modprobe 用于加载当前模块。 但 insmod 不会自动解决依存关系, 而 modprobe 可以根据模块间的依存关系以及 /etc/modules.conf 文件中的内容自动插入模块。mknod 创建相关模块。Linux 系统的设备文件分为三类:块设备文件、字符设备文件和网络设备文件。块设备文件通常指一些需要以块(如512字节)的方式写入的设备,如IDE硬盘、SCSI 硬盘、光驱等。 字符型设备文件通常指可以直接读写, 没有缓冲区的设备, 如并口、 虚拟控制台等。 网络设备

5、文件通常是指网络设备访问的 BSD socket 接口,如网卡等。设备号设备号是一个数字,它是设备的标志。 就如前面所述, 一个设备文件 (也就是设 备节点)可以通过 mknod 命令来创建,其中指定了主设备号和次设备号。主设备号表明某 一类设备, 一般对应着确定的驱动程序; 次设备号一般是用于区分标明不同属性, 例如不同 的使用方法,不同的位置,不同的操作等,它标志着某个具体的物理设备。 高字节为主设备 号和底字节为次设备号。 例如,在系统中的块设备 IDE 硬盘的主设备号是 3,而多个 IDE 硬 盘及其各个分区分别赋予次设备号1、 2、3,Linux 设备驱动程序包含中断处理程序和设备服

6、务子程序两部分: 设备服务子程序包含了所有与设备操作相关的处理代码。 它从面向用户进程的设备文件 系统中接受用户命令, 并对设备控制器执行操作。 这样,设备驱动程序屏蔽了设备的特殊性, 使用户可以像对待文件一样操作设备。设备控制器需要获得系统服务时有两种方式:查询和中断。因为 Linux 下的设备驱动 程序是内核的一部分, 在设备查询期间系统不能运行其他代码,查询方式的工作效率比较低,所以只有少数设备如软盘驱动程序采取这种方式, 大多设备以中断方式向设备驱动程序发出 输入 /输出请求。Linux 中的设备驱动程序有如下特点:(1)内核代码:设备驱动程序是内核的一部分,如果驱动程序出错,则可能导

7、致系统 崩溃。(2)内核接口:设备驱动程序必须为内核或者其子系统提供一个标准接口。比如,一 个终端驱动程序必须为内核提供一个文件 I/O 接口;一个 SCSI 设备驱动程序应该为 SCSI 子系统提供一个 SCSI设备接口,同时SCSI子系统也必须为内核提供文件的I/O接口及缓冲区。(3)内核机制和服务:设备驱动程序使用一些标准的内核服务,如内存分配等。(4) 可装载:大多数的Linux 操作系统设备驱动程序都可以在需要时装载进内核,在 不需要时从内核中卸载。(5)可设置: Linux 操作系统设备驱动程序可以集成为内核的一部分,并可以根据需 要把其中的某一部分集成到内核中,这只需要在系统编译

8、时进行相应的设置即可。(6)动态性:在系统启动且各个设备驱动程序初始化后,驱动程序将维护其控制的设 备。如果该设备驱动程序控制的设备不存在也不影响系统的运行,那么此时的设备驱动程序只是多占用了一点系统内存罢了。驱动开发时却没有 main 函数,模块在调用 insmod 命令时被加载,此时的入口点是 init_module 函数,通常在该函数中完成设备的注册。 同样,模块在调 rmmod 函数时被卸载, 此时的入口点是 cleanup_module 函数,在该函数中完成设备的卸载。在设备完成注册加载 之后,用户的应用程序就可以对该设备进行一定的操作,如read、write 等,而驱动程序就是用于

9、实现这些操作,在用户应用程序调用相应入口函数时执行相关的操作,init_module入口点函数则不需要完成其他如read、 write 之类功能。设备驱动程序主要组成(1)设备注册设备注册使用函数register_chrdev,调用该函数后就可以向系统申请主设备号,如果register_chrdev 操作成功,设备名就会出现在 /proc/devices 文件里。(2)设备解除注册在关闭设备时,通常需要解除原先的设备注册,此时可使用函数un register_chrdev,此后该设备就会从 /proc/devices 里消失。( 3)打开设备打开设备的接口函数是 open,根据设备的不同,op

10、en函数完成的功能也有所不同,但 通常情况下在 open 函数中要完成如下工作。递增计数器。检查特定设备的特殊情况。 初始化设备。 识别次设备号其中递增计数器是用于设备计数的。 由于设备在使用时通常会打开较多次数, 也可以由 不同的进程所使用, 所以若有一进程想要关闭该设备, 则必须保证其他设备没有使用该设备。 因此使用计数器就可以很好地完成这项功能。这里,实现计数器操作的是用在中定义的 3 个宏如下。 MOD_INC_USE_COUNT :计数器加一。 MOD_DEC_USE_COUNT :计数器减一。 MOD_IN_USE :计数器非零时返回真。另外,当有多个物理设备时, 就需要识别次设备

11、号来对各个不同的设备进行不同的操作, 在有些驱动程序中并不需要用到。虽然这是对设备文件执行的第一个操作, 但却不是驱动程序一定要声明的操作。 若这个 函数的入口为 NULL ,那么设备的打开操作将永远成功,但系统不会通知驱动程序。( 4)释放设备释放设备的接口函数是 release。要注意释放设备和关闭设备是完全不同的。当一个进程释放设备时, 其他进程还能继续使用该设备, 只是该进程暂时停止对该设备的使用; 而当一 个进程关闭设备时,其他进程必须重新打开此设备才能使用。释放设备时要完成的工作如下。 递减计数器 MOD_DEC_USE_COUNT 。 在最后一次释放设备操作时关闭设备。(5)读写

12、设备读写设备的主要任务就是把内核空间的数据复制到用户空间,或者从用户空间复制到内核空间,也就是将内核空间缓冲区里的数据复制到用户空间的缓冲区中或者相反。虽然这个过程看起来很简单, 但是内核空间地址和应用空间地址是有很大区别的, 其中 之一就是用户空间的内存是可以被换出的, 因此可能会出现页面失效等情况。 所以就不能使 用 诸 如 memcpy 之 类 的 函 数 来 完 成 这 样 的 操 作 。 在 这 里 就 要 使 用 copy_to_user 或 copy_from_user 函数,它们就是用来实现用户空间和内核空间的数据交换的。这两个函数 不仅实现了用户空间和内核空间的数据转换, 而

13、且还会检查用户空间指针的有效性。 如果指 针无效,那么就不进行复制。(6)获取内存在应用程序中获取内存通常使用函数 malloc ,但在设备驱动程序中动态开辟内存可以有 基于内存地址和基于页面为单位两类。其中,基于内存地址的函数有kmalloc ,注意的是,kmalloc 函数返回的是物理地址, 而 malloc 等返回的是线性地址, 因此在驱动程序中不能使 用malloc函数。与malloc()不同,kmalloc()申请空间有大小限制。长度是2的整次方,并且不会对所获取的内存空间清零。基于页为单位的内存有函数族有如下。 get_zeroed_page:获得一个已清零页面。 get_free

14、_page:获得一个或几个连续页面。 get_dma_pages:获得用于 DMA 传输的页面。与之相对应的释放内存用也有 kfree 或 free_pages 族。3. IPMI驱动程序设计3.1. IPMI驱动与 BMC 接口准确的说应该是 RMU与BMC的接口: UART。其实IPMI驱动的主要工作就是提供一 个访问接口给用户程序,把用户的IPMI数据通过UART透传至BMC,并接收BMC的数据, 透传至用户程序。RMU与BMC之间通过串口连接,串口的数据是以流的形式传送的,因此,需要确定RMU串口与BMC串口的通讯协议以确保数据收发的稳定,协议的实现很简单,就是把结 构中的数据取出来,

15、顺序的 push到数组中,并加上“头”,“尾”,“长度”以及“校验核” 然后通过串口发送出去。接收端接到数据后再按上面的规则进行校验,如果通过校验则存储到IPMI数据结构中,然后反馈给用户程序。3.2. IPMI驱动与用户程序接口用户程序与IPMI驱动的接口是fops,这里要提一下/dev/ipmi-uart,这是一个设备节点, 也就是说这个文件其实就是关联驱动程序与文件设备的接口,这个文件通过主设备号与驱动关联。这是一个内核结构,不会出现在用户空间的程序中,它定义了常见文件I/O函数的入口。IPMI的fops定义如下:static const struct file_.operations

16、ipmi_fops = .ow ner=THIS_MODULE,.ioctl=ipmi_ioctl,.ope n=ipmi_ope n,.release=ipmi_release,.poll;=ipmi_poll,int ipmi_major=199 ;rv = register_chrdev(ipmi_major, DEVICENAME, & ipmi_fops);IPMI消息数据结构用于保存IPMI信息,定义如下:struct ipmi_msg;un sig ned char n etfn;un sig ned char cmd;un sig ned short data_le n

17、;unsigned char _user *data;/*网络功能码*/* IPMI命令号*/*数据长度*/* IPMI 数据 */驱动资源数据结构如下:static struct platform_driver ipmi_uart_driver = .probe =ipmi_uart_probe,/*探测函数*/.remove=_devexit_p(ipmi_uart_remove),/* 移出函数 */.suspe nd=ipmi_uart_suspe nd./*挂起函数*/.resume=ipmi_uart_resume,/*重新开始函数*/.driver=.n ame= "i

18、pmi_usart",/*设备名称*/.owner = THIS MODULE,/*模块所有者*/,;3.3.功能实现下图描述了驱动程序是如何实现的。驱动模块的任务就是 probe硬件信息实现底层读写功能,向用户程序提供fops接口。说明:1、 驱动程序通过probe找到硬件信息并保存在ipmi_uart_data全局数据结构中。2、 Open方法获取ipmi_uart_data结构中的硬件参数,并传递给ioctl,select方法。3、Ioctl内需要实现“ ipmi结构”到“串行数据”的转换,以及底层数据发送功能。工作过程如下:1) /*定义接口参数*/struct ipmi_r

19、eq req;struct ipmi_recv recv;2) /*打开设备*/fd = ope n( "/dev/ipmi-uart",O_RDWR,S_IRUSR | S_IWUSR);3) /*设置发送数据*/req.msg.data = SENDDATA;req.msg .n etfn = NETFN;req.msg.cmd = CMD;req.msgid = MSGID;req.msg.data_len = sizeof(SENDDA TA) - 1;4) /* 发送数据 */rv = ioctl(fd, IPMCTL_SEND_COMMAND, &req);5) /* 等待数据 */fd_set rse

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论