Я хочу получить доступ ко всему жесткому диску непосредственно из программы на Си. Там нет ФС и никогда не будет.
Я просто хочу открыть / dev / sda (например) и выполнить ввод-вывод на уровне блоков / секторов диска.
Я планирую написать несколько программ для изучения C-программирования в среде Linux (я знаю язык C, Python, Perl и Java), но мне не хватает уверенности в среде Linux.
В своих целях обучения я думаю, о воспроизведении с kyoto-cabinet и сохранении значения, соответствующего вычисленному хешу, непосредственно в «блок / сектор» жесткого диска, записи пары: «хэш, ссылка на блок / сектор» в файл базы данных хеша kyoto-cabinet.
Я не Я не знаю, возможно ли это с использованием стандартных функций CI / O, иначе мне придется написать «драйвер устройства» или что-то вроде ...
Да, как отметили другие, вы можете просто открыть блочное устройство.
Однако, это действительно хорошая идея - делать IO (запись в любом случае) на границах блоков и целых блоков. Вы можете использовать что-то вроде pread() и pwrite() для выполнения этих операций ввода-вывода, или mmap часть или все устройство.
Существует множество иоктлов, которые могут быть использованы, смотрите "man sd" для получения дополнительной информации. Не похоже, что все они документированы в одном месте.
В linux/fs.h определены BLKROSET и куча других ioctls, вам придется поискать, чтобы узнать, как их использовать. Вы можете делать полезные вещи, например, узнавать размер устройства и размер блока.
Исходный код пакета util-linux-ng - ваш друг, он содержит примеры.
Поскольку файлы устройств для дисков (например, / dev / sda
) являются блочными устройствами, это означает, что вы можете открывать, искать и использовать файл почти как обычный файл.
Как упоминалось в другом месте, в системах * NIX, блочные устройства, такие как / dev / sda
можно получить как простые файлы. Обратите внимание, что если файловая система смонтирована с устройства, открыть ее как файл для записи не удастся.
Если вы хотите поиграть с блочными устройствами, я бы посоветовал сначала использовать устройство петли
, которое представляет простой файл как блочное устройство. Например:
dd if=/dev/zero of=./loop_file_10MB bs=1024 count=10K
losetup /dev/loop0 $PWD/loop_file_10MB
После этого / dev / loop0
будет вести себя как блочное устройство, но вся записанная информация будет сохранена в файле.