iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >Linux内核怎么判断地址是否位于用户空间
  • 587
分享到

Linux内核怎么判断地址是否位于用户空间

2023-06-15 14:06:22 587人浏览 薄情痞子
摘要

这篇文章主要介绍“linux内核怎么判断地址是否位于用户空间”,在日常操作中,相信很多人在Linux内核怎么判断地址是否位于用户空间问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux内核怎么判断地址是否

这篇文章主要介绍“linux内核怎么判断地址是否位于用户空间”,在日常操作中,相信很多人在Linux内核怎么判断地址是否位于用户空间问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux内核怎么判断地址是否位于用户空间”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、 问题描述

access_ok函数是什么原理?

Linux内核怎么判断地址是否位于用户空间

问题

二、问题分析

我们在内核空间和用户空间进行数据拷贝的时候必须判断用户空间地址是否合法。主要通过偶函数access_ok来判断。

1. Linux用户空间与内核地址空间

Linux  操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。

通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。注意这里是32位内核地址空间划分,64位内核地址空间划分是不同的。

Linux内核怎么判断地址是否位于用户空间
  • 进程寻址空间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. 源码分析

#define access_ok(type, addr, size) (__range_ok(addr, size) == 0)
 #define __range_ok(addr, size) ({ \  unsigned long flag, 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; })
static inline void __chk_user_ptr(const volatile void *p, size_t size) {  assert(p >= __user_addr_min && p + size <= __user_addr_max); }

其中__range_ok详解如下:参数对应:

flag   --------  %0 roksum --------  %1 addr   --------  %2 size   --------  %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. 使用实例

我们在内核拷贝数据到用户空间或者从用户空间拷贝数据到内核空间,都需要判断用户空间地址是否在用户空间。

static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n) {  if (access_ok(VERIFY_READ, from, n))   n = __copy_from_user(to, from, n);  else    memset(to, 0, n);  return n; }  static inline unsigned long __must_check copy_to_user(void __user *to, const void *from, unsigned long n) {  if (access_ok(VERIFY_WRITE, to, n))   n = __copy_to_user(to, from, n);  return n; }

到此,关于“Linux内核怎么判断地址是否位于用户空间”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Linux内核怎么判断地址是否位于用户空间

本文链接: https://www.lsjlt.com/news/280489.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Linux内核怎么判断地址是否位于用户空间
    这篇文章主要介绍“Linux内核怎么判断地址是否位于用户空间”,在日常操作中,相信很多人在Linux内核怎么判断地址是否位于用户空间问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux内核怎么判断地址是否...
    99+
    2023-06-15
  • Linux用户空间与内核地址空间的详细介绍
    这篇文章主要介绍“Linux用户空间与内核地址空间的详细介绍”,在日常操作中,相信很多人在Linux用户空间与内核地址空间的详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux用户空间与内核地址空...
    99+
    2023-06-15
  • linux内核用户空间0虚拟地址映射漏洞怎么修复
    本篇内容主要讲解“linux内核用户空间0虚拟地址映射漏洞怎么修复”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux内核用户空间0虚拟地址映射漏洞怎么修复”吧!0x00 漏洞原理...
    99+
    2023-06-19
  • linux怎么判断用户是否存在
    可以使用以下命令来判断Linux系统中是否存在某个用户:1. 使用`grep`命令来搜索`/etc/passwd`文件中的用户名:`...
    99+
    2023-10-10
    linux
  • linux怎么判断变量是否为空
    在Linux中,可以使用以下方式判断一个变量是否为空: 使用if语句判断变量是否为空: if [ -z "$var&q...
    99+
    2024-03-01
    linux
  • linux怎么判断文件是否为空
    在Linux中,可以使用以下几种方法来判断文件是否为空:1. 使用`ls -l`命令来查看文件的大小,如果大小为0,则说明文件为空。...
    99+
    2023-08-12
    linux
  • jquery怎么判断时间框是否为空
    在前端开发中,经常需要对页面中的输入框进行验证,确保用户的输入符合要求。其中一个重要的验证就是判断时间框是否为空。通常情况下,我们可以利用JavaScript来进行输入框的验证,但是在项目中,我们经常使用jQuery库来方便我们进行开发。接...
    99+
    2023-05-14
  • linux中怎么判断当前用户是否是root
    这期内容当中小编将会给大家带来有关linux中怎么判断当前用户是否是root,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。linux 中,如何判断当前用户是否是root 呢? 判断当前用户是否是root ...
    99+
    2023-06-13
  • Android应用中怎么判断ip地址是否合法
    本篇文章给大家分享的是有关Android应用中怎么判断ip地址是否合法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。具体方法如下public boolean isIP(Stri...
    99+
    2023-05-31
    android roi
  • hbase怎么判断命名空间是否存在
    在HBase中,可以使用Java API或者HBase Shell来判断命名空间是否存在。 使用Java API可以通过HBaseA...
    99+
    2024-04-09
    hbase
  • 怎么使用linux shell判断参数是否为空
    要使用Linux Shell判断参数是否为空,可以使用条件语句和特殊变量"$#"来实现。以下是一个使用if语句判断参数是否为空的示例...
    99+
    2023-08-30
    linux shell
  • Js怎么判断输入内容是否为空
    本篇内容主要讲解“Js怎么判断输入内容是否为空”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Js怎么判断输入内容是否为空”吧!1、判断输入内容是否为空 ...
    99+
    2024-04-02
  • Shell脚本中怎么判断IP地址是否在一个ip段内
    今天就跟大家聊聊有关Shell脚本中怎么判断IP地址是否在一个ip段内,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。cat ipcalc.sh#!/bin/bashIP=$...
    99+
    2023-06-09
  • 怎么看待Linux操作系统的用户空间和内核空间
    这篇文章主要为大家展示了“怎么看待Linux操作系统的用户空间和内核空间”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么看待Linux操作系统的用户空间和内核空间”这篇文章吧。作为中央核心处理...
    99+
    2023-06-16
  • Shell脚本中怎么判断IP地址是否合法
    Shell脚本中怎么判断IP地址是否合法,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。使用shell校验IP地址合法性代码如下:[root@yang pytho...
    99+
    2023-06-09
  • php怎么判断用户是否登录
    在PHP中,可以通过以下几种方式来判断用户是否登录:1. 使用会话(Session):在用户登录成功后,将用户的登录状态保存在会话中...
    99+
    2023-08-25
    php
  • 怎么判断香港空间是否接入CN2专线
    判断香港空间是否接入CN2专线的方法:1、使用Ping命令检测本地主机访问IP的数据发送和接收速度,一般使用CN2专线的香港空间ping值稳定在小于或等于40ms;2、通过tracert路由追踪,对中转节点的路由路径进行判断,如果路由追踪结...
    99+
    2024-04-02
  • java怎么判断用户名是否重复
    在Java中判断用户名是否重复可以使用以下步骤: 建立一个存储用户名的数据结构,比如一个数组或者一个集合。 当用户输入一个新的用户...
    99+
    2023-10-23
    java
  • 怎么判断html中文本框内容是否为空
    这篇文章主要介绍怎么判断html中文本框内容是否为空,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.通过PHP语句判断 :html中内容:<form action="submit.php&...
    99+
    2023-06-14
  • 使用JavaScript怎么判断数组是否为空
    本篇文章给大家分享的是有关使用JavaScript怎么判断数组是否为空,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java可以用来干什么Java主要应用于:1. web开发;...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作