用户内存和内核内存究竟与Linux内核有何区别(在为内核空间提供安全性方面)?
我可以在用户空间的内核地址空间中编写哪些不同的方法?
我知道的一种方法是通过系统调用.我们可以使用多个系统调用,但最后它们都是系统调用.即使在系统调用中,我们也会将数据发送到内核空间,在那里它(驱动程序或各个模块)调用copy_from_user()等函数将数据从用户空间复制到内核空间.在这里,我们完全没有写入地址空间.我们只是传递一个用户指针,其中包含需要复制到内核缓冲区的数据.
我的问题是,我们有什么方法可以访问内核空间中存在的物理地址并对其执行操作?
第二,除了系统调用之外还有其他方法可以从用户应用程序写入内核空间吗?
我从stackoverflow中提到了这个链接.但我认为我的问题没有得到回答,而且是从不同的角度来看.因此,我想问一个不同的问题.
请分享您的知识...谢谢.
我面临一个相当棘手的问题.我正在尝试将2个虚拟内存区域指向相同的物理内存.关键是在不同的内存区域上有不同的页面保护参数.
在这个论坛上,用户似乎有一个解决方案,但它似乎有点hacky并且很明显可以在性能方面做得更好:http: //www.linuxforums.org/forum/programming-scripting/19491-map -两个虚存储器ADDRES-相同物理-page.html中
当我面临同样的问题时,我想在这里试一试,知道是否有人有更好的想法.不要害怕提到引擎盖后面的脏细节,这就是这个问题的内容.
提前谢谢.
我试图将操作系统(Ubuntu Server 15.04)限制为特定的内存使用量并保留其余部分,但编写内核模块以读取/写入保留的内存。我想出了如何使用内核参数“mem=4G memmap=4G@0 memmap=4G$4G”(操作系统为 4GB,保留 4GB,在 4GB 点拆分)来限制使用/保留内存,但我不知道如何保留内存的 DMA 与内核模块一起使用。我想只创建一个 proc 文件,但我不确定您是否可以在操作系统分配的内存之外创建一个。
有什么建议?谢谢!
编辑:这是为了研究,所以它不需要“很好”
更新: 也许我不需要编写内核模块。我刚刚找到了这个,我打算试一试:http : //elinux.org/Memory_Management#Reserving_.28and_accessing.29_the_top_of_memory_on_startup
更新: 我尝试了上面的链接,但是每当我尝试编写时都会出现段错误。这是我的代码:
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mann.h>
#define RESERVED_MEMORY_SIZE 0x100000000
int main() {
int fd;
char *reserved_memory;
fd = open("/dev/mem", O_RDWR | O_SYNC);
reserved_memory = (char *) mmap(0, RESERVED_MEMORY_SIZE, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, fd, 4096);
reserved_memory[0] = 'a';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
dmesg 显示:
a.out[1167]: segfault at ffffffffffffffff ip 00000000004005d7 sp 00007ffeffccbd80 error 7 in …Run Code Online (Sandbox Code Playgroud) 我正在研究ubuntu.
我想打开/dev/mem,我正在接受permission denied
int32_t open_memdev()
{
int32_t fd;
fd = open("/dev/mem", O_RDONLY);
if (fd < 0) {
printf("Failed to open /dev/mem : %s\n", strerror(errno));
return-EINVAL;
}
return fd;
}
Run Code Online (Sandbox Code Playgroud)
此代码始终打印 "Failed to open /dev/mem : Operation not permitted"
我在SO上搜索过这个
这些q似乎讨论了无法访问超过1 MB的问题,但我的问题是我甚至无法打开一次.
添加详细信息如果有帮助:
1)我检查了配置是否启用了CONFIG_STRICT_DEVMEM.
2) ls -l /dev/mem
crw-r----- 1 root kmem 1, 1 2014-03-13 13:57 /dev/mem
Run Code Online (Sandbox Code Playgroud)
如果需要其他信息,请与我们联系.