




已阅读5页,还剩57页未读, 继续免费阅读
(计算机应用技术专业论文)tcpip在高速环境下优化的零拷贝技术实现方法.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
东北大学硕士学位论文摘要 t c p i p 在高速环境下优化的零拷贝技术实现方法 摘要 由于高速网络的出现,尤其当网络链路速度高于c p u 对t c p i p 协议栈的处理速度 时,提高t c p i p 协议性能的瓶颈已经从网络转移到主机c p u 上,解决这一问题的方法 主要分为两种。第一种是提升n i c ( 网络接口卡) 的功能,智能n i c 拥有可编程处理器 和内存,能够分担主机的部分或全部的消息处理任务,主要有t c p i p 卸载引擎( t o e ) 等。第二种是一些用户级别网络协议将内核从关键消息路径中移除,这意味着部分或整 个协议将从内核空间移到用户空间,比如首先实现零拷贝的u - n e t ,以及最近的r d m a 和d d p 协议等。 本文参考t o e 和零拷贝等技术已有的研究成果,重点研究了以l i n u x 网络设备驱 动程序为基础的零拷贝原理及其实现方法。文中提出的零拷贝解决方案,可用于解决目 前网络服务领域面临的问题。 本文对l i n u x 网络设备驱动程序结构与功能做了具体研究,并对零拷贝技术从原理 到实现进行了较深入的分析。在介绍了l i n u x 内核模块机制( l k m 机制) 、l i n u x 网络 设备驱动程序和零拷贝技术之后,详细描述了驱动程序模块和零拷贝技术实现程序的设 计过程。在设计中,将零拷贝技术的实现划分为网络设备内存到内核内存映射和内核内 存到应用程序内存映射两部分,并在编写l i n u x 网络设备驱动程序的基础上通过p r o c 文件系统和m m a p 函数完成了内核内存到应用程序内存映射的实现,完成的软件模块不 但可以完成普通网络驱动程序的局域网p i n g 操作,还可以实现内核内存的映射、输出。 该解决方案针对l i n u x 系统平台内核版本2 6 1 l ,采用l i n u x 内核模块设计机制, 这样不但有利于与l i n u x 操作系统结合,并且有利于程序模块的开发、维护和测试。最 后给出了实验方法和测试结果。测试结果表明,模块和程序运行稳定,达到了预期的目 的。 关键词:驱动程序,零拷贝,t c p i p 协议栈,d m a ,m m a p ,p r o e ,i i 东北大学硕士学位论文 a b s t r a c t t h e i m p l e m e n t a t i o nm e t h o d o fz e r o c o p yt e c h n o l o g yw i t h t h eo p t i m i z a t o no ft c p i pi nt h eh i g hs p e e dn e t w o r k e n v i r o n m e n t a bs t r a c t d u et ot h ea p p e a r a n c eo fh i g hs p e e dn e t w o r k s ,e s p e c i a l l yw h e nt h es p e e do fn e t w o r k l i n ki sh i g h e rt h a nt h a tt h ec p u p r o c e s s e st h et c p i pp r o t o c o l ss t a c k ,t h eb o t t l e n e c ko f i m p r o v i n gt c p i pp e r f o r m a n c eh a sm o v e df r o mt h en e t w o r k t ot h ec p uo ft h eh o s tc o m p u t e r t h es o l u t i o n sf o rt h i sp r o b l e ma r em a i n l yd i v i d e di n t ot w ot y p e s :t h ef i r s to n ei si m p r o v i n g t h ep e r f o r m a n c eo fn i c ( n e t w o r ki n t e r f a c ec a r d ) i n t e l l i g e n tn i ch a sp r o g r a m m a b l e p r o c e s s o ra n dm e m o r y , s oi tc a l lu n d e r t a k ep a r to ra l lo ft h em e s s a g em a n a g e m e n tt a s k so f t h e h o s tc o m p u t e r t h em a i nt e c h n o l o g yi st c p i po f f l o a de n g i n e ( t o e ) a n ds oo n t h es e c o n d o n ei st h a ts o m eu s e rl e v e ln e t w o r kp r o t o c o l sr e m o v et h ek e r n e lf r o mt h ek e ym e s s a g ep a t h t h i sm e a n sp a r to ra l lo ft h ep r o t o c o l sw i l lm o v ef r o mt h ek e r n e ls p a c et ot h eu s e rs p a c e ,f o r e x a m p l e ,u - n e tt h a tf i r s ti m p l e m e n t sz e r o - c o p ya n dr e c e n t l yt h er d m a ,d d pp r o t o c 0 1 b a s e do nt o e ,z e r o c o p yt e c h n o l o g y , a n do t h e r sr e s e a r c hr e s u l t s ,t h i st h e s i sf o c u s e so n t h ez e r o c o p yp r i n c i p l ea n di m p l e m e n t a t i o nm e t h o df o rl i n u xn e t w o r kd e v i c ed r i v e r t h e z e r o - c o p ym e t h o dp r o p o s e di nt h i st h e s i sc a nb eu s e dt os o l v et h ep r o b l e m sf a c e db yt h e t h et h e s i si n v e s t i g a t e st h ea r c h i t e c t u r ea n df u n c t i o no fl i n u xn e t w o r kd e v i c ed r i v e ra n d t h o r o u g h l ya n a l y z e s t h e z e r o c o p yt e c h n o l o g y f r o mt h e o r yt o i m p l e m e n t a t i o n a f t e r i n t r o d u c i n gl i n u xk e r n e lm o d u l em e c h a n i s m( l k mm e c h a n i s m ) ,l i n u xn e t w o r kd e v i c e d r i v e r , a n dz e r o - c o p yt e c h n o l o g y , t h et h e s i sd e s c r i b e st h ed e s i g no ft h ed r i v e rm o d u l ea n dt h e z e r o c o p yi m p l e m e n t a t i o np a r t i c u l a r l y i nt h ed e s i g n , id i v i d e t h ei m p l e m e n t a t i o no f z e r o c o p yi n t ot w op a r t s :t h em a p p i n gf r o mn e t w o r kd e v i c em e m o r yt ok e r n e lm e m o r ya n d f r o mk e r n e lm e m o r yt oa p p l i c a t i o nm e m o r y t h es e c o n dm a p p i n gi si m p l e m e n t e db a s e do n p r o g r a m m i n gn e t w o r kd e v i c ed r i v e ru s i n gt h ep r o cf i l es y s t e ma n dt h em m a pf u n c t i o n t h e a c c o m p l i s h e ds o f t w a r em o d u l ec a nn o to n l ye x e c u t et h en o r m a lo p e r a t i o n so fn e t w o r kd e v i c e d r i v e ri nl a n ,b u ta l s oi m p l e m e n tk e r n e lm e m o r ym a p p i n ga n do u t p u t t i n g t h es o l u t i o ni sf o rl i n u xk e r n e le d i t i o n2 6 11 b yu s i n gl i n u xk e r n e lm o d u l e i i i 东北大学硕士学位论文 a b s t r a c t m e c h a n i s m ,i ti sn o to n l ye a s yt oc o m b i n ew i t hl i n u xb u ta l s oe a s yt od e v e l o p ,m a i n t a i n ,a n d t e s t f i n a l l y , t h et e s tm e t h o da n dr e s u l t sa r eg i v e n t h er e s u l t si n d i c a t et h a tt h es o f t w a r e m o d u l er u n ss t a b l ya n dm e e t st h ea n t i c i p a t i o n k e y w o r d s :d r i v e r , z e r o c o p y , t c p i pp r o t o c o l ss t a c k ,d m a ,m m a p ,p r o c i v 独创性声明 本人声明所呈交的学位论文是在导师的指导下完成的。论文中取得的 研究成果除加以标注和致谢的地方外,不包含其他人已经发表或撰写过的 研究成果,也不包括本人为获得其他学位而使用过的材料。与我一同工作 的同志对本研究所做的任何贡献均己在论文中作了明确的说明并表示谢 :此 思。 学位论文作者签名:现象 e l期: 一牟1 日一 学位论文版权使用授权书 本学位论文作者和指导教师完全了解东北大学有关保留、使用学位论文 的规定:即学校有权保留并向国家有关部门或机构送交论文的复印件和磁 盘,允许论文被查阅和借阅。本人同意东北大学可以将学位论文的全部或 部分内容编入有关数据库进行检索、交流。 ( 如作者和导师同意网上交流,请在下方签名;否则视为不同意。) 学位论文作者签名:导师签名: 签字日期:签字日期: 东北大学硕士学位论文第一章引言 第一章引言 1 1 课题研究背景与意义 i n t e m e t i n t r a n e t 的快速发展,极大地推动了网络通信技术、传输模式和传输内容的 发展变化。从2 0 世纪8 0 年代起,作为主流局域网技术的以太网由最初的l o m b i t s 带宽, 发展到1 0 0 m b i t s ,后来又发展到1 0 0 0 m b i 珧,直到现在的万兆( 1 0 g b i t s ) 以太网,带 宽和运行速度提高了3 个数量级【1 】。在同一期间,常用广域网的传输速率也由几十k b i t s , 发展到l o g b i t s 以上。 t c p i p 是目前占据主导地位的网络协议,在i n t e m e v i n t r a n e t 上广泛应用。不幸的是, 基于软件进行协议处理的t c p a p 协议,使c p u 承担了很大负载。随着网络速度的快速 提升,传统的网络数据包处理已经成为整个系统的性能瓶颈,这是因为整个处理过程需 要经过网络设备到系统内存空间,系统内存空间到用户应用程序空间这两次拷贝,同时 用户还需要向系统发出系统调用。根据i n t e l 的数据统计,由于数据拷贝及其引起的相 关开销( 如中断,校验等操作) 占系统总开销的6 9 2 1 ,l i n u x 与f r e e b s d 组成的点对 点通信中,数据拷贝、上下文切换和链路层操作在当数据长度分别为6 4 7 6 8 字节和1 4 6 0 字节时,占总开销的约6 2 7 1 3 。因此消除无用的数据拷贝是提升系统整体性能的关 键步骤。目前,低延迟、高带宽的通信系统研究发展很快。由于直接存取的支持,用户 空间与n i c 之间的数据传输可以不经过数据拷贝和操作系统的干涉。在面向大规模宽带 网络入侵检测系统、大流量网络数据下的网络协议分析、宽带网络防火墙、高性能通信 系统、高性能路由器、主机路由器、端到端通信系统、虚拟机系统开销测量【4 】等领域中, 零拷贝的实现都具有举足轻重的作用。 为了提高系统性能,国内外的一些科研机构对零拷贝实现进行了深入研究,比如 u n e t 5 1 、r d m a 6 和d d p 7 协议等,本文描述的零拷贝实现中将其划分为两个主要方 面:消除网络设备到系统内存空间拷贝和消除系统内存空间到用户应用程序空间拷贝。 两者的主要实现技术包括d m a ( d i r e c tm e m o r y a c c e s s ) 和内存映射技术。在本论文中 主要研究通过内存映射技术消除数据拷贝。 本课题来源于辽宁省自然基金项目,遵循实用性与先进性、高度机动性与可扩充性、 安全性与可维护性、高可靠性与稳定性的原则,综合考虑当前高速网络处理数据的需要, 为整个项目提供高效、便捷、功能完善的系统与网络底层接口。虽然本项目属于前瞻性 东北大学硕士学位论丈第一章引言 科研课题,以研究为主,但如果将研究成果转化为产品的话,具有很广泛的应用基础和 市场前景。本课题作为该项目的前期工作,侧重于对网络数据处理流程的分析,并提出 一个功能完善、运行高效的总体设计方案,为后期硬件产品的设计和实现打下良好的基 础。 本文以l i n u x 内核模块机制、l i n u x 网络设备驱动程序、零拷贝技术为基础,参考 了国内外先进的研究成果,重点研究了高性能网络设备驱动程序及零拷贝技术实现代 码,为该项目的实现做了充分的前期准备。 1 2 研究内容 在本课题的研究当中,我将零拷贝内存映射实现与网络设备驱动程序结合到一个内 核模块中加以实现,编写的模块实现了简单的将内核内存映射到应用程序空间和模拟局 域网内两台主机实现p i n g 操作的功能,但由于零拷贝实现还包括在接收网络分组时直接 通过d m a 技术将数据存储到内核内存中,这会涉及到复杂的硬件知识和实现机制,因 此,该模块还可以实现更加复杂的功能并达到更高的性能。 本文先根据实际的应用需求实现了一个可以完成网络分组接收和发送、设置网络设 备参数等多项功能的网络设备驱动程序模块,之后在这个模块的基础上实现了零拷贝的 一部分内核空间内存到应用程序空间的映射,其中使用的主要技术是p r o c 文件系 统和m m a p 函数相结合的方法。为了解决多个应用程序互斥访问映射存储空间的问题, 还设计了专门的读写指针结构来对其进行解决。 最后通过在l i n u x 系统平台加载驱动程序模块和编写测试程序读取并输出映射存储 空间内容与事先写入的内容进行比较来验证设计的正确性。 1 3 可行性分析 设计和开发具有高可用性并且实现了零拷贝技术的网络设备驱动程序模块具有一 定的可行性。 国外主流数据通讯设备供应商提供的网络设备设计与开发方案提供了良好的功能 和设计上的参考与借鉴;随着新一代基于t o e 技术实现的网络设备的出现,使建立功 能更为复杂、性能更为出色的使用零拷贝技术的网络数据处理架构成为可能。最后依据 本项目背景,应用了零拷贝技术的网络设备和系统平台在电信运营商、网络信息中心等 商业领域中有着广泛的应用前景。 鉴于现阶段本课题的主要任务是为了将部分t c p i p 协议栈功能卸载到硬件上进行 东北大学硕士学位论文第一章引言 底层处理,设计、实现协议卸载硬件和操作系统的连接接口,并非实现最终产品,因此 选择开放式的操作系统平台进行软件模块的研究、设计和开发是一种理想的选择。l i n u x 作为开放源代码的操作系统,为系统的设计提供了一个很好的试验平台,并且由于本系 统的实现都是在操作系统级别,而随着l i n u x 操作系统近年应用的逐渐升温,积累了很 多开发文档,这些都为系统的开发提供了便利。因而我们采用高性能p c 机和l i n u x 操 作系统作为开发平台,通过l i n u x 系统的内核模块机制实现了软件模块的设计、开发与 调试。 1 4 本人完成的工作 在项目课题的研究与实现过程中,本人独立完成的工作包括: 1 ) 对l i n l l x 系统内核模块机制的研究; ( 2 ) 对已有的l i n u x 系统网络设备驱动程序总体框架、功能和相关数据结构的研究; ( 3 ) 为了优化系统对网络数据处理的速度和提高整个系统的性能,在网络设备驱动程 序的基础上部分实现了零拷贝技术; ( 4 ) 零拷贝内存映射功能部分的实现和网络设备驱动程序模块的设计与编码; ( 5 ) 验证零拷贝功能是否成功实现和对网络设备驱动程序功能测试的程序编码。 1 5 论文的组织结构 根据研究过程中所涉及到的内容和系统实现的步骤,本论文分为以下六个部分: 第一童:介绍了零拷贝技术的需求背景,对高速网络环境下系统性能瓶颈进行了分 析,并介绍了本课题的研究内容,及本人所作的工作; 第二章:分析了l i n u x 内核模块机制、l i n u x 网络设备驱动程序的总体框架和具体 功能实现和零拷贝技术原理; 第三章:给出了实现零拷贝技术的网络设备驱动程序模块的总体设计: 第四章:详细介绍了网络设备驱动程序和零拷贝功能的设计与实现; 第五章:介绍了测试程序的具体设计及驱动程序模块和零拷贝功能的测试结果; 第六章:对本论文所做的内容进行了总结,并就本课题的后续工作进行了展望。 第六章:对本论文所做的内容进行了总结,并就本课题的后续工作进行了展望。 东北大学硕士学位论文 第二章技术基础与设计原理 第二章技术基础与设计原理 本章重点介绍了编写网络设备驱动程序和实现零拷贝技术所需要的基础知识,其中 包括l i n u x 内核模块机制、l i n u x 系统平台网络设备驱动程序框架和功能分析及在本论 文中实现零拷贝技术所需的p r o c 文件系统、m m a p 函数,最后介绍了作为课题继续 研究基础的d m a 技术。 2 1l i n u x 内核模块机制分析 2 1 1 内核模块概念 内核模块是一些可以让操作系统内核在需要时载入和执行的代码,它可以在不需要 时由操作系统卸载,它扩展了操作系统内核的功能但不需要重新启动系统。例如:设备 驱动程序模块就是一种内核模块,它用来让操作系统正确识别、使用安装在系统上的硬 件设备。如果没有内核模块,就只能通过重新编译生成单内核操作系统的内核镜像来加 入新功能,但这样的话内核会因为需要实现很多功能而变得非常庞大。 2 1 2 内核模块装入 可以执行l s m o d 命令来查看内核已经加载了哪些内核模块,该命令通过读取 p r o c m o d u l e s 文件内容来获得需要的信息。 内核模块调入内核的过程是:当操作系统内核需要的扩展功能不存在时,内核模块 管理守护进程k m o d ( 在早期的l i n u x 版本中,是个名为k e m e l d 的守护进程) 执行 m o d p r o b e 去加载内核模块,这需要传递给m o d p r o b e 两个参数,它们分别是:内核模块 的名字像s o f f d o g 或p p p 和通用识别符,例如c h a r - m a j o r - 1 0 - 3 0 。 当传递给m o d p r o b e 通用识别符时,m o d p r o b e 首先在文件e t c m o d u l e s c o n f 查找该字 符串。如果发现类似下面的语句: a l i a sc h a r - m a j o r - 10 3 0s o f f d o g 这段内容的作用是表明通用识别符指向内核模块s o f t d o g 0 。 然后,m o d p r o b e 遍历文件l i b m o d u l e s v e r s i o n m o d u l e s d e p 来判断是否有其它内核模 块需要在该模块加载前被加载。该文件由命令d e p m o d a 建立,负责保存内核模块的依 赖关系。例如,m s d o s 0 模块依赖于f a t 0 内核模块是否已经被内核载入。当要加载的内 东北大学硕士学位论文 第二章技术基础与设计原理 核模块需要使用别的模块提供的符号链接时( 比如变量或函数) ,那么那些提供这些符 号链接的内核模块就被该模块所依赖。 最后t o o d p r o b e 调用i n s m o d 先加载被依赖的模块,然后加载被内核要求的模块。 m o d p r o b e 将i n s m o d 指向l i b m o d u l e s v e r s i o n 目录,该目录为默认标准存放内核模块的目 录。所以在载入一个内核模块时,需要执行下列命令: i n s m o d l i b m o d u l e s 2 5 1 k e m e l f s f a t f a t 0 i n s m o d l i b m o d u l e s 2 5 1 l 【e m e l f s m s d o s m s d o s 0 或执行“m o d p r o b e am s d o s “。 l i n u x 通过一个叫做r n o d u t i l s 或m o d m i l s 的工具包提供m o d p r o b e ,i n s m o d 和 d e p m o d 。 下面是一个具体的e t c m o d u l e s c o r f f 文件: # t h i sf i l ei sa u t o m a t i c a l l yg e n e r a t e db yu d a t e m o d u l e s p a t h m i s c = l i b m o d u l e s 2 4 ? l o c a l k e e p p a t h n e t = - - 一p m y m o d u l e s o p t i o n sm y d r i v e ri r q = 10 a l i a se t h 0e e p r o 用群起始的行为注释,空白行被忽略。 以p a t h m i s t 起始的行表明m o d p r o b e 用l i b m o d u l e s 2 4 ? l o c a l 代替搜寻m i s e 内核模 块的路径。 以p a t h n e t 起始的行表明m o d p r o b e 在目录一p m y m o d u l e s 搜索网络方面的内核模块。 但是在p a t h n e t 指令之前使用的k e e p 命令表明m o d p r o b e 只是将该路径添加到标准搜索 路径中,而不是进行替换。 以a l i a s 起始的行的作用是当k m o d 以通用识别符e t h 0 要求加载相应内核模块时, 使m o d p r o b e 加载e e p r o o 。 在文件e t c m o d u l e s c o n f 中不会发现像“a l i a sb l o c k m a j o r - 2f l o p p y “这样的别名行,因 为m o d p r o b e 已经知道了绝大多数系统上安装的标准设备的驱动模块。 为了编写自己的模块,还需要了解其他一些细节。 内核模块和内核的版本问题: 系统彼此之间的不同会导致许多困难。如果内核中打开了 c o n f i gm o d v e r s i o n s 选项,那么为某个版本编译的模块将不能被另一个版本的内 东北大学硕士学位论文 第二章技术基础与设计原理 核加载。目前绝大多数的发行版是将该选项打开的,所以如果遇到和版本相关的错误时, 最好重新编译一个关闭该选项的内核。 使用x w i n d o w s 带来的问题: 一般在控制台下编译、加载模块,而不在x w i n d o w s 下进行。 这是因为模块不能像p r i n t k ( ) 函数那样输出结果到屏幕,但却可以记录信息和警告, 只有在使用控制台时这些信息才能显示在屏幕上。如果从x t e r m 中i n s m o d 一个模块,这 些日志信息只会记录在日志文件中,除了查看日志文件外无法得到输出信息。所以说想 要及时的获得这些日志信息,最好所有工作都在控制台下进行。 编译相关问题: l i n u x 的发行版经常给内核打一些非标准的补丁,这种情况会导致发生一些问题。 一个更严重的问题是一些l i n u x 发行版提供的头文件不完整,这样编译模块时就会发生 缺少头文件的问题。因此在开始工作前首先要做的是从l i n u x 镜像站点下载源代码包, 编译新内核并用新内核启动系统来避免以上问题。 编译一个新的内核可以打开内核中一些有用的排错功能,像强制卸载模块 ( m o d u l ef o r c eu n l o a d ) :当该选项被打开时,可以通过命令r m m o d f m o d u l e 强制内核卸载一个模块,虽然这样做内核会给出不安全的警告,但如果按照加载一测试 一卸载一修改一再加载的循环过程来修改、测试模块,可以节省大量的时间【8 1 。 2 。1 3 内核模块的编写 下面我们看一个在内核版本2 6 1 1 上编写的最简单的“h e l l ow o r l d 模块,通过它来 了解如何编写内核模块。 # i n c l u d e # i n c l u d e # i n c l u d e # d e f m ed r e ra u t h o r 驱动作者 # d e f i n ed r i v e rd e s c 对驱动程序功能的一个简要描述 s t a t i ci n t i n i th e l l o _ i n i t ( v o i d ) p r i n t k ( k e r n _ a l e r t h e l l o ,w o r l d h ) ; r e t u mo ; s t a t i cv o i d e x i th e l l oe x i t ( v o i d ) 7 东北大学硕士学位论文 第二章技术基础与设计原理 p r i n t k ( k e r n _ a l e r t “g o o d b y e ,w o r l d w ) ; r e t u r n ; ) m o d u l e i n i t ( h e l l o _ i n i t ) ; m o d u l e e x i t ( h e l l o _ e x i t ) ; 通过声明g p l 代码摆脱污染信息 m o d u l e _ l i c e n s e ( g p l ) ; m o d u l e _ a u t h o r ( d r i v e r _ a u t h o r ) ;模块作者 m o d u l e _ d e s c r i p t i o n ( d r i v e r _ d e s c ) ;对模块功能的描述 这个模块使用d e v t e s t d e v i c e 。m o d u l es u p p o r t e dd e v i c e 宏可能在将来用 于模块的自动配置,但是现在它除了记录文档的目的以外没什么用。 m o d u l e _ s u p p o r t e d _ d e v i c e ( t e s t d e v i c e ) ; 一个内核模块至少应该包含两个函数。一个“开始”( 初始化) 函数称为i n i tm o d u l e ( ) , 还有一个“结束”( 做一些收尾清理的工作) 函数称为c l e a n u p _ m o d u l e 0 ,当内核模块被 r m m o d 卸载时执行。函数i n i tm o d u l e 0 的一般功能是或者向内核注册它可以处理的事物, 或者用它的代码替代某个内核函数( 代码通常这样做然后再去调用原来的函数代码) 。 函数c l e a n u p _ m o d u l e 0 负责撤消所有在i n i tm o d u l e o d p 所做的事,从而使内核模块可以被 安全卸载。 实际上从内核版本2 3 1 3 开始这种情况有些改变。在内核l i n u x2 6 中,可以为模 块的“开始”和“结束”函数起任意的名字,而不必再使用i n i t m o d u l e 和c l e a n u p _ m o d u l e , 在上面这个程序中我们就使用了h e l l oi n i t 和h e l l oe x i t ,这可以通过宏m o d u l ei n i t ( ) 和 m o d u l e 实现。这些宏在头文件中定义。唯一需要注意的地方是函数必 须在宏的e x 使i t 用( ) 前定义,否则会出现编l 译i n u 错x 误i n i 。t h 这个新方法是推荐的实现方法,但是使用i n i tm o d u l e 和c l e a n u p 作为函数module 名仍然是可以的。 最后,任何一个内核模块需要包含l i n u x m o d u l e h 。当需要使用记录级别宏扩展为 k e r n a l e r t 的p r i n t k o 时,需要包含l i n u x k e m e l h 。p r i n t k o 并不是设计用来与用户交 互的,它实际上是为内核提供日志功能,记录内核信息或用来给出警告。因此,每个 p r i n t k 0 声明都会带一个优先级,内核总共定义了八个优先级,其中就包括 k e r na l e r t 。如果不指明优先级,将会使用默认优先级 东北大学硕士学位论文第二章技术基础与设计原理 d e f a u l t m e s s a g e l o g l e v e l 。 当优先级高于i n tc o n s o l e _ l o g l e v e l 时,信息将直接打印在终端上。如果同时s y s l o g d 和k l o g d 都在运行,不管是否显示在控制台上,信息也被同时添加到文件 v a r l o g m e s s a g e s 。在模块中使用k e r n _ a l e r t 这样的高优先级的目的是为了确保 p r i n t k o 不光将信息添加到日志文件中还要将信息输出到控制台。 2 1 3 1 关于i n i t 和e x i t 宏 这是自内核2 2 以后引入的一个新特性,它们被添加在“开始”和“结束”函数的函数 名前。 如果该模块被编译进内核而不是动态加载,宏i n i t 的作用是在初始化完成后丢弃 “开始”函数并收回其所占内存。宏i n i t d a t a 同i n i t 类似,不过它指针对变量。如果该 模块被编译进内核,宏 e x i t 将忽略“结束”函数。同宏一i n i t 一样,它对动态加载模块 也是无效的。这是因为编译迸内核的模块是没有完成清理收尾工作的必要的,而动态加 载的模块却需要自己完成这些工作。 这些宏在头文件l i n u x i n i t h 定义,用来释放内核占用的内存。在启动时看到“f r e e i n g u n u s e dk e m e lm e m o r y :2 3 6 kf r e e d ”这样的内核输出,那正是内核所释放的。 2 1 4 编译内核模块 内核模块在用g c c 编译时需要使用特定的参数。另外,一些宏也需要定义。 这是 因为在编译生成可执行文件和内核模块时,内核头文件起的作用是不同的。以前的内核 版本需要在m a k e f i l e 中手动设置。尽管这些m a k e f i l e 是按目录分层次安排的,但是其中 却有许多重复,导致代码树大并且难以维护。一种称为k b u i l d 的方法使外部可加载内核 模块的编译方法同内核编译统一起来。 下面是一个编译叫做h e l l o 1 c 的模块的简单m a k e f i l e 文件: o b j m + = h e l l o 一1 o 现在可以通过执行命令m a k e c u s r s r c l i n u x 、u r l a m e r s u b d r s = $ p w dm o d u l e s 编译模块,会得到下面类似的屏幕输出: r o o t p c s e n o n s r vt e s t _ m o d u e # m a k e - c u s r s r c l i n u x 一、u n a m e s u b d i r s = s p w d m o d u l e s m a k e :e n t e r i n gd i r e c t o r y u s r s r c l i n u x 一2 。6 。x c c m r o o t t e s t m o d u l e h e l l o - 1 o b u i l d i n gm o d u l e s ,s t a g e2 m o d p o s t 9 东北大学硕士学位论文第二章技术基础与设计原理 c c r o o t t e s t m o d u l e h e l l o 1 m o d o l d m 】r o o t t e s t m o d u l e h e l l o 一1 k o m a k e :l e a v i n gd i r e c t o r y u s r s r c l i n u x - 2 6 x 2 6 内核引入了一种新的内核模块命名规范:内核模块现在使用k o 的文件名后缀( 代 替以往的o 后缀) ,这样内核模块就可以同普通的目标文件( 后缀为o ) 区别开。 现在可以使用i n s m o d h e l l o 1 k 0 命令加载模块。 所有已经被加载的内核模块都列在文件p r o c m o d u l e s 中,c a t 一下这个文件可以了 解模块是否真的被加载到内核中,最后使用命令r m m o dh e l l o 1 卸载模块,再看一下 v a r l o g m e s s a g e s 文件是否有相关的日志内容。 如果使用的是2 4 或更新的内核,在加载模块时,也许会出现下面这些输出信息: 拌i n s m o dh e l l o 3 o w a r n i n g :l o a d i n gh e l l o 一3 ow i l lt a i n tt h ek e r n e l :n ol i c e n s e h e l l o ,w o r l d3 m o d u l eh e l l o 一3l o a d e d ,w i n lw a r n i n g s 这是因为在这些内核中一种识别代码是否在g p l 许可下发布的机制被引入,如果 使用非公开的源代码将会得到警告。这可以通过宏m o d u l el i c e n s e 0 设置在g p l 证 书下发布代码来取消这些警告。这种证书机制在头文件l i n u x m o d u l e h 中实现,同时还 有一些相关文档信息。 类似的,宏m o d u l e _ d e s c r i p t i o n 0 用来声明模块的用途。宏 m o d u l ea u t h o r 0 用来声明模块的作者。宏m o d u l e _ s u p p o r t e d _ d e v i c e 0 用来 声明模块支持的设备。 这些宏都在头文件l i n u x m o d u l e h 中定义,并且内核本身不使用这些宏,它们只是 用来提供识别信息。 2 1 5 传递参数给内核模块 模块也可以从命令行获取参数,但不是通过以前c 语言中习惯的a r g e 、a r g v 方式。 要传递参数给模块,首先将获取参数值的变量声明为全局变量。然后使用宏 m o d u l ep 删o ( 在头文件l i n u x m o d u l e h 中声明) 。在模块运行时i n s m o d 将给变 量赋予命令行参数,如i n s m o dm y m o d u l e k om y v a r i a b l e = 5 。为使代码清晰,变量的声 明和宏都应该放在模块代码的开始部分。下面的代码例子可以对此予以说明: h a t m y i m = 3 ; c h a r 承m y s t r ; - 10 东北大学硕士学位论文第二章技术基础与设计原理 m o d u l e _ p a r m ( m y i n t ,“i ,) ; m o d u l e _ p a r m _ d e s c ( m y i n t ,“a ni n t e g e r ) ; m o d u l e _ p a r m ( m y s t r ,“s ”) ; m o d u l e p a r m _ d e s c ( m y s t r ,“ac h a r a c t e rs t r i n g ) ; 宏m o d u l ep a r m 0 需要两个参数,变量的名字和其类型。支持的类型有b :比 特型,“h ,:短整型,“i ,:整数型,“l ”:长整型和“s ”:字符串型,其中整数既可为s i g n e d 也可为u n s i g n e d 。字符串类型应该声明为”c h a r 扣,这样i n s m o d 就可以为它们分配内存 空间,并且要为变量赋初值。 最后,宏m o d u l ep a r m 用来描述该模块接收的参数。该宏需要两个参 数:变量名和一个格式自由的对_ 该d e 变s 量c 0 的描述。 2 2l i n u x 网络设备驱动程序结构分析和功能介绍 无论什么操作系统的驱动程序都有一些通用的概念。操作系统提供给驱动程序的支 持也大致相同。由于在本课题中我所做的工作包括l i n u x 系统网络设备驱动程序的研究 并且它也是实现零拷贝技术的基础,所以在这里简要介绍一下它的基本框架、功能和编 写时需要注意的事项。 l i n u x 设备驱动程序在内核源代码中占有很大比例,源代码长度的日益增加,其中 主要是驱动程序的增加。在l i n u x 内核的不断升级过程中,驱动程序的结构还是相对保 持稳定的。在2 4 x x 到2 6 x x 的变动里,驱动程序的编写做了一些改变,但是驱动从2 4 x x 到2 6 x x 的移植只需做少量的工作。 l i n u x 系统中将所有设备都看成文件,都纳入文件系统的范围内,都通过文件操作 的界面进行操作。这就意味着: ( 1 ) 每一项设备都至少由文件系统中的一个文件( 更确切地说是节点) 所代表,因 而都有一个“文件名”。每个这样的“设备文件”都唯一地确定了系统中的一项设备。应用 程序通过设备的文件名查找和访问具体的设备,而设备则像普通文件一样受到文件系统 访问权限控制机制的保护。 ( 2 ) 应用程序通常可以通过系统调用o p e n 0 “打开”设备文件,建立起与目标设备的 连接,也叫“上下文”。代表着该设备的文件节点中记载着建立这种连接所需的信息。对 于执行该应用程序的进程而言,建立起的连接就表现为一个已打开的文件。 ( 3 ) 打开了代表着目标设备的文件,即建立起与设备的连接以后,就可以通过 r e a d ( ) 、w r i t e o 、i o c t l 0 等常规的文件操作对目标设备进行操作。从应用程序的角度看, 东北大学硕士学位论文 第二章技术基础
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年《劳动关系协调员》考试模拟练习题与答案
- 跨国公司汇率套期保值-第1篇-洞察与解读
- 2025年事业单位招聘考试综合类职业能力倾向测验真题模拟试卷:财务管理与审计
- 2025年事业单位招聘考试综合类专业能力测试试卷(艺术设计类)真题模拟考前押题卷解析及答案
- 红学分班考试试卷及答案
- 鹤壁电工证考试题及答案
- 2025年中国无压轮胎行业市场分析及投资价值评估前景预测报告
- 线控底盘知识培训总结
- 北师大版八年级上学期数学第三章位置与坐标第3节轴对称与坐标变化练习题(含答案)
- 2025国考本溪市司法行政岗位申论预测卷及答案
- 5.2 诚实守信 课件-2025-2026学年统编版道德与法治八年级上册
- 2026中科信公司校园招聘笔试模拟试题及答案解析
- 2025-2026学年第一学期苏教版二年级数学上册第一单元测试卷及答案
- 宿州市中石化2025秋招面试半结构化模拟题及答案炼油工艺技术岗
- Unit5MyhouseLesson1(课件)-剑桥国际少儿英语Kids'box预备级
- 2025山西阳泉平定县县属国有企业招聘100人笔试备考试题及答案解析
- 第五单元漫步经典第4课时《第九十四(惊愕)交响曲》教学设计-西大版初中音乐八年级上册
- 盐酸吉卡昔替尼片-临床用药解读
- 爱国教育主题班会课件:看中华崛起展少年担当
- 2025年营造林监理工程师试题
- 中国心房颤动管理指南(2025)解读
评论
0/150
提交评论