Lop*_*poc 10 c memory filesystems linux-device-driver hard-drive
如何获取对HD的原始访问权限并知道该位置是否已使用或是否为可用空间?只是一个例子,我可以通过在磁盘设备上打开和读取来获得直接访问,目标是知道是否使用了例如10.000字节.
Meh*_*ari 17
您可以只open使用块设备(例如/dev/sda)并手动读取扇区.但是,这不会告诉你它是否是空的直接.空或不是在文件系统抽象级别定义的东西.文件系统数据结构存储了这种数据,您应该从原始块(不使用任何文件系统提供的功能)深入了解特定文件系统.
在所有可能的情况下,您不希望直接通过/ dev/sd*或/ dev/hd*访问块设备.正如其他人所说,你必须了解原始的底层文件系统,这将非常困难.
如果您正在编写一个想要将磁盘上的字节视为大线性地址空间的应用程序,那么请查看mmap()系统调用.您可以在磁盘上创建一个大的空文件,然后使用mmap()将其映射到您的进程空间.从那里,您可以使用常规内存操作来读取和写入底层大文件.请注意,写入是缓冲的,因此保证一致性可能很棘手.
这种方法的优点是即使底层文件是碎片化的,您的访问模式也可以将其视为字节的线性集合.
谨慎行事......
不要忘记您必须配合现有的驱动程序堆栈自己的线程安全规定和内部缓存.系统中的许多线程可以(并且将)一直写入磁盘.要擦除一个免费的部门,你必须知道它是免费的,并且在你拥有它的同时保持自由.如果您擦除了文件系统已经决定使用的扇区,但是没有将该决定的证据刷新到磁盘上,那么您将无法知道它正在使用中.这可能导致数据丢失,从而导致愤怒的用户.
如果您可以保证文件系统当前未安装,那么原则上至少可以打开/dev/sda(可能不是您想要的特定的!)并解析磁盘上的数据结构以执行您需要执行的任何操作.这实际上是怎么样的事业fsck和mkfs实现.
剩下的大问题是你必须与你可能遇到的每个文件系统的每个版本保持同步.至少你有可用于文件系统本身的源代码供参考,但将它从内核移出并进入用户模式应用程序并不容易.
我的建议是使用文件系统本身来获得所需的保证.打开大文件并用您的擦除图案填充它们.将磁盘填满容量.请注意,如果这可能会对假定某些磁盘空间可用的任何正在运行的守护程序产生严重影响,那么可能仍需要在具有大多数守护程序且已杀死的守护程序上完成.如果您的目标是进行安全擦除,您仍然需要担心在传递之间实际将写入的块刷新到磁盘,因为普通文件系统中的所有内容都将尝试优化单个块的多次写入.
天啊.
您的代码必须:
如果我是你,我会重新考虑你想做什么.
编辑:看到他对他实际上要做的事情的评论,