【问题标题】:linux & c - access file on disk.. by address?linux & c - 访问磁盘上的文件..按地址?
【发布时间】:2014-11-13 00:16:07
【问题描述】:

是否可以在 c 程序或终端 (linux) 中通过地址访问文件?我知道这听起来很奇怪,实际上对我来说也是如此,但我只是在尝试。

例如替换

FILE * f = fopen("myfile.txt","r")

通过一些绝对令人惊叹的东西

int fd = open(&0x545f6f5,"r")

或者 echo &0x545f6f5 会抓取相关文件的一部分(需要一个长度,所以更像 echo &0x545f6f5 20 来读取地址旁边的 20 个字节)?

我知道 mmap,但我的问题更像是实验。

嗯,总体情况是:可以通过地址(理想情况下是长度)访问 linux 文件系统上文件的任何部分吗?

更新:

说我的分区 id /dev/sda1,我想用地址而不是名称访问原始内存值(可读或不可读)。 如果我寻找地址 &0x545f6f5 并且它恰好是偏移量为 64 的 myfile.txt,我将读取该位置的字节。我希望它更清楚:)

【问题讨论】:

  • 在您定义地址的含义之前,这没有意义 - 0x545f6f5 应该是什么意思?内存地址?文件中的字节偏移量?硬盘上的物理位置?
  • 我认为您需要了解硬盘驱动器和文件系统的工作原理。查看en.wikipedia.org/wiki/Cylinder-head-sector
  • @seanmk CHS 寻址今天不再使用。今天的硬盘使用 LBA 寻址,如果您要使用基于 CHS 的磁盘,Linux 会为您抽象出这些差异。
  • 如果确实存在这样的功能会解决什么问题?
  • @jxh :它本身并没有解决问题,但它只是在玩系统,并测试新的可能性

标签: c linux file


【解决方案1】:

假设myfile.txt 位于安装在/ext3 文件系统上,并且该文件系统位于分区/dev/sda1 上。如果您知道文件在磁盘上的偏移量,您可以想象打开设备/dev/sda1(分区)或/dev/sda(整个驱动器)并访问文件的字节。

例如,如果您以某种方式确定文件的内容位于第一个硬盘驱动器的第一个分区上的偏移量 0xDEADBEEF,您可以这样做:

int fd = open("/dev/sda1", O_RDONLY);
lseek(fd, 0xDEADBEEF, SEEK_SET);
read(fd, buffer, 20);

以这种方式访问​​原始设备会绕过文件系统。文件系统是存储文件元数据的地方,例如它们的名称、位置和大小。如果您在/dev/sda1 的开头戳了一下,您可以想象自己读取原始文件系统数据,而不是依赖内核文件系统驱动程序来为您完成。

【讨论】:

  • 需要注意的是,使用 OS 库可能是更简单的方法。
  • 请注意,对包含文件系统的设备文件执行 IO,尤其是在挂载该文件系统时会带来一些风险。请不要尝试写入当前已挂载的文件系统,否则可能导致数据丢失。
  • @SevenBits 我认为没有比open()read()write()lseek() 等基本系统调用更简单的方法了。
  • 是的,我说的是 /dev/sda1 例如分区的根目录
  • @FUZxxl 这就是为什么我说使用操作系统库是一条更简单的路线——您不必担心编写已挂载的文件系统会导致潜在问题。
猜你喜欢
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 2012-01-20
  • 2021-08-09
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 2015-01-19
相关资源
最近更新 更多