在运行Linux的基于ARM的系统上,我有一个将内存映射到物理地址的设备。从所有地址都是虚拟的用户空间程序中,如何从该地址读取内容?
您可以使用mmap(2)
系统调用将设备文件映射到用户进程内存。通常,设备文件是物理内存到文件系统的映射。否则,您必须编写一个内核模块来创建此类文件或提供一种将所需内存映射到用户进程的方法。
另一种方法是将/ dev / mem的部分重新映射到用户内存。
编辑:mmaping / dev / mem的示例(此程序必须有权访问/ dev / mem,例如具有root权限):
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
if (argc < 3) {
printf("Usage: %s <phys_addr> <offset>\n", argv[0]);
return 0;
}
off_t offset = strtoul(argv[1], NULL, 0);
size_t len = strtoul(argv[2], NULL, 0);
// Truncate offset to a multiple of the page size, or mmap will fail.
size_t pagesize = sysconf(_SC_PAGE_SIZE);
off_t page_base = (offset / pagesize) * pagesize;
off_t page_offset = offset - page_base;
int fd = open("/dev/mem", O_SYNC);
unsigned char *mem = mmap(NULL, page_offset + len, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, page_base);
if (mem == MAP_FAILED) {
perror("Can't map memory");
return -1;
}
size_t i;
for (i = 0; i < len; ++i)
printf("%02x ", (int)mem[page_offset + i]);
return 0;
}
问题内容: 我想找到用户空间进程中定义的变量的物理地址吗?有什么办法可以使用root特权吗? 问题答案: 首先,您为什么要这样做?现代VM系统的目的是使应用程序程序员摆脱物理内存布局的复杂性。给他们每个人一个统一的地址空间,使他们的生活更轻松。 如果确实要执行此操作,则几乎确实需要使用内核模块。以常规方式获取变量的虚拟地址,使用它来索引进程页面表并读取找到的值(框架的物理地址)。然后添加页面偏移量
问题内容: 我阅读了LKD 1中的一些段落,但 我无法理解以下内容: 从用户空间访问系统调用 通常,C库提供对系统调用的支持。用户应用程序可以从标准标头中提取函数原型,并与C库链接以使用您的系统调用(或库例程,后者又使用syscall调用)。但是,如果您只是编写了系统调用,则怀疑glibc是否已支持它! 幸运的是,Linux提供了一组宏,用于包装对系统调用的访问。它设置寄存器内容并发出陷阱指令。这
问题内容: Linux内核内部用户内存和内核内存的区别是什么 (就给内核空间提供安全性而言)? 我可以从用户空间在内核地址空间中写入什么不同的方式? 我知道的一种方法是通过系统调用 。我们可以使用多个系统调用,但最后它们都是系统调用。即使在系统调用中,我们也将数据发送到内核空间,在此它(驱动程序或相应的模块)调用诸如copy_from_user()之类的函数将数据从用户空间复制到内核空间。在这里,
问题内容: 有没有办法从linux中的用户空间分配连续的物理内存?至少有几个保证的连续内存页。一个巨大的页面不是答案。 问题答案: 不,那里没有。您 确实 需要在内核空间中执行此操作。 如果您说“我们需要从用户空间执行此操作”-没有在内核空间中进行任何操作,那没有什么意义-因为用户空间程序无法控制 甚至不知道 底层内存是否连续。 您需要执行此操作的唯一原因-是与某个硬件或其他需要此要求的低层(即内
主要内容:物理地址空间,逻辑地址空间,什么是单词?物理地址空间 系统中的物理地址空间可以被定义为主存储器的大小。 将进程大小与物理地址空间进行比较非常重要。 进程大小必须小于物理地址空间。 逻辑地址空间 逻辑地址空间可以定义为进程的大小。 进程的大小应该足够小,以便它可以驻留在主内存中。 什么是单词? Word是内存的最小单位。 它是字节的集合。 在分析输入到解码器的n位地址和从解码器产生的2 ^ n个存储位置之后,每个操作系统定义不同的字长。
问题内容: 我需要在〜/ .config / myapp.cfg中创建一个配置文件,所以我要使用: 问题是,它告诉我,该目录不存在,类似这样。 我尝试将路径更改为/ home / user之类的东西,它起作用了。所以我设法得出一个结论,即java不知道〜/的含义以及文件夹名前的punct(。)的含义,因为/home/user/.config也无法正常工作。 我该怎么办? 问题答案: 这种表示法是一