Страница 1 из 3
модуль ядра блочного устройства
Добавлено: 08 ноя 2012, 13:54
Olej
Тема переплыла вот отсюда:
проект книги: "Модули ядра Linux". В книге совсем опущен вопрос блочных устройств. Вот теперь время глянуть в эту сторону...
Модельная задача для блочного устройства может быть подобна следующему:
- модул "прихватывает" себе достаточно большой кусок RAM (размер может задаваться параметром установки модуля)...
- и дальше в этой области RAM организуется устройство прямого доступа, блочное...
- что-то вроде примитивного RAM-диска.
На этом можно многое отыграть.
Re: модуль ядра блочного устройства
Добавлено: 08 ноя 2012, 13:59
Olej
А двигаться я буду, для начала, от изложения вот этой (всем известной) книги: «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 в этом смысле всё более-менее пристойно).
Для себя, меня интересует, главным образом, написание примеров кода, которые были бы как можно проще и понятнее.
Будет получаться - буду сюда отписывать.
Re: модуль ядра блочного устройства
Добавлено: 09 ноя 2012, 09:51
Olej
Olej писал(а):
А здесь лежит полный
архив примеров, упоминаемых в книге (только
примеры я к этой книге сильно не люблю
... из-за их перегруженностью деталями; но как-раз с их модулем блочного устройства sbull в этом смысле всё более-менее пристойно).
Пример их sbull
не компилируется с чудовищным числом (в 2 экрана термина) сообщений об ошибках. Это достаточно ожидаемый результат, так как писалась их книга (как мне помнится) для ядра 2.6.29 (максимум), а компиляцию я пробовал сейчас для
Код: Выделить всё
bash-4.2$ u_n_a_m_e -r
3.5.2-1.fc17.i686.PAE
Так что использовать их примеры можно только "относительно"
- для рассмотрения кода, в качестве начального приближения "для попробовать" не получится... без заметной перекройки.
Re: модуль ядра блочного устройства
Добавлено: 09 ноя 2012, 10:46
Olej
Возвращаюсь ещё раз
проект книги: "Модули ядра Linux".
smt писал(а):Возник вопрос: вы пишете, что разработка драйверов блочных устройств детально в книге не рассматривается, и одной из причин этого является то, что эта тема хорошо описана в литературе. Но вот меня как раз интересуют блочные устройства. Подскажите, а какая литература освещает эти вопросы?
1. Знаменитая книга LDD3 - названа выше.
Вот их пример для блочного устройства:
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 КБ) 451 скачивание
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 КБ) 442 скачивания
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
Re: модуль ядра блочного устройства
Добавлено: 09 ноя 2012, 14:34
Olej
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
Re: модуль ядра блочного устройства
Добавлено: 09 ноя 2012, 14:57
Olej
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
Диск как диск!
Не хуже прочих...
Re: модуль ядра блочного устройства
Добавлено: 09 ноя 2012, 15:38
Olej
Olej писал(а):
Диск как диск!
Не хуже прочих...
Из этих сборок и экспериментов уже видно:
1. модуль блочного устройства а). ничем не сложнее существенно символьного, б). во многом похож, хотя в). имеет специфику обслуживания операций чтения-записи;
2. пример этот нужно ещё довольно существенно довести, но, в принципе, он может вполне быть отправной точкой, шаблоном для написания своего драйвера;
Re: модуль ядра блочного устройства
Добавлено: 09 ноя 2012, 18:58
Olej
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,
Re: модуль ядра блочного устройства
Добавлено: 09 ноя 2012, 19:10
Olej
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
Да! Ещё не реализовано! (да и вряд ли будет
).
Re: модуль ядра блочного устройства
Добавлено: 09 ноя 2012, 20:34
Olej
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