当前位置:主页 > QQ空间代码 > 源代码Linux内核查抄用户空间指针

源代码Linux内核查抄用户空间指针

来源:未知 作者:ddddaa 时间:2012-01-08 [搜索相关内容] 浏览:

  copy_from_user函数将数据块从用户空间复造到内核缓冲区。它启受一个目标缓冲区(正在内核空间)、一个源缓冲区(从用户空间)和一个以字节界说的长度。和copy_to_user一样,该函数正在成功时,返回0,不然返回一个非零数,指出不克不及复造的字节数。

  copy_to_user将一个数据块从内核复造到用户空间

  图1.页表供给从虚拟地点到物理地点的映照

  内存映照的其他形式

  strncpy_from_user函数将一个字符串从用户空间复造到一个内核缓冲区,给定一个用户空间源地点和最年夜长度。

  图4.利用UserSpaceMemoryAccessAPI停止数据移动

  不是所有的处置器都有MMU。是以,uClinux刊行版(微控造器Linux)撑持操作的一个地点空间。该架构缺少MMU供给的,然则许可Linux运转另中一类处置器。闭于uClinux的具体信息睹。

  strnlen_user函数起尾经过挪用access_ok查抄用户缓冲区是不是可读。若是是strlen函数被挪用,maxlength参数则被疏忽。

  get_user从用户空间获得一个简单变量

  strncpy_from_user函数

  strncpy_from_user从用户空间复造一个字符串到内核

  strnlen_user函数

  果为从用户空间复造,该函数起尾利用access_ok查抄缓冲区是不是可读。和copy_from_user一样,该函数作为一个优化组拆函数(正在./linux/arch/x86/lib/usercopy_.c中)真现。

  现正在,让我们来研讨一下用户操感化户内存的内核API。请注重,那触及内核和用户空间接心,而下一部门将研讨其他的一些内存API。用户空间内存拜候函数正在表1中列出。

  clear_user(ptr,n);

  该函数起尾查抄从用户空间源缓冲区读取的才能(经过access_ok),然后挪用__copy_from_user,最后挪用__copy_from_user_ll。今后开端,按照构架,为履行从用户缓冲区到内核缓冲区的零拷贝(弗成用字节)而停止一个挪用。优化组拆函数包罗办理功效。

  正在Linux中,用户内存和内核内存是的,正在各自的地点空间真现。地点空间是虚拟的,就是说地点是从物理内存中抽象出来的(经过一个简短描写的进程)。果为地点空间是虚拟的,所以可以存正在良多。事真上,内核自己驻留正在一个地点空间中,每一个历程驻留正在本人的地点空间。那些地点空间由虚拟内存地点构成,许可一些带有地点空间的历程指向一个相对较小的物理地点空间(正在机械的物理内存中)。不但仅是便利,并且更仄安。由于每一个地点空间是且断绝的,是以很仄安。

  图3.地点空间和虚拟-物理地点映照的元素

  access_ok函数

  strnlen_user函数也能像strnlen那样利用,但条件是缓冲区正在用户空间可用。strnlen_user函数带有两个参数:用户空间缓冲区地点和要查抄的最年夜长度。

  正在内部,clear_user函数起尾查抄用户空间指针是不是可写(经过access_ok),然后挪用内部函数(经过内联组拆体例编码)来履行Clear操作。利用带有repeat前缀的字符串指令将该函数优化成一个十分严稀的轮回。它将返回弗成消灭的字节数,若是操作成功,则返回0。

  copy_from_user(to,from,n);

  MMU-less架构

  正如您所期看的,那些函数的真现架构是的。例如正在x86架构中,您可以利用./linux/arch/x86/lib/usercopy_32.c和usercopy_64.c中的源代码找到那些函数和正在./linux/arch/x86/include/asm/uaccess.h中界说的字符串。

  mmap函数许可一个用户空间利用法式正在虚拟地点空间中建立一个映照,该功效正在某个装备驱动法式类中是常睹的,许可将物理装备内存映照到历程的虚拟地点空间。正在一个驱动法式中,mmap函数经过remap_pfn_range内核函数真现,它供给装备内存到用户地点空间的线性映照。

  当数据移动函数的法则触及到复造挪用的类型时(简单VS.堆积),那些函数的感化如图4所示。

  put_user输进一个简单变量到用户空间

  查抄了向用户缓冲区写进的功效以后(经过access_ok),内部函数__copy_to_user被挪用,它反过来挪用__copy_from_user_inatomic(正在./linux/arch/x86/include/asm/uaccess_.h中。此中是32或64,详细取决于架构。)正在肯定了是不是履行1、2或4字节复造以后,该函数挪用__copy_to_user_ll,那就是现真事情停止的处所。正在破坏的硬件中(正在i486之前,WP位正在办理形式下弗成用),页表可以随时替代,需要将想要的页里流动到内存,使它们正在处置时不被换出。i486以后,该进程只不中是一个优化的副本。

  内核API

  clear_user函数

  copy_from_user函数

  clear_user函数被用于将用户空间的内存块清零。该函数采取一个指针(用户空间中)和一个型号停止清零,那是以字节界说的:

  get_user(x,ptr);

  和get_user一样,put_user函数被内部映照到put_user_x函数,成功时,返回0,呈现毛病时,返回-EFAULT。

  要从用户空间读取一个简单变量,可以利用get_user函数,该函数开用于简单数据类型,好比,char和int,然则像构造体那类较年夜的数据类型,必需利用copy_from_user函数。该本型启受一个变量(存储数据)和一个用户空间地点来停止Read操作:

  get_user函数将映照到两个内部函数此中的一个。正在系统内部,那个函数决议被拜候变量的年夜小(按照供给的变量存储后果)并经过__get_user_x构成一个内部挪用。成功时该函数返回0,普通环境下,get_user和put_user函数比它们的块复造副本要快一些,若是是小类型被移动的话,应当用它们。

  正在现正在那个信息爆炸的期间里,天天都市稀有不清的新闻经过种种渠道涌到我们里前,而真正有价值的应当进进我们心里的,却极可能跟着日历牌的翻动被我们疏忽。作为对一周新闻停止回尾的《比特网新闻中间每周热门保举》,就是要报告您过往的七天都产生了哪些新闻,更希看和您一同,站正在七天的高度来对待过往一周的新闻。

  函数描写

  clear_user消灭用户空间中的一个块,或将其回零。

  put_user函数

  其真不是所有的页里都开适互换。思索到响应间断的内核代码或办理页表和互换逻辑的代码,隐然,那些页里决不克不及被换出,是以它们是流动的,或是永近地驻留正在内存中。虽然内核页里不需要停止互换,但是用户页里需要,然则它们可以被流动,经过mlock(或mlockall)函数来锁定页里。那就是用户空间内存拜候函数的目标。若是内核假定一个用户传递的地点是有用的且是可拜候的,末究大概会呈现内核严重毛病(kernelpanic)(例如,由于用户页里被换出,而致使内核中的页里毛病)。该利用法式编程接心(API)确保那些鸿沟环境被妥帖处置。

  Linux内存

  type参数可以被指定为VERIFY_READ或VERIFY_WRITE。VERIFY_WRITE也能够辨认内存地区是不是可读和可写(虽然拜候依然会生成-EFAULT)。该函数简单查抄地点大概是正在用户空间,而不是内核。

  正在用户空间,注重,果为用户历程呈现正在零丁的地点空间,正在它们之间移动数据必需颠末某种历程间通讯机造。Linux供给种种形式(好比,动静队列),然则最出名的是POSIX同享内存(shmem)。该机造许可历程建立一个内存地区,然后统一个或多个历程同享该地区。注重,每一个历程大概正在其各自的地点空间中映照同享内存地区到差别地点。是以需要相对的寻址偏移(offsetaddressing)。

  strnlen_user获得内存空间中字符串缓冲区的年夜小

  就办事器和数据中间范畴的财产动态、手艺热门、热点产物、适用技巧,向企业CIO/CTO、IT办理层、手艺职员供给一周精选套餐,为数据中间决议计划者、利用者供给一份办事器行业和数据中间范畴最新动态及产物利用的手艺套餐。

  copy_to_user函数将数据块从内核复造到用户空间。该函数启受一个指向用户空间缓冲区的指针、一个指向内存缓冲区的指针、和一个以字节界说的长度。该函数正在成功时,返回0,不然返回一个非零数,指出不克不及收送的字节数。

  copy_to_user函数

  选择一个页里来互换存储的进程被称为一个页里置换算法,可以经过利用很多算法(最少是比来利用的)来真现。该历程正在哀求存储时产生,存储的页里不正在存储器中(正在存储器办理单位[MMU]中无映照)。那个事务被称为一个页里毛病并源代码被硬件(MMU)删除,呈现页里毛病间断后该事务由防火墙办理。该栈的具体申明睹图3。

  Linux供给一个风趣的互换真现,该真现供给很多有效的特征。Linux互换系统许可建立和利用多个互换分区和优先权,那撑持存储装备上的互换条理构造,那些存储装备供给差别的机能参数(例如,固态磁盘[SSD]上的一级互换和速度较缓的存储装备上的较年夜的两级互换)。为SSD互换附加一个更高的优先级使其可以利用直至耗尽;直到那时,页里才能被写进优先级较低的互换分区。

  access_ok查抄用户空间内存指针的有用性

  源代码Linux内核查抄用户空间指针,然则与仄安性相联系闭系的本钱很高。由于每一个历程(和内核)会有沟通地点指向差别的物理内存地区,不大概立刻同享内存。枯幸的是,有一些办理圆案。用户历程可以经过PortableOperatingSystemInteceforUNIX?(POSIX)同享的内存机造(shmem)同享内存,但有一点要申明,每一个历程大概有一个指向沟通物理内存地区的差别虚拟地点。

  access_ok(type,addr,size);

  果为缺少为历程界说内存的才能,底层物理内存被过度利用。经过一个称为paging(但是,正在Linux中凡是是称为swap)的历程,很少利用的页里将主动移到一个速度较缓的存储装备(好比磁盘),来容纳需要被拜候的其它页里(睹图2)。那一行动许可,正在将很少利用的页里迁徙到磁盘来进步物理内存利用的同时,计较机中的物理内存为利用法式更轻易需要的页里供给办事。注重,一些页里可以指向文件,正在那类环境下,若是页里是脏(dirty)的,数据将被冲刷,若是页里是清洁的(clean),直接丢得降。

  strncpy_from_user(dest,src,n);

  copy_from_user将一个数据块从用户空间复造到内核

  部门切磋了正在内核和用户空间之间移动数据的圆式(利用内核初初化操作)。Linux还供给一些其他的圆式,用于正在内核和用户空间中移动数据。虽然那些圆式未必可以或许供给与用户空间内存拜候函数沟通的功效,然则它们正在地点空间之间映照内存的功效是类似的。

  您可以利用put_user函数来将一个简单变量从内核写进用户空间。和get_user一样,它启受一个变量(包罗要写的值)和一个用户空间地点作为写目的:

  虚拟内存到物理内存的映照经过页表完成,那是正在底层硬件中真现的(睹图1)。硬件自己供给映照,然则内查办理表及其设置装备摆设。注重那里的隐现,历程大概有一个年夜的地点空间,然则很少睹,就是说小的地点空间的地区(页里)经过页表指向物理内存。那许可历程仅为随时需要的网页指定年夜的地点空间。

  strnlen_user(src,n);

  put_user(x,ptr);

  您可以利用access_ok函数正在您想要拜候的用户空间查抄指针的有用性。挪用函数供给指向数据块的开端的指针、块年夜小和拜候类型(不管那个地区是用来读仍是写的)。函数本型界说以下:

  get_user函数

  copy_to_user(to,from,n);

  业内尾个只为报导数据中间资讯内容的专业频道,是为数据中间用户及厂商而扶植的专业仄台。以数据中间专业手艺内容为焦点,贯脱新颖资讯、技巧圆式和用户案例等高附加值内容。觉得网友供给最具适用价值的源代码Linux内核查抄用户空间指针信息为本则,以成为用户最相信的行业专家为目的,挨造高时效、高品量、高前瞻的最全威频道。企业数据中间热门播报,为您精心送上过往一周数据中间最出色、权势巨子资讯_chinabyte比特网。

 QQ空间代码 使用方法:

 一、登录你的QQ空间;
 二、点“装扮空间”;
 三、将以上QQ空间免费物品对应的代码粘贴到你的浏览器地址栏中[也就是浏览器输入网址那里];
 四、在地址栏里按回车,这时你就会发现物品显示出来了,如果没有出现物品,请多按几次;
 五、点“保存装扮方案”,如果提示“无需保存”,请先随便移动一下模块位置,然后保存。OK!

 P.S.“QQ空间特区”每天都有精彩奉献给你!

上一篇:惠特曼可否惠普?源代码   下一篇:没有了
把QQ空间添加到QQ收藏 把QQ空间添加到百度藏
QQ空间相关推荐
QQ空间合作伙伴
QQ空间最新推荐
QQ空间随机推荐
QQ空间精品推荐

联系我们 - 广告服务 - 免责声明