(通信与信息系统专业论文)移动ipv6开源代码从用户空间到内核的移植.pdf_第1页
(通信与信息系统专业论文)移动ipv6开源代码从用户空间到内核的移植.pdf_第2页
(通信与信息系统专业论文)移动ipv6开源代码从用户空间到内核的移植.pdf_第3页
(通信与信息系统专业论文)移动ipv6开源代码从用户空间到内核的移植.pdf_第4页
(通信与信息系统专业论文)移动ipv6开源代码从用户空间到内核的移植.pdf_第5页
已阅读5页,还剩65页未读 继续免费阅读

(通信与信息系统专业论文)移动ipv6开源代码从用户空间到内核的移植.pdf.pdf 免费下载

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

文档简介

摘要 摘要 随着移动互联网的迅速发展,移动i p v 6 将会得到广泛的应用。而目前的移动 i p v 6 协议实现大多在l i n u x 操作系统的用户空间运行,不但运行效率较低,而且 无法在a n d r o i d 等基于l i n u x 内核的操作系统中使用。为了解决这两个问题,本 文将其从用户空间移植到内核中,使大部分基于l i n u x 内核的操作系统都能高效 直接地使用该实现,避免重复开发。 根据软件移植的一般步骤,本文首先从l i n u x 用户空间与内核编程的差异以 及l i n u x 网络协议栈结构特点来分析,确定移植的是可行的。其中用户空间与内 核程序的区别包括启动方式、系统接口、支持函数库等的不同。在内核中可以找 到类似的机制或函数来代替在用户空间中所用到的相关机制与函数。 其次,本文分析了移动i p v 6 开源代码( 即u m i p 程序) 的软件结构以及实现 的具体方式,并将其中需要移植修改的代码分为四类,对不同类型的代码提出了 不同的移植策略。 接着,根据移植策略,本文从启动过程、g l i b 函数库、l i n u x 系统接口以及 其他类型等四个方面来具体描述了移植的方法与过程。其中,g l i b 函数库的移 植包括了文件操作函数、多线程函数、互斥信号等一系列函数的移植;l i n u x 系 统接口移植包括了s y s c t l 文件系统、i o c t l 接口、n e t l i n k 套接字等接口与系统调用 的移植;而其他类型的移植包括了配置文件读取方式的移植等。 在完成了所有代码的移植工作后,本文介绍了如何将移植后的代码加入内核 源代码中,并对移植后的代码进行了编译与调试。由于移植后代码的整体调试工 作量较大,目前调试工作尚未结束。下一步工作是完成调试与测试,并发布移植 后的代码。 关键词t 移动i p v 6 用户空间内核移植 a b s t r a c t a b s t r a c t w i t ht h er a p i dd e v e l o p m e n to fm o b i l ei n t e r n e t ,m o b i l ei p v 6w i l lb ew i d e l yu s e di n t h ef u t u r e b u lc u r r e n t l y ,m o b i l ei p v 6p r o t o c o li m p l e m e n t a t i o n sm o s t l yr u ni nt h eu s e r s p a c eo fl i n u xo p e r a t i n gs y s t e m n o to n l yt h ee f f i c i e n c yo fr u n n i n gi sl o w e r , b u ta l s o t h e yc a n n o tr u ni nt h ea n d r o i do ro t h e rl i n u xk e r n e lb a s e do p e r a t i n gs y s t e m s t o r e s o l v et h e s et w op r o b l e m s ,t h i sp a p e r p o r t st h em o b i l ei p v 6i m p l e m e n t a t i o nf r o mu s e r s p a c et ok e r n e l s ot h a tm o s tl i n u xk e r n e lb a s e do p e r a t i n gs y s t e m sc a nu s et h e i m p l e m e n t a t i o nm o r ee f f e c t i v ea n dd i r e c t l y ,a n da v o i dd u p l i c a t i o no fd e v e l o p m e n t a c c o r d i n gt ot h eg e n e r a ls t e p so fs o f t w a r ep o n i n g ,t h i sp a p e rf i r s t l ya n a l y s e st h e f e a s i b i l i t yo fp o r t i n gc o n s i d e r i n go ft h ef e a t u r eo fl i n u x n e t w o r kp r o t o c o ls t a c ka n dt h e d i f f e r e n c e sb e t w e e nl i n u xu s e rs p a c ea n dl i n u xk e r n e l t h ed i s t i n c t i o no fu s e rs p a c e p r o g r a m sa n dk e r n e lp r o g r a m si n c l u d e ss e v e r a la s p e c t s ,s u c ha sb o o tm o d e ,s y s t e m i n t e r f a c e ,s u p p o r tf u n c t i o n sa n ds o m eo t h e r s a n di nt h ek e r n e lt h e r ea r es o m es i m i l a r m e c h a n i s m so rf u n c t i o n st or e p l a c et h eo n e si nt h eu s e rs p a c e a n ds ow ec a l lk n o w , t h a t t h ep o r t i n gi sf e a s i b l e s e c o n d l y ,t h i sp a p e ra n a l y s e st h em o b i l ei p v 6o p e ns o u r c e ( u m i p ) ss o f t w a r e a r c h i t e c t u r ea n di m p l e m e n t a t i o n t h e nd i v i d et h ec o d ew h i c hn e e d st ob ep o r t e di n t o f o u rt y p e s d i f f e r e n tt y p e su s ed i f f e r e n tp o r t i n gs t r a t e g i e s t h e n ,a c c o r d i n gt ot h ep o r t i n gs t r a t e g i e s ,t h i sp a p e rd e s c r i b e st h es p e c i f i cm e t h o d s a n dp r o c e s s e sf r o mf o u ra s p e c t s ,n a m e l yb o o tm o d e ,g l i bl i b r a r y ,l i n u x s y s t e m i n t e r f a c ea n ds o m eo t h e r s p o r t i n go fg l i bl i b r a r yi n c l u d e st h e p o r t i n go ff i l e m a n i p u l a t i o nf u n c t i o n s ,m u l t i t h r e a d sf u n c t i o n s ,m u t e x ,e t c ;p o r t i n go fl i n u xs y s t e m i n t e r f a c ei n c l u d e st h ep o r t i n go fs y s c t lf i l es y s t e m ,i o c t li n t e r f a c e ,n e t l i n ks o c k c t a n d s o m eo t h e ri n t e r f a c e s ;t h ep o r t i n go fr e s ts t y l e si n c l u d e st h ep o r t i n go f r e a d i n gw a y so f c o n f i g u r a t i o nf i l e ,e t c a tt h ec o m p l e t i o no ft h ep o r t i n g ,t h i sp a p e ri n t r o d u c e sh o wt oa d dt h ec o d ew h i c h h a sb e e np o r t e di n t ot h el i n u xk e r n e ls o u r c e t h e nc o m p i l e a n dd e b u gt h ec o d e b e c a u s e o ft h ed e b u g g i n gw o r k l o a di sm u c hb i g g e r , t h ed e b u g g i n gw o r ki sn o to v e ry e t t h e n e x ts t e pi st o c o m p l e t e t h e d e b u g g i n ga n dt e s t i n g ,a n d t h e nr e l e a s et h en e w i m p l e m e n t a t i o n k e y w o r d :m o b i l ei p v 6 u s e rm o d ek e r n e l p o r t i n g 第一章绪论 第一章绪论 1 1 研究背景及意义 目前物联网及智能手机等移动设备正在迅速普及,移动互联网将是下一个 高速增长的产业。为了使i p v 6 适应于移动环境,如w i f i 、3 g 、4 g 网络等,i p v 6 的移动扩展便应运而生了。现有的移动i p v 6 实现基本上都基于r f c 3 7 7 5 【l j ,目 前已有了数个在不同操作系统上开发出来的移动i p v 6 实验系统。例如w i n d o w s 下的m i c r o s o f tm i p v 6p r o j e c t 实验系统、l i n u x 下的l a i l c a s t e r 【2 1 移动i p v 6 、u s a g i 下的m i p l t 3 1 移动i p v 6 实验系统以及f r e e b s d 下k a m ep r o j e c t 【4 】实验系统。下文 中进行移植的目标就是u s a g i 下的m i p l 移动i p v 6 实验系统,其开源代码工程名 为u m i p ( u s a g im o b i l ei p v 6 ) ,在下文中提到的移动i p v 6 开源代码均是指该 开源实现。 移动i p v 6 协议是基于i p v 6 协议扩展而来的,其主要设计目的是使移动节点 在改变无线网络接入点时,不必改变移动节点自身的地址,能够在移动过程中 持续通信,保持通信的连续性。在一个移动i p v 6 网络中,大体有四种不同的功 能实体,包括家乡代理( h o m ea g e n t ) 、移动节点( m o b i l en o d e ) 、通信对 端( c o r r e s p o n d e n t n o d e ) 以及接入路由器( a c c e s sr o u t e r ) ,其中前三种是主要 的功能实体。移动i p v 6 协议的网络实体示意图如图1 1 所示。 家乡地址转交地址 家乡 图1 1 移动i p v 6 的网络实体图 目前,随着移动互联网的迅速发展,各种移动设备以及对应的操作系统也应 运而生,比如基于l i n u x 核心的a n d r o i d 操作系统,其上层应用主要使用j a v a 编 程语言。而目前的u m i p 是基于p c 的l i n u x 平台的在用户空间运行的软件,使 用c 语言编写。要想在a n d r o i d 平台上运行u m i p 的话则有两种方法。其一是使 用j a v a 在a n d r o i d 平台上重新开发一个移动i p v 6 版本,其二就是将移动i p v 6 移 2 移动i p v 6 开源代码从用户空间到内核的移植 植到内核中运行。软件移植不需要进行市场调研、概要设计等步骤,可以直接沿 用源代码的程序框架。一般来讲,软件移植相对于同软件的重新开发所付出成本 要小很多,实际上有很多企业正是运用了软件移植的方法来利用原有的系统使其 满足新的需求。而且关键的一点是,只要是使用l i n u x 内核的操作系统,该软件 移植到内核之后仅需做很少的改动变可使用,但对于上层的用户空间则不一样, 不同的操作系统可能区别很大,因此可能需要开发多次,这无疑也增加了成本。 因此,移植u m i p 到内核中是为了避免不必要的重复开发,并节约成本。 另外,c 语言相对于解释性语言有更好的性能。倘若要在a n d r o i d 上使用 u m i p 软件,如果重新开发一个用户空间的版本的话则需要使用j a v a 语言。j a v a 是一种解释性语言,其编译出的文件为字节码文件,运行时需要再由j a v a 虚拟机 ( m ) 来将其转换成二进制文件然后再运行。而c 语言编译出来的程序直接就 是二进制文件,不需要再加道转换的过程。因此相对来说,j a v a 版本的程序大体 上执行效率都没有c 语言版本的程序高。而l i n u x 内核则使用c 语言,因此 u m i p 在内核层中使用c 语言编译的程序文件运行其效率会比在用户空间使用 j a v a 运行效率高。同时,原程序为c 语言编写,若移植到a n d r o i d 用户空间运 行,需要改为j a v a 语言,也增加了移植的难度与成本。而且,对于l i n u x 来说, 程序在用户空间运行的效率没有在内核运行的效率高。所以将u m i p 移植到 l i n u x 内核不仅可以避免程序性能的下降,反而能够获得一定的性能的提升。 因此,将移动i p v 6 的开源实现u m i p 程序从用户空间移植到内核是有必要的 且有利的。 1 2 软件移植的过程 一般来说,软件的移植有以下几个步骤【5 j 1 软件移植的可行性评估 在这个步骤,首先要理解移植的目标。其次,要确定原程序中所使用到原平 台的技术范围。第三,要明确目标平台的限制。最后,要根据以上的分析来做一 个可以移植的列表与不可移植的列表。对于不可移植的列表中的功能,需要先对 原程序的技术规范进行适当修改使其适应新的目标平台,并避免其中的限制。 2 理解原程序 在这个步骤,首先通过阅读原程序的文档来了解该程序的功能。其次,可能 的话还可以研究下该程序的设计方案。第三,确定所有的硬件联系、资源依赖以 及软件的互通性。第四,了解带程序代码的模块结构。第五,阅读代码,理解各 个不同函数的功能以及之间的互相联系。 3 选择目标平台上的开发工具 第一章绪论 在这个步骤,首先要列出原程序所在开发平台上的所有开发工具。其次,再 探讨找出在目标平台上同样能够使用的开发工具。第三,评估可选的移植工具选 项,比如函数库的转换、模拟器等。第四,根据以上几点确定最后的移植工具。 4 验证原设计方案在目标平台的可行性 在这个步骤,强烈考虑保持相同的代码库。其次,确定在目标平台上也能运 行的共同的代码。第三,确定应用程序中的不同层次的代码。第四,再验证原程 序的架构和设计,如果有需要的话可以修改它。第五,对一些在原平台上已知的 错误,如果在目标平台上容易修正的话,可以考虑修正它们。 5 确定移植策略 在这个步骤,首先搭建原程序的运行平台,帮助理解与比较。其次,将代码 与数据类型封装好。第三,选择编写代码策略。第四,不要放弃使用在目标平台 上有意义的技术。第五,提前计划如何处理那些原平台与目标平台架构上的不同 之处。 6 根据移植策略修改代码 在这个步骤,在修改代码的同时,应特别需要注意两点,第一,确定当前的 用户界面在新平台是否能够使用,不能的话则进行相应地修改。第二,确定目标 平台的帮助格式。 7 编译、调试与测试 在这个步骤,要尽早构建出该程序的最小框架,以便出现问题时容易找到问 题所在。第二,如果能记住在哪里做了修改对于调试来说可以简化很多。第三, 这些修改的地方正是在测试中容易出错的地方。 8 打包并发布 最后,如有必要的话要更新在目标平台的相关的文档。之后重新打包移植后 的软件,该软件就可以发布了。 1 3 本文的工作 由于移植的原平台与目标平台均是在l i n u x 系统上,因此会有很多相似之 处,对于某些一般移植的步骤可以省略。 首先,要对u m i p 的移植进行可行性分析,分析在l i n u x 用户空间编程与在 l i n u x 内核编程有何异同点,分析l i n u x 网络协议栈与u m i p 程序所加入的移动 i p v 6 协议的关系,再根据这些异同点与u m i p 程序相结合设计一套移植策略。其 次,需要对u m i p 代码进行修改。根据移植的策略来确定具体的代码修改方法。 接着,还需要对修改后的代码进行编译、调试。在内核中调试不同于在用户空间 调试。目前调试工作尚在进行中,因此移植后的程序还没有发布。 4 移动i p v 6 开源代码从用户空间到内核的移植 本文的结构如下: 第一章介绍了本文的研究背景、研究意义、一般软件的移植过程以及本文的 工作。 第二章分析了从用户空间与内核的不同和l i n u x 网络协议栈的结构特点来分 析移植的可行性。其中用户空与内核的不同包括启动方式、系统调用接口、支持 库等不同。之后在对u m i p 程序代码分析的基础上,提出了四条不同的移植策 略。 第三章根据移植策略,对u m i p 代码从启动过程、g l i b 函数库、l i n u x 系统 接口以及其他类型等四个方面进行了具体的移植修改工作。 第四章介绍了将u m i p 代码加入到l i n u x 内核源码中进行编译的方法,并对 编译后的程序使用p r i n t k 与k p r o b e s 两种方法相结合的方式进行调试。 第五章对全文的工作进行了总结,同时对下一步的工作进行了展望。 第二章移植的可行性分析及移植策略设计5 第二章移植的可行性分析及移植策略设计 2 1 移植的可行性分析 u m i p 运行所需的原系统环境是l i n u x 内核2 6 2 4 ( 用户空间) ,硬件平台是 x 8 6 结构。而移植的目标运行环境为l i n u x 内核2 6 2 4 ( 内核) ,硬件平台是 x 8 6 架构。两者主要的差别是一个是在用户空间运行,一个是在内核运行,而在 硬件平台等方面则相同,因此能否移植的关键在于两个方面,一是用户空间与内 核编程的不同之处能否通过相应的修改达到同样的目的,二是l i n u x 网络协议栈 的结构特点是否支持从用户空间移植到内核。 2 1 1 启动方式的不同 用户空间程序与内核程序最先的一点不同是,用户空间程序的入口与内核模 块的入口不同。 作为用户空间的运行程序,有着最普遍的一种启动退出方式,即在源代码中 必定有m a i n 函数,作为程序的入口,在程序运行时最先加载运行。在m a i n 函数 退出的时候,则程序结束。同时,用户空间程序能够捕捉一些进程信号,能够对 其捕获、识别并进行相应的处理。 信号是u n i x 操作系统中用来通知进程发生了某种事件的一种机制,也被称 为软中断。信号分两种,一些信号可以被捕捉,开发者可以捕获这些信号后作出 相应的操作,也可以忽略这些信号,或者由系统默认处理方式来处理,而另外一 些信号则无法被捕捉,只能由操作系统进行默认的处理流程。接下来重点介绍一 下以下四种信号:s i g h u p 、s i g i n t 、s i g t e r m 、s i g p i p e t e l 。 u n i x 中进程组织结构为会话( s e s s i o n ) 包含一个前台进程组及一个或多个 后台进程组,一个进程组包含多个进程。一个会话可能会有一个会话首进程,而 一个会话首进程可能会有一个控制终端。一个进程组可能会有一个进程组首进 程。进程组首进程的进程i d 与该进程组i d 相等。与终端交互的进程是前台进 程,否则便是后台进程。 s i g h u p 是s i g n a lh a n g u p 的缩写,含义是“中止信号。s i g h u p 会在以下 3 种情况下被发送给相应的进程: 1 、终端关闭时,该信号被发送到s e s s i o n 首进程以及作为j o b 提交的进程( 即 用& 符号提交的进程) 2 、s e s s i o n 首进程退出时,该信号被发送到该s e s s i o n 中的前台进程组中的每 一个进程 6移动i p v 6 开源代码从用户空间到内核的移植 3 、若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止 状态( 收到s i g s t o p 或s i g t s t p 信号) ,该信号会被发送到该进程组中的每一 个进程。 系统对s i g h u p 信号的默认处理是终止收到该信号的进程。所以若程序中没 有捕捉该信号,当收到该信号时,进程就会退出。 当程序执行时按下c t r l + c 键或d e l 键,系统将向程序传递一个s i g i n t 信 号,系统缺省操作是终止程序执行,s i g i n t 经常用于程序失控产生大量屏幕输 出时终止其运行。 s i g t e r m 是一个请求进程终止的信号。当调用命令k i l l 或者k i l l a l l 时默认会 产生这样一个信号发送到进程。它与s i g k i l l 的区别是s i g t e r m 可以被捕捉或 忽略等,而s i g k i l l 无法被捕捉。因此,通常对s i g t e r m 的捕捉允许进程在退 出前进行一些相关的保存清理工作,更加友好地退出。 当进程向一个已经断开的管道的写数据时,会返回一个s i g p i p e 信号,系统 默认处理在收到这个信号后会关闭该进程。 而l i n u x 支持动态加载模块,模块可以在需要时由内核自动加载或者手动加 载模块。其中l i n u x 内核模块( l k m ,l i n u xk e r n e lm o d u l e ) 包含e n t r y 和e x i t 函 数( 在2 6 版本,您可以任意命名这些函数) 作为模块的入口与出口。当向内核 插入模块时,系统调用e n t r y 函数,从内核删除模块时则调用e x i t 函数。因为 e n t r y 和e x i t 函数是用户定义的,所以存在m o d u l e i n i t 和m o d u l e e x i t 宏,用于定 义这些函数属于哪种函数。l k m 还包含一组必要的宏和一组可选的宏,用于定 义模块的许可证、模块的作者、模块的描述等等。 如果使用手动加载模块方式,可以使用i n s m o d ( 插入模块) 命令来启动模块 加载过程。i n s m o d 命令定义需要加载的模块,并调用i n i tm o d u l e 用户空间系统 调用,开始加载过程。2 6 版本内核的i n s m o d 命令经过修改后变得非常简单( 7 0 行代码) ,可以在内核中执行更多工作。i n s m o d 并不进行所有必要的符号解析 ( 处理k e m e l d ) ,它只是通过i n i tm o d u l e 函数将模块二进制文件复制到内核, 然后由内核完成剩余的任务。 i n i tm o d u l e 函数通过系统调用层,进入内核到达内核函数s y s 。i n i t m o d u l e 这是加载模块的主要函数,它利用许多其他函数完成困难的工作。类似地, r m m o d 命令会使d e l e t em o d u l e 执行s y s t e mc a l l 调用,而d e l e t em o d u l e 最终会进 入内核,并调用s y sd e l e t em o d u l e 将模块从内核删除。 由以上分析可知,用户空间的程序的m a i n 函数与内核模块的入口宏 m o d u l ei n i t 功能类似;而信号机制所实现的友好退出等功能,在内核中则可以使 用宏m o d u l ee x i t 来完成,并同时卸载模块,结束其运行。因此,在启动方式 上,用户空间的程序是可以移植到内核中去的。 第二章移植的可行性分析及移植策略设计7 2 1 2 系统调用接口的不同 在用户空间编程可以调用由内核提供的一些交互接口以及系统调用函数。而 这些接口与系统调用原本是为用户空间设计的。 常见的内核与用户空间交互的接e 1 有s y s c t l 文件系统( p r o c s y s 目录) 、i o c t l 系统调用、n e t l i n k 套接字( s o c k e t ) 以及常用的系统调用函数等等【7 1 。 1 s y s c t l 文件系统。 s y s c t l 接口允许用户在用户空间读取或修改内核变量的值。并非所有的内核 变量都能用此接口进行读取或修改,只有内核明确指出的变量对此接口是可见 的。在用户空间可以使用两种方式访问s y s c t l 输出的变量。一种是s y s c t l 系统调 用,另一种是p r o c f s 。当内核支持p r o c f s 时,会在p r o c 中添加一个特殊目录 ( p r o c s y s ) ,为每个由s y s c t l 所输出的内核变量引入一个文件。 p r o c f s 是一个虚拟文件系统,通常挂在p r o c ,其允许内核以文件形式向用户 空间输出内部信息。这些文件并没有实际存在于磁盘中,但是可以通过c a t 或 m o r e 以及 s h e l l 重定向字符予以写入。这些文件甚至可以像真是文件一样指 定其访问权限。因此,创建这些文件的内核组件可以说明任何一个文件可由谁读 取或写入。目录则不能被写入。 在目录p r o c s y s 中的每一个文件实际上就是一个内核变量,变量的内容可以 借助于相关联的文件进行读写或者直接调用s y s c f l 系统调用。既然目录p r o c s y s 中的变量内容可以使用文件读写的方式来获取修改,那么内核中也可以使用相应 的文件操作函数,比如v f sr e a d 、v f sw r i t e 等函数,来进行相应的操作。因此 s y s c t l 接e l 不存在移植性的问题。 2 i o c t l 系统调用。 i o c t l ( 输入输出控制) 系统调用的操作对象是一个文件,通常是用于实现特 殊设备所需但标准文件系统没有提供的操作,比如各种驱动程序经常使用i o c t l 接 口来提供某些特殊的功能。同时,也可以把s o c k e t 系统调用返回的套接字描述符 ( s o c k e td e s c r i p t o r ) 传给i o c t l ,而这也是网络代码使用i o c t l 的方式。 i o c t l 有各种不同的命令,在u m i p 程序中使用到的有以下几种命令。 s i o c d e l t u n n e l :删除i p v 6 隧道。 s i o c a d d n 烈n e l :创建i p v 6 隧道。 s i o c c h g t u n n e l :更新i p v 6 隧道。 s 1 0 c g i f h w a d d r :获取网络接口硬件地址及相应的配置信息。 s i o c g i f f l a g s :获取网络接口标志。 s i o c s i f f l a g s :设置网络接口标志。 不管是何种i o c t l 命令,在用户空间进行调用时其本质都是通过 8移动i p v 6 开源代码从用户空间到内核的移植 c o p y函数将用户数据从用户态复制到内核态,然后调用内核的相应命from u s e r 令执行函数进行处理,而处理函数的反馈信息则通过c o p yt ou s e r 函数,由内核 态复制到用户态应用程序。如果将用户空间的程序移植到内核的话则可以省去数 据从用户空间到内核或者内核到用户空间的复制过程,可以直接调用相应的命令 执行函数进行处理。因此i o e t l 接口也能移植。 3 n e t l i n k 套接字。 n e t l i n k 套接字是网络应用程序与内核通信时最新的首选机制。也可以作为内 核内部以及多个用户空间进程之间的消息传输系统。通过n e t l i n k 套接字,你可 以使用标准套接字a p i 打开或关闭套接字、使用套接字传输数据或者接收套接字 数据。n e t l i n k 使用新的p fn e t l i n k 协议簇( 域) ,只支持s o c k d g r a m 类 型,而且定义了几种协议,每一种都用于网络协议栈的不同组件( 或一组组 件) 。 使用n e t l i n k 套接字时,终端点通常是由打开此套接字的进程的i d ( p i d ) 标 识,而特殊值0 代表的就是内核。n e t l i n k 的功能之一是传送单播和多播消息:目 的地终端点地址可以是一个p i d 、一个多播群组i d 或者两者的组合。另一个功能 是传送正面和负面的确认信息( a c k o n w l e d g m e n t ) 。 n e t l i n k 相对于其他用户一内核接口( 如i o c t l ) 的优点之一,就是内核可以启 动传输,而不只是仅限于响应用户空间请求而返回信息。 n e t l i n k 包括内核部分与用户空间部分。在内核中,一个组件可以调用 n e t l i n kk e r n e lc r e a t e 函数来创建一个内核n e t l i n k 套接字,一个内核n e t l i n k 套接 字对应一个n e t l i n k 协议,比如n e t l i n kx f r m 和n e t l i n kr o u t e 等。在用 户空间的程序中,用户只需要创建一个属于p fn e t l i n k 协议簇,与内核中某 n e t l i n k 协议相同的套接字,便可通过该套接字与内核中处理该n e t l i n k 协议的组 件进行通信。 n e t l i n k 的本质是两个s o c k e t 套接字的通信,只不过这两个套接字都存在于本 机,其中一个在内核创建,另一个在用户空间创建。因此,在移植到内核时,可 以将这两个套接字都放在内核创建( 两者的创建方法不同) ,同样可以达到不同 组件相互通信的目的,因此n e t l i n k 套接字也可以移植。 4 常用的系统调用。 操作系统的主要功能是为应用程序的运行创建良好的环境,为了达到这个目 的,内核提供一系列具备预定功能的多内核函数,通过一组称为系统调用 ( s y s t e mc a l l ) 的接口呈现给用户。系统调用把应用程序的请求传给内核,调用相 应的的内核函数完成所需的处理,将处理结果返回给应用程序,如果没有系统调 用和内核函数,用户将不能编写大型应用程序。这里以l i n u x 系统中常见的 s o c k e t 系统调用为例。 第二章移植的可行性分析及移植策略设计9 在用户空间,s o c k e t 系统调用包括s o c k e t 、s e t s o c k o p t 、g e t s o c k o p t 、c l o s e 函 数等等,其执行流程为通过系统中断来执行由内核提供的系统调用,分别是 s y s s o c k e t 、s y s _ s e t s o c k o p t 、s y s _ g e t s o c k o p t 、s y s _ c l o s e 等函数。 事实上,内核也专门提供了一些相同功能的函数用于内核中其他组件的调 用。对于这种接口,将其替换成内核中相对应的函数便可完成移植。 2 1 3 支持库的不同 在l i n u x 用户空间,程序可以调用g l i b 函数库以及支持p o s i x t 8 】( p o r t a b l e o p e r a t i n gs y s t e mi n t e r f a c eo fu n i x ) 标准的函数等。 g l i b 是g t k + 和g n o m e 工程的基础底层核心程序库,是一个综合用途的实 用的轻量级的c 程序库,它提供c 语言的常用的数据结构的定义、相关的处理函 数,有趣而实用的宏,可移植的封装和一些运行时机能,如事件循环、线程、动 态调用、对象系统等的a p i 。它能够在类u n i x 的操作系统平台( 如l i n u x , h p u n i x 等) ,w i n d o w s ,0 s 2 和b e o s 等操作系统台上运行。但是l i n u x 内 核中并不包含g l i b ,因此g l i b 中一些常用的函数如p r i n t f , p t h r e a d 等函数在内核 中将无法使用。 所幸的是l i n u x 内核自带的各种函数功能也十分强大,基本能实现与g l i b 函 数库相同的功能。例如与p r i n t f 功能类似p r i n t k 函数,与p t h r e a d 相似的k t h r e a d 函数等等。而对于部分在内核无法直接找到功能类似的函数,除个别函数如人机 接口( u i ) 函数等,大部分也可以通过内核中的其它不同的函数的组合来实现相 同的功能。恰巧的是u m i p 程序中并没有使用这类在内核中无法实现的函数。 2 i 4l i n u x 网络i p v 6 协议栈的结构 l i n u x 内核网络协议栈采用了如图2 1 所示的层次结构: u s e rs p a c e k e r n e i 三丑 | s y s t e m 酬n t e d a c el | 一m t 。a g n o s t k t n t e 向i n e t w 。咄,r 咖咄 l | o e 、,c e 心n o s t i c i n t e 斤搬| d e v ;。r e 懵 | 图2 1l i n u x 网络协议栈结构 l o 移动i p v 6 开源代码从用户空间到内核的移植 内核中的五层从上到下分别是系统调用接口、协议无关接口( b s ds o c k e t 层) 、网络协议( 或者简称网络层) 、驱动无关接口( 又叫网络核心层) 以及设 备驱动程序。 其中网络层是一个协议的集合,从链路层到传输层的协议都包括在内。不同 的协议在n e t 文件夹下除c o r e 以外的子目录中,例如基于i p v 6 的协议簇都在 n e t i p v 6 目录下中。 在内核中,使用d e v a d d _ p a c k 函数来注册协议簇,使用d e vr e m o v e _ p a c k 来 注销协议簇,例如i p v 6 协议簇就是这样注册和注销的。而使用i n e t 6 _ a d d _ p r o t o c o l 函数来某个协议簇中添加具体的协议。当内核接收到一个i p v 6 消息时,首先检测 在原始套接字列表中是否有该消息的协议类型的原始套接字,如果有则将该消息 拷贝一份提交给该原始套接字。之后内核才查询内核中的协议列表,将该消息提 交给对应的协议的消息处理函数。 在l i n u x 内核2 6 2 4 版本中,已经自带了部分移动i p v 6 协议的功能,其中通 过x f r m 架构实现了归属地址选项和类型2 路由首部的扩展,并在原始套接字中 注册了移动头的过滤函数。 在用户空间中,u m i p 程序先向内核注册了i p p r o t o i c m p v 6 和 i p p r o t om h 协议的原始套接字,用于处理移动i p v 6 协议的相关消息内容。借 着又通过n e t l i n k 接e 1 注册了n e t l i n k x f r m 和n e t l i n k r o u t e 两种协议类 型的n e t l i n k 套接字,通过这两个套接字与内核联系,实现了安全联盟( s e c u r i t y a s s o c i a t i o n ,s a ) 与安全策略( s e c u r i t yp o l i c y ,s p ) 相关的功能以及移动检测等 功能。 u m i p 程序与l i n u x 网络协议栈的关系如图2 2 所示 厂 u m i p ( 用户空间) 、 而司( m n 、c n ) c s a ) 厂、 移动检测 j 。c k e ej f n e t i ;n k j 厂k 原始套接字) ( t c p 、u 。p 、i c m p 6 丁 厂、厂、 x f r mr o u t e l i p v 6 内核 图2 2u m i p 与l i n u x 网络协议栈关系 由图2 2 可知,u m i p 程序在用户空间通过原始套接字与n e t l i n k 接口将移动 i p v 6 协议加入到l i n u x 网络协议栈中。因此,只要s o c k e t 套机字与n e t l i n k 套接 第二章移植的可行性分析及移植策略设计ll 字能够成功移植到内核,那么u m i p 也可以在内核中将移动i p v 6 协议加入到现有 网络协议栈中。 2 1 5 可行性分析的结论 通过前面4 个小节的分析可知,用户空间编程与内核编程的主要区别在于启 动方式的不同、系统调用接口的不同以及支持的函数库的不同这三个方面。而这 三方面虽然不同,但绝大部分均可以在内核中实现与用户空间相同的功能,而 u m i p 程序中并不包含内核无法实现的用户空间函数,如u i 界面函数等。另外, 在移动i p v 6 协议加入到现有网络协议栈中也只关系到s o c k e t 套接字与n e t l i n k 套 接字,这两个套接字的移植属于系统调用接口的移植,是可以移植的。因此,可 以得出结论,将u m i p 代码从用户空间移植到内核是可行的。 2 2 1u m i p 程序结构分析 2 2 移植策略设计 在设计移植策略之前,先对u m i p 程序代码做一下介绍: 在u m i p 代码中的m a i n 函数里可以看到,其启动后第一步操作是调用 d e b u gi n i t 进行d e b u g 信息的初始化,接着便调用c o n f _ p a r s e 读取配置文件,之后 则根据配置文件所配置的参数进行一些列初始化调用。其调用关系如图2 3 所 图2 3u m i p 代码中m a i n 函数执行流程 1 2移动口v 6 开源代码从用户空间到内核的移植 以下将逐个分析各个部分的初始化函数及其调用。 1 d e b u g _ i n i t 函数 该函数是u m i p 程序中调试信息的初始化。其可以输出到两种地方,一是指 定的日志文件,二是输出到标准输出( 设备) 文件( s t d e r r ) ,对应终端的屏幕, 默认情况下u m l p 程序将输出到标准输出( 设备) 文件。 在d e b u g 模块中,其调用到了文件类操作函数,如f o p e n 、f p d n t f , f c l o s e 以 及m u s h 等函数。 2 c o n f _ p a r s e 函数 c o n fp a r s e 是配置文件的解析函数,最终返回包含配置参数的结构体。在该 函数中,其又依次调用了c o n fd e f a u l t 、c o n ff i l e 、c o n fc m d l i n e 三个函数。这三 个函数的作用分别是初始化配置参数的结构体、从文件中读取配置的参数、从启 动的命令行中读取配置的参数。 其中,c o n ff i l e 从文件中读取配置参数时,使用了词法解析器,这里使用了 著名的u n i x 工具l e x 和y a c c 来实现。词法器在文件s c a n 1 里定义,负责识别标识 符、s q l 关键字等。对于发现的每个关键字或者标识符都会生成一个记号并且传 递给分析器。分析器在文件g r a m y 里定义并且包含一套语法规则和触发规则时执 行的动作。动作代码( 实际上是c 代码) 用于建立分析树。文件s c a n 1 用l e x 转 换成c 源文件s c a n c 而g r a m y 用y a c c 转换成g r a m c 。在完成这些转换后,一个 通用的c 编译器就可以用于创建分析器。需要提醒的是,千万不要对生成的c 源 文件做修改,因为下一次调用l e x 或y a c c 时会把它们覆盖。 3 v ti n i t 函数和v ts t a r t 函数 v ti n i t 函数和v ts t a r t 函数都是属于控制台的一些函数,包含在v t c 文件中, 通过v t 来显示一些调试信息,监控程序状态。并对程序进行控制。其中,v t i n i t 用于初始化相应的命令结构体列表,而v ts t a r t 则创建一个s o c k e t 套接字,以及 一个监听线程用于监听该s o c k e t 套接字。用户可以通过t e l n e t 来连接到v t 服务 器,通过相应的命令来获取程序状态并对其进行控制。 在v t c

温馨提示

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

评论

0/150

提交评论