модуль ядра блочного устройства

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

модуль ядра блочного устройства

Непрочитанное сообщение Olej » 08 ноя 2012, 13:54

Тема переплыла вот отсюда: проект книги: "Модули ядра Linux". В книге совсем опущен вопрос блочных устройств. Вот теперь время глянуть в эту сторону...
Модельная задача для блочного устройства может быть подобна следующему:
- модул "прихватывает" себе достаточно большой кусок RAM (размер может задаваться параметром установки модуля)...
- и дальше в этой области RAM организуется устройство прямого доступа, блочное...
- что-то вроде примитивного RAM-диска.
На этом можно многое отыграть.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модуль ядра блочного устройства

Непрочитанное сообщение Olej » 08 ноя 2012, 13:59

А двигаться я буду, для начала, от изложения вот этой (всем известной) книги: «Linux Device Drivers», by Jonathan Corbet, Alessandro Rubini, and Greg Kroah-Hartman, (3rd Edition), 2005, 2001, 1998 O’Reilly Media, Inc., ISBN: 0-596-00590-3.

Менее известно, что из неё сделаны отличные переводы (особенно PDF) - ядро Linux: знаменитая LDD3 :
Глава 16, Блочные драйверы
А здесь лежит полный архив примеров, упоминаемых в книге (только примеры я к этой книге сильно не люблю ;-) ... из-за их перегруженностью деталями; но как-раз с их модулем блочного устройства sbull в этом смысле всё более-менее пристойно).

Для себя, меня интересует, главным образом, написание примеров кода, которые были бы как можно проще и понятнее.
Будет получаться - буду сюда отписывать.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модуль ядра блочного устройства

Непрочитанное сообщение Olej » 09 ноя 2012, 09:51

Olej писал(а): А здесь лежит полный архив примеров, упоминаемых в книге (только примеры я к этой книге сильно не люблю ;-) ... из-за их перегруженностью деталями; но как-раз с их модулем блочного устройства sbull в этом смысле всё более-менее пристойно).
Пример их sbull не компилируется с чудовищным числом (в 2 экрана термина) сообщений об ошибках. Это достаточно ожидаемый результат, так как писалась их книга (как мне помнится) для ядра 2.6.29 (максимум), а компиляцию я пробовал сейчас для

Код: Выделить всё

bash-4.2$ u_n_a_m_e -r
3.5.2-1.fc17.i686.PAE
Так что использовать их примеры можно только "относительно" ;-) - для рассмотрения кода, в качестве начального приближения "для попробовать" не получится... без заметной перекройки.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модуль ядра блочного устройства

Непрочитанное сообщение Olej » 09 ноя 2012, 10:46

Возвращаюсь ещё раз проект книги: "Модули ядра Linux".
smt писал(а):Возник вопрос: вы пишете, что разработка драйверов блочных устройств детально в книге не рассматривается, и одной из причин этого является то, что эта тема хорошо описана в литературе. Но вот меня как раз интересуют блочные устройства. Подскажите, а какая литература освещает эти вопросы?
1. Знаменитая книга LDD3 - названа выше.
Вот их пример для блочного устройства:
sbull.tgz
(5.43 КБ) 449 скачиваний
2. «Writing Linux Device Drivers», Jerry Cooperstein, 2009,
том 1: «A guide with exercises», стр. 372
том 2: «Lab Solutions», стр. 259
Авторский сайт: http://coopj.com/
Архив кодов примеров: http://coopj.com/LDD/
Chapter 35. Block Drivers
Вот их пример для блочного устройства:
35.tgz
(4.69 КБ) 442 скачивания
3. «Essential Linux Device Drivers», by Sreekrishnan Venkateswaran, Prentice Hall, 2008, p.714.
Сайт книги: http://elinuxdd.com
Архив кодов примеров: http://elinuxdd.com/~elinuxdd/elinuxdd.docs/listings/
Chapter 14. Block Drivers
Вот их пример для блочного устройства:
14.tgz
(2.21 КБ) 434 скачивания
4. «Professional Linux Kernel Architecture (Wrox Programmer to Programmer)», by Wolfgang Mauerer, Wiley Publishing Inc., 2008, p.1335.
Chapter 6. Device Drivers
...
Block Device Operations p.412-442
Эту книгу (и другие по ядру) можете скачать по ссылкам здесь: http://findebookee.com/t/the-linux-kernel-book

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модуль ядра блочного устройства

Непрочитанное сообщение Olej » 09 ноя 2012, 14:34

Olej писал(а): Пример их sbull не компилируется с чудовищным числом (в 2 экрана термина) сообщений об ошибках.
2. «Writing Linux Device Drivers», Jerry Cooperstein, 2009,
...
Вот их пример для блочного устройства:
...
А вот их пример (который и приятней намного LDD3) после минимальных изменений можно уже собрать и попробовать:

Код: Выделить всё

bash-4.2$ sudo insmod ./block_mod.ko size=10
Здесь с параметром size нужно аккуратно быть:
- это размер диска в Mb ...
- если не указывать - модуль слетает;
- если указывать много - тоже слетает;

Код: Выделить всё

bash-4.2$ sudo insmod ./block_mod.ko
Error: could not insert module ./block_mod.ko: Cannot allocate memory
У меня (компьютер сильно нагружен окнами) при:

Код: Выделить всё

bash-4.2$ free
             total       used       free     shared    buffers     cached
Mem:       2057664    1904360     153304          0      36444     430032
-/+ buffers/cache:    1437884     619780
Swap:      3071996     269808    2802188
100 Mb отхватить не получается...

Да и не надо - 10Mb тоже хватит:

Код: Выделить всё

bash-4.2$ lsmod | grep block
block_mod              12709  0
mmc_block              26482  2
mmc_core               96971  3 mmc_block,sdhci,tifm_sd
Вложения
block_mod.tgz
(8.57 КБ) 424 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модуль ядра блочного устройства

Непрочитанное сообщение Olej » 09 ноя 2012, 14:57

Olej писал(а): Да и не надо - 10Mb тоже хватит:
И опробываем это чудо:

Код: Выделить всё

bash-4.2$ ls -l /dev/my*
brw-rw---- 1 root disk 252, 0 нояб.  9 13:05 /dev/mybdrv
bash-4.2$ sudo fdisk /dev/mybdrv
...
Команда (m для справки): n
...
Команда (m для справки): p

Диск /dev/mybdrv: 10 МБ, 10485760 байт
255 heads, 63 sectors/track, 1 cylinders, всего 20480 секторов
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x6a5b5009

Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/mybdrv1            2048       20479        9216   83  Linux

Команда (m для справки): w
Таблица разделов была изменена!

Код: Выделить всё

bash-4.2$ ls -l /dev/my*
brw-rw---- 1 root disk 252, 0 нояб.  9 13:13 /dev/mybdrv
brw-rw---- 1 root disk 252, 1 нояб.  9 13:13 /dev/mybdrv1
bash-4.2$ sudo mkfs.ext2 /dev/mybdrv1
mke2fs 1.42.3 (14-May-2012)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
2304 inodes, 9216 blocks
460 blocks (4.99%) reserved for the super user
First data block=1
Maximum filesystem blocks=9437184
2 block groups
8192 blocks per group, 8192 fragments per group
1152 inodes per group
Superblock backups stored on blocks:
        8193

Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done

Код: Выделить всё

bash-4.2$ sudo mount /dev/mybdrv1 /mnt/iso/
bash-4.2$ mount | grep /mnt
/dev/mybdrv1 on /mnt/iso type ext2 (rw,relatime)
bash-4.2$ ls -l /mnt/iso/
итого 12
drwx------ 2 root root 12288 нояб.  9 13:16 lost+found
[root@notebook ~]# echo 12345 > /mnt/iso/12345
[root@notebook ~]# ls -l /mnt/iso/
итого 13
-rw-r--r-- 1 root root     6 нояб.  9 13:23 12345
drwx------ 2 root root 12288 нояб.  9 13:16 lost+found
[root@notebook ~]# df | grep /mnt/iso
/dev/mybdrv1          8919           85     8374            2% /mnt/iso
Диск как диск! ;-)
Не хуже прочих...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модуль ядра блочного устройства

Непрочитанное сообщение Olej » 09 ноя 2012, 15:38

Olej писал(а): Диск как диск! ;-)
Не хуже прочих...
Из этих сборок и экспериментов уже видно:

1. модуль блочного устройства а). ничем не сложнее существенно символьного, б). во многом похож, хотя в). имеет специфику обслуживания операций чтения-записи;

2. пример этот нужно ещё довольно существенно довести, но, в принципе, он может вполне быть отправной точкой, шаблоном для написания своего драйвера;

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модуль ядра блочного устройства

Непрочитанное сообщение Olej » 09 ноя 2012, 18:58

Olej писал(а): 3. «Essential Linux Device Drivers», by Sreekrishnan Venkateswaran, Prentice Hall, 2008, p.714.
...
Вот их пример для блочного устройства:
Этот пример тоже не соберётся. Он использует такие вызовы API как:
elv_next_request()
end_request()
blk_queue_hardsect_size()
blk_queue_max_sectors()
и т.д.
Всё это было до ядра 2.6.31.

Повозившись этот пример можно трансформировать в работающий (со свежим ядром), ... но только он тогда превращается практически в пример из (отличаясь только именами переменных ;-) ):
Olej писал(а): 2. «Writing Linux Device Drivers», Jerry Cooperstein, 2009,

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модуль ядра блочного устройства

Непрочитанное сообщение Olej » 09 ноя 2012, 19:10

Olej писал(а): Диск как диск! ;-)
Не хуже прочих...

Код: Выделить всё

bash-4.2$ hdparm --help
bash: hdparm: команда не найдена
bash-4.2$ sudo yum install hdparm
...
Установлено:
  hdparm.i686 0:9.39-1.fc17     

Код: Выделить всё

bash-4.2$ sudo hdparm -tT /dev/mybdrv

/dev/mybdrv:
 Timing cached reads:   2246 MB in  2.00 seconds = 1124.14 MB/sec
 Timing buffered disk reads:  10 MB in  0.04 seconds = 249.64 MB/sec
Сравните с параметрами любого реального HDD:

Код: Выделить всё

[olej@notebook ~]$ sudo hdparm -tT /dev/sdb

/dev/sdb:
Timing cached reads:   1602 MB in  2.00 seconds = 801.11 MB/sec
Timing buffered disk reads:   88 MB in  3.06 seconds =  28.78 MB/sec

Очень похоже на правду.

И вот это ещё любопытно:

Код: Выделить всё

bash-4.2$ sudo hdparm -i /dev/mybdrv

/dev/mybdrv:
 HDIO_DRIVE_CMD(identify) failed: Inappropriate ioctl for device
 HDIO_GET_IDENTITY failed: Inappropriate ioctl for device
Да! Ещё не реализовано! (да и вряд ли будет ;-) ).

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: модуль ядра блочного устройства

Непрочитанное сообщение Olej » 09 ноя 2012, 20:34

Olej писал(а): Повозившись этот пример можно трансформировать в работающий (со свежим ядром),
Я попробую включить этот пример в следующую версию архивчика, а пока, чтоб что-то менять, нужно удалить драйвер загруженного диска /dev/mybdrv :

Код: Выделить всё

[root@notebook ~]# ls -l /dev/my*
brw-rw---- 1 root disk 252, 0 нояб.  9 13:13 /dev/mybdrv
brw-rw---- 1 root disk 252, 1 нояб.  9 13:16 /dev/mybdrv1
[root@notebook ~]# lsmod | head -n 4
Module                  Size  Used by
block_mod              12709  2 
tcp_lp                 12583  0 
fuse                   71512  2 
[root@notebook ~]# rmmod block_mod
Error: Module block_mod is in use
А вот это приятно!
Если вы заглянете в код модуля, то там нет ничего, препятствующего выгрузке модуля примонтированного блочного устройства (нет никакого явного счётчика использования и т.п.).
Т.е. воспрепятствовала этому сама блочная подсистема ядра Linux без нашего участия.
И тем потенциально спасает наши данные от разрушения.

Делаю так:

Код: Выделить всё

[root@notebook ~]# umount /dev/mybdrv1 
[root@notebook ~]# rmmod block_mod
[root@notebook ~]# ls -l /dev/my*
ls: невозможно получить доступ к /dev/my*: Нет такого файла или каталога

Код: Выделить всё

bash-4.2$ dmesg | tail -n5
[42394.813706] writing at sector 2050, 2 sectors 
[42394.813729] leaving request
[42394.813736] entering request routine
[42394.813739] leaving request
[42396.778488] module successfully unloaded, Major No. = 252

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 14 гостей