- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在阅读“The Linux Kernel Module Programming Guide”中的一段,我对下一段有一些疑问。
The reason for copy_from_user or get_user is that Linux memory (on Intel architecture, it may be different under some other processors) is segmented. This means that a pointer, by itself, does not reference a unique location in memory, only a location in a memory segment, and you need to know which memory segment it is to be able to use it. There is one memory segment for the kernel, and one for each of the processes.
但据我了解,Linux 使用分页而不是分段,并且 0xc0000000 及以上的虚拟地址具有内核映射。
最佳答案
是的。我也不喜欢这种解释。从技术意义上讲,细节基本上是正确的(另请参见 Why does Linux on x86 use different segments for user processes and the kernel? )但是正如您所说,linux 通常会映射内存以便内核代码可以直接访问它,所以我认为这不是为什么 copy_from_user
等实际存在
IMO,使用 copy_from_user
/copy_to_user
(和 friend )的主要原因很简单,就是有很多事情需要检查(要防范的危险),将所有这些检查放在一个地方是有意义的。您不希望每个需要将数据复制进出用户空间的地方都必须重新实现所有这些检查。尤其是当细节可能因一种架构而异时。
例如,当您需要复制到该内存或从该内存复制时,用户空间页面可能实际上不存在,因此从可以容纳页面错误的上下文进行调用很重要(因此休眠)。
此外,用户空间数据指针需要仔细检查以确保它们实际指向用户空间和数据区域,并且副本长度不会超出有效区域的末尾,等等。
最后,有可能用户空间实际上不与内核共享相同的页面映射。曾经有一个 32 位 x86 的 linux 补丁,它使完整的 4G 虚拟地址空间可供用户空间进程使用。在那种情况下,内核代码无法假设用户空间指针可以直接访问,并且这些函数可能需要一次映射一个单独的用户空间页面才能访问它们。 (参见 4GB/4GB Kernel VM Split)
关于copy_from_user 和分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36222246/
我正在尝试使用模块读取/写入内核内存,到目前为止读取部分正在工作。我有一个来自用户空间的程序,它打开我的模块创建的设备,并且可以从 x addr (内核内存地址)读取 n 个字节,并且这可以工作(正在
我在编译我的内核模块时遇到了一个警告,我无法解决这个问题。 首先看一下这个简化的代码: #define READ_CHUNK 100u static int _procfs_write(struct
我正在尝试编写一个 Open RG 内核模块,它在给定的时间间隔内向用户空间发送一条消息。为此,我需要内核在将存储此消息的用户空间中保存一个指向静态缓冲区的指针。我在将指针发送到内核时遇到问题。 用户
涉及的结构如下。 结构节点{ 诠释; 诠释乙; } struct ioctl_node { struct node **ptr; int count; //Stores
我正在阅读“The Linux Kernel Module Programming Guide”中的一段,我对下一段有一些疑问。 The reason for copy_from_user or ge
我正在阅读 LDD3。在 chapter 8 ,我无法理解这一段: An example of a function in the kernel that uses vmalloc is the cr
我有一个指向用户空间模式下的数据缓冲区的指针,现在我想使用“copy_from_user”函数将该数据的值复制到内核模式。 假设我的数据指针是“data.ptr.buffer”,它的大小是“dat
我只是想知道为什么 copy_from_user(to, from, bytes) 做真正的复制?因为它只是想让内核访问用户空间的数据,是否可以不移动数据而直接将物理地址映射到内核的地址空间?谢谢,
我正在尝试为保存整数“timer_interval”(全局变量)的 sysfs 文件创建一个存储函数。 static ssize_t sys_store(struct kobject *kobj, s
copy_from_user() 用于内核模块。所以我的理解是它在内核空间中运行。但是,在阅读此“仅用户上下文。此功能可能会休眠”后,我感到困惑。谁能给我一个解释? 最佳答案 短语“用户上下文”并不是
在 uaccess.h 中声明的 copy_from_user 函数是否修改了 (void __user *)from 指针?该指针在函数声明中未声明为 const,仅声明其指向的内容。 我问的原因是
这里是返回值的说明。 unsigned long copy_from_user (void *to, const void __user *from, unsigned long count)
我正在寻找将 PID 值从用户空间复制到内核空间的方法,这是我的代码快照。 内核模块: #include #include #include #include #include #inclu
这个问题在这里已经有了答案: Why do you have to use copy_to_user()/copy_from_user() to access user space from the
我正在尝试使用此函数将缓冲区从用户复制到内核中的缓冲区。两个缓冲区都已分配。我使用 while 以防第一次尝试时未复制所有字节。但由于某种原因,没有复制任何内容,并且程序卡在 while 循环中。原因
我有以下系统调用: long do_print(int n, char *p){ char tmp[n]; //allocate array of n bytes int ret = copy
我试图在 Linux 中编写一个加密驱动程序,但是当我加密字符串并使用 copy_from_user() 将其复制到缓冲区时,它不起作用并且 k 值是字符串中的字符数 如果我将 copy_from_u
我使用在 Mint Linux 下运行的 Linux 内核 v4.0.5 开发了一个简单的线规程。 tty_ldisc_ops 结构如下所示: static struct tty_ldisc_ops
我正在尝试使用以下函数将值从用户空间复制到内核空间: static ssize_t device_write(struct file *filp, const char *buff, size_t l
我正在编写一个 linux 内核驱动程序,对于将数据发送到用户空间或从用户空间读取数据的每个函数,我正在使用 copy_to_user() 和 copy_from_user()。我的问题是:如果我只是
我是一名优秀的程序员,十分优秀!