内核访问用户空间的限制和方法

用户函数不能访问内核空间,而且用户函数进行系统调用的参数也是经过寄存器进行传递,那么内核能不能访问用户空间呢?

内核函数是有访问用户空间的要求:

  • 如果一个系统调用需要超过6个参数,它们就只能借助进程内存空间中的C结构实例进行传递。系统调用将借助寄存器,将指向该结构实例的一个指针传递给内核。
  • 由系统调用的副效应产生的大量数据,必须通过指定的内存区交换数据。当然,该内存区必须在用户空间中,使得用户应用程序能够访问。

但是内核函数却不能直接解引用用户空间的指针,基于以下原因:

  • 用户空间的指针指向的地址可能在内核运行期间无效
  • 即使指针有效但是指针指向的数据却不驻留在内存中,就会造成缺页异常
  • 指针可能由于程序的恶意或错误产生,直接访问就会造成系统的不稳定

内核可以通过以下函数间接的访问用户空间:

access_okChecks the validity of the user space memory pointer
get_userGets a simple variable from user space
put_userPuts a simple variable to user space
clear_userClears, or zeros, a block in user space
copy_to_userCopies a block of data from the kernel to user space
copy_from_userCopies a block of data from user space to the kernel
strnlen_userGets the size of a string buffer in user space
strncpy_from_userCopies a string from user space into the kernel

参考:

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lylhw13_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值