【问题标题】:Get physical memory address of a file/photo in linux or android [closed]在linux或android中获取文件/照片的物理内存地址[关闭]
【发布时间】:2019-12-15 17:27:36
【问题描述】:

我在 android 中有一个文本文件(或 jpg 照片),它本质上是一个修改后的 linux 系统(我有一些使用 NDK 在 android 中编写本机 C 代码的经验)。我只是想找到这个文件/照片开头的物理内存地址。所以得到一个类似的返回值:0x9abcdef0。我的理解是文件/照片存储在物理内存地址空间的某个地方,如果这个假设是错误的,请告诉我。

我研究了诸如 mmap 之类的调用和一些 SO 帖子,但它们并没有真正做我想要的,只是返回地址。我也不需要诸如 open() 之类的函数或与文件描述符相关的东西,而是希望获得较低级别的真实地址。

How to access physical addresses from user space in Linux?

linux kernel - how to get physical address (memory management)?

use mmap in C to write into memory.

【问题讨论】:

  • 在我看来,整个文件系统都不太可能在 RAM 中访问。这就是拥有大型存储介质与快速非永久性存储的全部意义所在。您需要解决的实际问题是什么?
  • @Bqin1:在这种情况下,您遇到了 XY 问题。实现这一点的方法不是“获取文件的物理内存地址”。理想情况下,您只需在删除 UI 不知道的位置创建指向文件的硬链接,因此当它删除文件时,仍然会保留一个链接。但是,我不确定存储的文件系统照片是否允许硬链接。或者,您可以查看目录,然后对那里创建的所有内容进行备份(尽管会浪费空间)。
  • @R 谢谢,我已经试过备份了,那个方法太浪费空间了。关于硬链接,你是什么意思,你能举个例子说明如何在linux中创建这个硬链接吗?

标签: android c linux memory memory-management


【解决方案1】:

我的理解是文件/照片存储在物理内存地址空间的某个位置,如果这个假设是错误的,请告诉我。

这个假设是错误的。

文件永久存储在“磁盘”上 - 在典型的 Android 设备上,这将是 eMMC,本质上是焊接在主板上的 SD 卡。磁盘上的文件存储在文件系统中,文件系统是一组数据结构,可让您从路径名到文件以及从文件和偏移量获取文件偏移量所在的物理存储位置。

文件通常不会永久存在于物理内存中。当被访问时,它们的一部分将临时驻留在内存中的不同物理地址。如果mmapped 作为共享映射,它们将在映射的生命周期内在进程中的固定虚拟地址处可寻址,但此映射背后的物理内存可以随时变化。

【讨论】:

  • 您好,谢谢您的解释,我明白了一些,但有些部分感到困惑。你说物理内存上的文件可以随时变化,但是如果系统一直希望在哪里找到这个文件,它怎么知道呢?你还说文件在磁盘上有永久存储,那么磁盘上这个永久存储的地址不就是我要找的吗?是不是十六进制内存地址格式,能不能返回?
  • 是的,我不喜欢 mmap,因为我不需要映射虚拟地址。我的进程会死掉,所以虚拟地址无论如何都会被回收。我需要一个永久/较低系统级别的文件处理程序
  • @Bqin1:文件没有永久句柄。在基于闪存的存储(SSD、SD、eMMC 等)上,物理位置甚至不会暴露给 cpu/OS,并且每次进行更改时都会不断移动以进行磨损均衡。存储块有逻辑地址,但与特定文件关联的块不必是连续的,并且它们是否随着时间的推移保持固定取决于操作系统的文件系统实现(例如,一个好的实现可能会尝试将它们移动到碎片整理)...
  • 无论如何,最接近文件永久句柄的是引用它的路径名。
猜你喜欢
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 2011-09-09
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多