Модельная задача для блочного устройства может быть подобна следующему:
- модул "прихватывает" себе достаточно большой кусок RAM (размер может задаваться параметром установки модуля)...
- и дальше в этой области RAM организуется устройство прямого доступа, блочное...
- что-то вроде примитивного RAM-диска.
На этом можно многое отыграть.
модуль ядра блочного устройства
Модератор: Olej
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
модуль ядра блочного устройства
Тема переплыла вот отсюда: проект книги: "Модули ядра Linux". В книге совсем опущен вопрос блочных устройств. Вот теперь время глянуть в эту сторону...
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: модуль ядра блочного устройства
А двигаться я буду, для начала, от изложения вот этой (всем известной) книги: «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 :
Для себя, меня интересует, главным образом, написание примеров кода, которые были бы как можно проще и понятнее.
Будет получаться - буду сюда отписывать.
Менее известно, что из неё сделаны отличные переводы (особенно PDF) - ядро Linux: знаменитая LDD3 :
А здесь лежит полный архив примеров, упоминаемых в книге (только примеры я к этой книге сильно не люблю ... из-за их перегруженностью деталями; но как-раз с их модулем блочного устройства sbull в этом смысле всё более-менее пристойно).Глава 16, Блочные драйверы
Для себя, меня интересует, главным образом, написание примеров кода, которые были бы как можно проще и понятнее.
Будет получаться - буду сюда отписывать.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: модуль ядра блочного устройства
Пример их sbull не компилируется с чудовищным числом (в 2 экрана термина) сообщений об ошибках. Это достаточно ожидаемый результат, так как писалась их книга (как мне помнится) для ядра 2.6.29 (максимум), а компиляцию я пробовал сейчас дляOlej писал(а): А здесь лежит полный архив примеров, упоминаемых в книге (только примеры я к этой книге сильно не люблю ... из-за их перегруженностью деталями; но как-раз с их модулем блочного устройства sbull в этом смысле всё более-менее пристойно).
Код: Выделить всё
bash-4.2$ u_n_a_m_e -r
3.5.2-1.fc17.i686.PAE
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: модуль ядра блочного устройства
Возвращаюсь ещё раз проект книги: "Модули ядра Linux".
Вот их пример для блочного устройства: 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/
Сайт книги: http://elinuxdd.com
Архив кодов примеров: http://elinuxdd.com/~elinuxdd/elinuxdd.docs/listings/
1. Знаменитая книга LDD3 - названа выше.smt писал(а):Возник вопрос: вы пишете, что разработка драйверов блочных устройств детально в книге не рассматривается, и одной из причин этого является то, что эта тема хорошо описана в литературе. Но вот меня как раз интересуют блочные устройства. Подскажите, а какая литература освещает эти вопросы?
Вот их пример для блочного устройства: 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/
Вот их пример для блочного устройства: 3. «Essential Linux Device Drivers», by Sreekrishnan Venkateswaran, Prentice Hall, 2008, p.714.Chapter 35. Block Drivers
Сайт книги: http://elinuxdd.com
Архив кодов примеров: http://elinuxdd.com/~elinuxdd/elinuxdd.docs/listings/
Вот их пример для блочного устройства: 4. «Professional Linux Kernel Architecture (Wrox Programmer to Programmer)», by Wolfgang Mauerer, Wiley Publishing Inc., 2008, p.1335.Chapter 14. Block Drivers
Эту книгу (и другие по ядру) можете скачать по ссылкам здесь: http://findebookee.com/t/the-linux-kernel-bookChapter 6. Device Drivers
...
Block Device Operations p.412-442
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: модуль ядра блочного устройства
Olej писал(а): Пример их sbull не компилируется с чудовищным числом (в 2 экрана термина) сообщений об ошибках.
А вот их пример (который и приятней намного LDD3) после минимальных изменений можно уже собрать и попробовать:2. «Writing Linux Device Drivers», Jerry Cooperstein, 2009,
...
Вот их пример для блочного устройства:
...
Код: Выделить всё
bash-4.2$ sudo insmod ./block_mod.ko size=10
- это размер диска в 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
Да и не надо - 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 КБ) 433 скачивания
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: модуль ядра блочного устройства
И опробываем это чудо: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 писал(а): Диск как диск!
Не хуже прочих...
1. модуль блочного устройства а). ничем не сложнее существенно символьного, б). во многом похож, хотя в). имеет специфику обслуживания операций чтения-записи;
2. пример этот нужно ещё довольно существенно довести, но, в принципе, он может вполне быть отправной точкой, шаблоном для написания своего драйвера;
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: модуль ядра блочного устройства
Этот пример тоже не соберётся. Он использует такие вызовы API как:Olej писал(а): 3. «Essential Linux Device Drivers», by Sreekrishnan Venkateswaran, Prentice Hall, 2008, p.714.
...
Вот их пример для блочного устройства:
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 писал(а): Диск как диск!
Не хуже прочих...
Код: Выделить всё
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
Код: Выделить всё
[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: модуль ядра блочного устройства
Я попробую включить этот пример в следующую версию архивчика, а пока, чтоб что-то менять, нужно удалить драйвер загруженного диска /dev/mybdrv :Olej писал(а): Повозившись этот пример можно трансформировать в работающий (со свежим ядром),
Код: Выделить всё
[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
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя