linux空间(linux基础命令表)
linux空间(linux基础命令表)
一、 问题描述
access_ok函数是什么原理?
问题二、问题分析
我们在内核空间和用户空间进行数据拷贝的时候必须判断用户空间地址是否合法。 主要通过偶函数access_ok来判断。1. Linux用户空间与内核地址空间
Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。
通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。注意这里是32位内核地址空间划分,64位内核地址空间划分是不同的。
进程寻址空间0~4G
进程在用户态只能访问0~3G,只有进入内核态才能访问3G~4G
进程通过系统调用进入内核态
每个进程虚拟空间的3G~4G部分是相同的
进程从用户态进入内核态不会引起CR3的改变但会引起堆栈的改变2. access_ok详解
原型:access_ok(type,addr,size);
功能:
access_ok — 检查用户空间指针是否有效 注意,根据体系结构的不同,这个函数可能只是检查指针是否在用户空间范围内,在调用这个函数之后,内存访问函数可能仍然返回 -EFAULT
参数说明:
typeType of access: VERIFY_READ or VERIFY_WRITE. 请注意,VERIFY_WRITE是VERIFY_READ的超集——如果写入一个块是安全的,那么从它读取总是安全的。addr要检查的块的开始的用户空间指针size要检查的块的大小
返回值:
此函数检查用户空间中的内存块是否可用。如果可用,则返回真(非0值),否则返回假 (0) 。2. 源码分析#defineaccess_ok(type,addr,size)(__range_ok(addr,size)==0)/*Weuse33-bitarithmetichere...*/#define__range_ok(addr,size)({\ unsignedlongflag,roksum;\ __chk_user_ptr(addr);\ __asm__("adds%1,%2,%3;sbcccs%1,%1,%0;movcc%0,#0"\ :"=&r"(flag),"=&r"(roksum)\ :"r"(addr),"Ir"(size),"0"(current_thread_info()->addr_limit)\ :"cc");\ flag;})staticinlinevoid__chk_user_ptr(constvolatilevoid*p,size_tsize) { assert(p>=__user_addr_min&&p+size<=__user_addr_max); }
其中__range_ok详解如下: 参数对应:flag--------%0roksum--------%1addr--------%2size--------%3
汇编指令详解adds%1,%2,%3
等价于:rosum=addr+size
这个操作会影响状态位(目的是影响是进位标志C)。
以下的两个指令都带有条件CC,也就是当C=0的时候才执行; 如果上面的加法指令进位了(C=1),则以下的指令都不执行,flag就为初始值current_thread_info()->addr_limit(非0),并返回。 如果没有进位(C=0),就执行下面的指令:sbcccs%1,%1,%0
该指令等价于rosum=rosum-flag-1
也就是(addr + size) - (current_thread_info()->addr_limit) - 1,操作影响符号位。.
如果(addr + size) >= (current_thread_info()->addr_limit) - 1,则C=1 如果(addr + size) < (current_thread_info()->addr_limit) - 1,则C=0 当C=0的时候执行以下指令,否则跳过(flag非零)。movcc%0,#0
等价于flag=0,给flag赋值0。
综上所述:__range_ok宏等价于:如果(addr+size)>=(current_thread_info()->addr_limit)-1,返回非零值 如果(addr+size)<(current_thread_info()->addr_limit),返回零
而access_ok就是检验将要操作的用户空间的地址范围是否在当前进程的用户地址空间限制中。这个宏的功能很简单,完全可以用C实现,不是必须使用汇编。 由于这两个函数使用频繁,就使用汇编来实现部分功能来增加效率。3. 使用实例
我们在内核拷贝数据到用户空间或者从用户空间拷贝数据到内核空间,都需要判断用户空间地址是否在用户空间。staticinlineunsignedlong__must_checkcopy_from_user(void*to,constvoid__user*from,unsignedlongn){ if(access_ok(VERIFY_READ,from,n)) n=__copy_from_user(to,from,n); else/*securityhole-plugit*/memset(to,0,n); returnn; }staticinlineunsignedlong__must_checkcopy_to_user(void__user*to,constvoid*from,unsignedlongn){ if(access_ok(VERIFY_WRITE,to,n))
郑云龙回应仝卓喊话近日有关于郑云龙回应仝卓喊话的问题受到了很多网友们的关注,大多数网友都想要知道郑云龙回应仝卓喊话的具体情况,那么关于到郑云龙回应仝卓喊话的相关信息,小编也是在网上进行了一系列的信息
新闻稿件(播音主持必练新闻稿)新闻稿件(播音主持必练新闻稿)春天,湖北荆州洪湖市燕窝镇燕子窝村,新升隆轮遇难烈士纪念碑背后的树林,枝头新绿渐渐成片。新华日报交汇点记者瞻仰纪念碑后,跟随燕窝镇文化站站长汪瑞,去往
朗诵稿件(自备稿件男生艺考播音主持)朗诵稿件(自备稿件男生艺考播音主持)青春中国作者解琛朗诵黎敏青春中国。mp3258来自四季美文是遍野的春风浩荡是满江的云帆争流是蓄势的红日喷礴是燃烧的激情奔涌我的青春在五千年的历史
播音主持培训班(哪里有播音主持培训学校)播音主持培训班(哪里有播音主持培训学校)播音与主持是一门语言艺术。为了让孩子们感悟语言魅力,敢说会说善说,今天上午,武汉市江夏区文化路小学联合武汉教育电视台推出的小主持人培训班启动
北电艺考线上完成关于到现在北电艺考线上完成这个话题,相信很多小伙伴都是非常有兴趣了解的吧,因为这个话题也是近期非常火热的,那么既然现在大家都想要知道北电艺考线上完成,小编也是到网上收集了一些与北电
北电艺考线上完成今天小编来给大家针对这个北电艺考线上完成的问题来进行一个介绍,毕竟当下也是有诸多的小伙伴对于北电艺考线上完成这个问题非常的重视的,下面大家可以看下具体的详情今日一则关于北电艺考线上
北电艺考线上完成北电艺考线上完成关于到现在北电艺考线上完成这个话题,相信很多小伙伴都是非常有兴趣了解的吧,因为这个话题也是近期非常火热的,那么既然现在大家都想要知道北电艺考线上完成,小编也是到网上
吴磊为什么不提爸爸(吴磊照片)长歌行是近日热火的番剧,除了皓嫣cp超甜不粘腻的恋爱,男一的扮演者吴磊也备受。吴磊可以说通过阿诗勒隼这个角色,再次回到大家的视线。大家都知道,吴磊是童星出道,一直活跃在娱乐圈,所以
全国高校校草?(全国十大校草排行榜)全国高校校草(全国十大校草排行榜)人类都是视觉动物,都喜欢追求美好漂亮的事物。尤其是在一个颜值至上的时代,可以说一个人颜值越高,受欢迎程度也就越高。在学生时代,校园里不乏有些颜值高
中考多少分能上高中(考不上高中又想读高中怎么办)我国是一个比较重视教育的国家,针对教育问题,国家推出过很多种制度,在教育政策方面,做出了很多改变,特别是中考政策,录取分数也发生了很大变化。这些相关政策还没有出现前,针对一些省份的
哪里的高中好(高中要多少分才能上)9月1日正是开学日,孩子们也正式成为了初三生,即将开启中考备考模式,家长们也要开始中考招生资讯。比如中考录取分数线,深圳各高中学校(含普高职高技工学校)的录取分数线是根据各学校的招