软件开发与设计
Linux下用户态和内核态内存共享的实现
陈浩
(江苏食品职业技术学院计算机应用技术系,淮安223003)
摘
要:共享内存是进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同
malloc()函数向不同进程返回了指向同一个物理内存区域的指针。因为所有进程共享同一块内存,共享内存在各种进程间通信方式中具有最高的效率。主要介绍Linux下基于Netlink机制的用户态和内核态内存共享的实现。关键词:内核态;用户态;netlink;共享内存
UserModeandKernelModeSharedMemoryunderLinux
CHENHao
(DepartmentofComputerAppliedTechnology,JiangsuFoodScienceCollege,Huai'an223003)
Abstract:SharedmemoryisthemostsimpleoftheProcesscommunication.Sharedmemoryallowedtwoormoreprocess
visitthesamepieceofmemory.aslikeasfunctionmalloc(),Ittowardstothedifferentprocessreturnapointerofpointtothesamephysicsmemoryarea.Becausealloftheprocesssharedthesamememory,sharedmemoryisthetopefficiencyofallkindofprocessCommunication.ThispaperprincipallyintroductionimplementationbaseonNetlinkmechanismusermodeandkernelmodesharedmemoryunderLinux.
Keywords:kernelmode;usermode;netlink;Sharedmemory
1引言
Linux是一类Unix计算机操作系统的统称。Linux操作系
系统调用和中断两种情况下发生,一般程序一开始都是运行于用户态,当程序需要使用系统资源时,就必须通过调用软中断进入内核态。
。Linux操作系统也是自由软件统的内核的名字也是“Linux”
和开放源代码发展中最著名的例子。Linux是一套免费使用和自由传播的类Unix操作系统。无论是普通用户还是企业用户都可以编写自己的内核代码,再加上对标准内核的裁剪从而制作出适合自己的操作系统。
一个或多个内核模块的实现并不能满足一般Linux系统软件的需要,因为内核的局限性太大,如不能在终端上打印,不能做大延时的处理等等。当需要做这些的时候,就需要将在内核态采集到的数据传送到用户态的一个或多个进程中进行处理。这样,内核态与用户空间进程通信的方法就显得尤为重要。将列举Linux下基于Netlink机制的内核态与用户态进程通信的方法以及如何实现用户态和内核态的内存共享。
3Linux的用户态和内核态
Linux使用了Ring3级别运行用户态,Ring0作为内核态。
Ring3状态不能访问Ring0的地址空间,包括代码和数据。Linux进程的4GB地址空间,3GB-4GB部分是共享的,是内核态的地址空间,这里存放着整个内核的代码和所有的内核模块,以及内核所维护的数据。
用户运行一个程序,该程序所创建的进程开始是运行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过write,send等系统调用,这些系统调用会利用内核中的代码来完成操作,这时,必须切换到Ring0,然后进入3GB-4GB中的内核地址空间去执行这些代码,完成操作,完成后,切换回Ring3,回到用户态。这样,用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用。
2用户态和内核态
用户态与内核态是操作系统的两种运行级别,IntelCPU
提供Ring0-Ring33种级别的运行模式。Ring0级别最高,Ring3最低。
用户态:当进程在执行用户自己的代码时,则称其处于用户运行态即用户态。此时处理器在特权级最低的(3级)用户代码中运行。
内核态:当一个任务(进程)执行系统调用而陷入内核代码中执行时,就称进程处于内核运行态或简称为内核态。此时处理器处于特权级最高的0级内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。
在内核态下CPU可执行任何指令,在用户态下CPU只能执行非特权指令。当CPU处于内核态,可以随意进入用户态;而当CPU处于用户态时,用户从用户态切换到内核态只有在
4实现内核态与用户态的通信
内核与用户空间共享内存的关键是,用户空间必须知道
共享内存的起始地址,这就要求内核空间应该有一种通信机制来通知用户空间。理论上任何内核空间与用户空间的通信方法都可以利用。接下来主要介绍基于Netlink机制的实现。
Netlink在linux的内核与用户空间通信中用得很多,其最大优势是接口与网络编程中的socket相似,且内核要主动发信息给用户空间很方便。既然涉及到内核与用户空间两个空间,就应该在两个空间各有一套接口。用户空间的接口与一作者简介:陈浩,男,研究方向:计算机应用。收稿日期:2010-12-18
2011.042009.
25
电脑编程技巧与维护
般的socket接口相似,标准的socketAPI的函数,socket(),bind(),sendmsg(),recvmsg()和close()很容易地应用netlinksocket;内核空间则稍为复杂:首先也是建立描述符,建立描述符时会注册一个回调函数,然后当用户空间有消息发过来时,函数将被调用;当内核要主动发消息给用户进程时,直接调用一个类send函数即可。
Netlink套接字的最大特点是对中断过程的支持,它在内核空间接收用户空间数据时不再需要用户自行启动一个内核程,而是通过另一个软中断调用用户事先指定的接收函数。
如图1所示,这里使用了软中断而不是内核线程来接收数据,这样就可以保证数据接收的实时性。
用户态进程
软中断
中断过程
进程发送数据
临界区(使用自旋锁来使内核线程与中断过程同步)
中断过程发送数据
图1Netlink通过软中断调用用户进程
当Netlink套接字用于内核空间与用户空间的通信时,在用户空间的创建方法和一般套接字使用类似,但内核空间的创建方法则不同,图2是Netlink套接字实现此类通信时创建的过程。
内核态
用户态
使用netlink_kernel_create()
创建套接字,并指明接收函数
用户空间进程创建套接
字,并将进程ID发送至内核空间
接收函数收到用户空间进程ID
用户空间与内核空间可以通信
图2用Netlink套接字实现内核态与用户态的通信
5基于Netlink的共享内存
5.1工作流程
内核部分首先用get_order获取页数,接着调用
26
2011.04
_get_free_page分配连续的物理内存页,这时返回的是虚拟地址,然后调用SetPageReserved,相当于告诉系统,这个页面已经占了。对于每一个申请到的页面,应该都要这样做,同样地,释放内存时,需要对每一页调用ClearPageReserved。如果用户空间通过Netlink要求获取共享内存的起始物理地址,将_get_free_pages返回的地址_pa下发给用户空间。
用户空间调用open/dev/shm进行物理内存设备的读写,发送Netlink消息给内核,得到共享内存的起始物理地址,最后调用mmap上步得到的物理地址。用户空间的进程得到这个地址后根据这个地址去读取其中的内容。5.2设计实现
为了创建一个Netlinksocket,用户需要使用如下参数调用socket():
socket(AF_NETLINK,SOCK_RAW,netlink_type)socket函数返回的套接字可以交给bing等函数调用:staticintskfd;
skfd=socket(PF_NETLINK,SOCK_RAW,NL_IMP2);if(skfd<0){
printf(\"cannotcreateanetlinksocket\\n\");exit(0);}
用户空间可以调用send函数簇向内核发送消息,如sendto、sendmsg等。也可以使用structsockaddr_nl来描述一个对端地址,以待send函数来调用,与本地地址稍不同的是,因为对端为内核,所以nl_pid成员需要设置为0:
structsockaddr_nlkpeer;
memset(&kpeer,0,sizeof(kpeer));kpeer.nl_family=AF_NETLINK;kpeer.nl_pid=0;kpeer.nl_groups=0;
当发送完请求后,就可以调用recv函数簇从内核接收数据了,接收到的数据包含了Netlink消息首部和要传输的数据,然后调用close函数关闭Netlink套接字,退出程序。5.3内核空间的设计与实现
与应用程序内核一样,内核空间也主要完成3件工作:创建Netlink套接字、接收处理用户空间发送的数据、发送数据至用户空间。API函数netlink_kernel_create用于创建一个Netlinksocket,同时,注册一个回调函数,用于接收处理用户空间的消息:
structsock*
netlink_kernel_create(intunit,void(*input)(structsock
*sk,intlen));
用户空间向内核发送了自定义消息,分别是请求和关闭。kernel_receive函数分别处理这两种消息。因为内核模块可能同时被多个进程同时调用,所以函数中使用了信号量和锁来进行互斥。
函数初始化Netlink消息首部,填充数据区,然后设置控制字段,最后调用netlink_unicast函数把数据发送出去。在内核中使用函数sock_release来释放函数netlink_kernel_create()
SOFTWAREDEVELOPMENTANDDESIGN创建的Netlinksocket:
voidsock_release(structsocket*sock);
程序在退出模块中释放Netlinksockets和netfilterhook:staticvoid__exitfini(void){
?if(nlfd){
sock_release(nlfd->socket);}
nf_unregister_hook(&imp2_ops);}
软件开发与设计
常简单高效,特别是它的广播特性在一些应用中非常方便,是用户态与内核态数据交换方式中最有效的方式。
参考文献
[1]孙天泽.嵌入式Linux操作系统.人民邮电出版社,2009.[2]汤小丹,梁红兵,哲凤屏,等.计算机操作系统.西安电
子科技大学出版社,2007.
[3]陈莉君,康华.Linux操作系统原理与应用.清华大学出版
社,2006.
[4]刘海燕,荆涛.Linux系统应用与开发教程.机械工业出版
社,2010.
[5]肖宇峰,李昕,时岩.
工业出版社,2010.
Linux网络内核分析与开发.电子
6结语
介绍基于Netlink的用户空间与内核空间的数据交换方式,
并通过实际例子程序向读者讲解了如何在内核开发中使用这些技术。Netlink是一种双向的数据交换方式,它使用起来非
≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤≤(上接第5页)
的字符串进行解析,并按表达式语意调用运算函数计算,在必要时对操作数的计算顺序作适当调整,以减少计算量。
基本运算模块:提供四则运算、方幂运算、阶乘运算等,其具体实现方法皆应用基本的算法完成。
初等数论计算模块:包括质因数分解,取余、求最大公因数与最小公倍数等,这里求最大公因数采用辗转相除算法完成。
页面查询与管理模块:对存储计算结果的页面进行管理。包括页面查找、页面淘汰机制等。3.2对运算效率的改进
增加页面存储及其查询机制,将最后计算过的一定数量的长整数乘法、除法运算,方幂运算的操作数和结果存放在其中,在后续的计算中先对页面进行查询,如果是乘除法运算,若两个操作数与页面中存储的数值相等,即命中,则可直接取出结果。而n次方运算则可查询是否存在该操作数的m次方且m≤n,若满足则可以取出结果,继续运算。
每次运算后在页面的淘汰算法重新填写页面,这里所使用的是先进先出淘汰算法(FIFO)。
页面结构的定义代码如下:
classPage{
public:
LongNumberpar1;//每个页面中的操作数1LongNumberpar2;//每个页面中的操作数2charop;//每个页面中的运算类型//静态成员函数
staticLongNumber*find(LongNumber,LongNumber,char);//查找页面
staticshortsetpage(LongNumber,LongNumber,char,LongNumber);//设置页面
staticPagepage[MAXPAGE];private:
};
实现时将MAXPAGE(页面最大个数)设置成了20。由于查找页面及匹配的过程可在O(n)时间复杂性下完成,相对于乘除与方幂运算要快得多,所以在进行大量长整数运算时可提高其运算效率。经试验表明,尤其是在做连续)时运算效率的方幂运算(如二项式、多项式定理公式计算会明显提高。
另外,在做表达式解析时,在保证运算正确性的同时对操作数运算顺序作适当调换,也可以提高运算速度,如连加、连乘式可按操作数长度从小到大排列,再进行计算。
…
4结语
首先对任意长整数在计算机中的表示及基本的运算方法
进行了讨论,同时还给出了软件包的部分实现细节及提高运算效率的方法。由于长整数计算的时间复杂性较高,所以在实现时采取适当的措施提高运算效率是十分必要的。该软件包可作为开发计算机代数及符号计算软件的底层模块,或应用于实现高精度计算软件之中。
参考文献
[1]衷仁保,马建.计算机代数学.北京:科学出版社,1996.[2]王东明.符号计算选讲.北京:清华大学出版社,2003.[3]Knuth,D.E.,苏运霖.计算机程序设计艺术.第3版.北
京:国防工业出版社,2002.
[4]AbrahamSilberschatz,PeterGalvin,GregGagne.Applied
operatingsystemconcepts(影印版).JohnWiley&Sons,Inc.高等教育出版社,2001.
[5]BjarneStroustrup.TheC++ProgrammingLanguage(special
edition)(影印版).高等教育出版社,2001.
2011.042009.
27
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- sarr.cn 版权所有 赣ICP备2024042794号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务