Доступ к хранилищу на уровне блоков через ядро - PullRequest
1 голос
/ 24 апреля 2010

Как получить доступ к хранилищу на уровне блоков через ядро ​​(без использования библиотек scsi)?

Мое намерение - реализовать протокол хранения на уровне блоков по сети для целей обучения, почти так же, как работает SCSI. Запросы будут сгенерированы инициатором и отправлены в цель (обе программы пользовательского пространства), которая выполняет вызов модуля ядра и возвращает данные по протоколу TCP инициатору.

До сих пор мне удалось собрать простой модуль "Hello" и запустить его (я новичок в программировании ядра), но не смог продолжить работу с блочным доступом.

После долгих поисков я нашел struct buffer_head * bread(int dev,int block) в linux/fs.h, но компилятор выдает ошибку.

 error: implicit declaration of function ‘bread’

Пожалуйста, помогите, также не стесняйтесь советов по началу работы с программированием ядра.
Спасибо!


bread как используется в старых ядрах.

Просмотр struct request *blk_get_request(struct request_queue *, int, gfp_t); в linux/blkdev.h


Доступ к блочному устройству имеет , который должен быть выполнен через ядро.

1 Ответ

0 голосов
/ 25 апреля 2010

Не разработчик ядра, но несколько комментариев:

  • Ошибка неявного объявления означает, что найденное вами определение каким-то образом выходит за рамки, когдаВы вызываете функцию.Может быть, он спрятан в #ifdef или, может быть, вы как-то забыли включить linux/fs.h.

  • Что касается советов по программированию ядра Linux, вы можете проверить kernelnewbies.org .

  • Были написаны различные книги по программированию ядра, но имейте в виду, что детали в ядре меняются очень быстро.Большинство понятий в более старых книгах все еще будут действительны, но, по крайней мере, некоторые детали в некоторых областях будут изменены.

  • Наконец, вам, возможно, придется смело отсылать письма по ядру Linux.список.Извините, но это довольно пугающе, поэтому постарайтесь, чтобы ваши вопросы были хорошо продуманы до того, как вы их отправите.Возможно, вы захотите сначала установить протокол в пользовательском пространстве, когда цель будет иметь прямой доступ, например, /dev/sdc, прежде чем погрузиться в ядро.

Пока я читаю ваш вопросЕсли быть более точным, то, по-видимому, ваш главный интерес связан с аспектом протокола хранения этого проекта.Если так, зачем вам нужно модифицировать ядро.Если у вас есть локально подключенный диск, скажем, /dev/sdX на цели, то вы можете сделать что-то вроде этого из пользовательского пространства:

fd = open("/dev/sdX", O_RDWR);
pwrite(fd, buf, len, offset);
pread(fd, buf, len, offset);

Так что, если вы не особенно заинтересованы в игре внутри ядраЯ не думаю, что вам нужен какой-либо модуль ядра для базового протокола хранения между пользовательскими процессами.

...