проект книги: "Модули ядра Linux"

Здесь будут размещаться ссылки и отзывы на интересные публикации по Linux

Модераторы: Olej, vikos

Правила форума
Запрещается помещать сообщения, не имеющие отношения к обсуждаемой статье. Все такие сообщения будут удаляться непосредствено после обнаружения.
bose
Писатель
Сообщения: 107
Зарегистрирован: 23 фев 2012, 14:41
Откуда: Киев
Контактная информация:

Re: проект книги: "Модули ядра Linux"

Непрочитанное сообщение bose » 07 мар 2012, 16:11

Olej писал(а): Как там в одно кино говорилось? :
Я табэ одну вэсчь скажу, толко ты не абыжайся!
:lol:

1. Ядро Linux ... (сейчас тут начнётся "вой и скрежет зубовный"(с)) - очень говённая система...
Нет повода для обид, хотя красить ядро в какие то цвета я тоже не стану. Просто идеальных систем не бывает вообще. А тут оно и понятно - более 20 лет очень активной разработки (уж сколько контрибуторов я и не знаю ну думаю много). Плюс последние 10 лет крупные компании лезут в ядро со своими "взглядами на жизнь" - думаю Торвальдсу (да любому человеку на планете Земля) такой поток данных не проконтролировать. Хотя не скрою свою уважительное отношение ко всем кто так или иначе причастен к разработке такого сложного продукта.
А интересно ваше мнение по поводу FreeBSD. В том числе почему она (ОС) не так популярна в Embedded Devices (хотя все задатки для этого есть)?

PS:
Сегодня, к сожалению, тяжёлый день (в связи с наближающимся "праздником"), нет времени до конца "дожать" эту тему и проверить все примеры, так что для меня пока тема не раскрыта полностью - буду выжимать её на выходных.

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

Re: проект книги: "Модули ядра Linux"

Непрочитанное сообщение Olej » 07 мар 2012, 20:32

bose писал(а): А интересно ваше мнение по поводу FreeBSD. В том числе почему она (ОС) не так популярна в Embedded Devices (хотя все задатки для этого есть)?
1. Я не работал так плотно (чтоб законченные крупные проекты) с системами *BSD, только пробные знакомства:
- FreeBSD оставляет очень хорошее впечатление...
- ... очень любопытный производный от неё DragonFly...
- но из всех *BSD мне кажется самой строгой и проработанной NetBSD.
2. Почему непопулярна? Да потому, что популярной :lol: никогда не становилась по-настоящему хорошая система! Популярным становится, с лучшем случае, только что-то очень средненькое (Linux :-P ) ... а в худшем случае - очень плохинькое (Windows? :-P ).
А сколько хороших систем сгинуло?: NextStep, OS/2 ...
А сколько ещё лучших потихоньку сойдёт на нет?: Plan9, Inferno, BlueBotle...
3. Это достаточно интересные вопросы, но лучше их обсуждать в отдельных темах... Заведите тему "UNIX-like OS" или что-то подобное - обсудим сравнения, виды и перспективы: FreeBSD, NetBSD, OpenSolaris, QNX, ... Заведите тему "Различные OS" или что-то подобное - и обсудим другие возможные "свободные" линии развития ... те же Plan9, Inferno - очень даже любопытные... , или языково (Oberon & Zenon) ориентированные направления школы Н.Вирта: BlueBotle... продолжающие его шумные проекты Modula-2 & Lilith (http://oberon2005.oberoncore.ru/paper/lilith.pdf). Любопытные это вещи. :!:
bose писал(а): Сегодня, к сожалению, тяжёлый день (в связи с наближающимся "праздником"), нет времени до конца "дожать" эту тему и проверить все примеры, так что для меня пока тема не раскрыта полностью - буду выжимать её на выходных.
Буду с интересном ждать, что у вас будет получаться.

bose
Писатель
Сообщения: 107
Зарегистрирован: 23 фев 2012, 14:41
Откуда: Киев
Контактная информация:

Re: проект книги: "Модули ядра Linux"

Непрочитанное сообщение bose » 11 мар 2012, 01:51

bose писал(а): PS:
Сегодня, к сожалению, тяжёлый день (в связи с наближающимся "праздником"), нет времени до конца "дожать" эту тему и проверить все примеры, так что для меня пока тема не раскрыта полностью - буду выжимать её на выходных.
Общее впечатление после работы с данным механизмом (read_proc_t) - он до сих пор работает скорее вопреки нежели благодаря. Основной "упрёк" - этот механизм плохо задокументирован, без изучения исходных кодов, велик риск его неправильного использования. Те комментарии, которые присутсвуют в исходном коде также не дают полное описания поведения функции. А как известно - хуже чем полное отсуствие документации, может быть только неправильная(ошибочная, устаревшая, неполная) документация.

Перечислю основные "бородавки" этого механизма:
  • Как бы вы не сигнализировали об окончании файла (потока данных) (If this number is greater than zero and you didn't signal eof and the reader is prepared to take more data you will be called again), возвратом 0 или установкой флага eof - ВАША ФУНКЦИЯ БУДЕТ ВЫЗВАНА ЕЩЁ РАЗ! Здесь возникает сложность -без использования дополнительной логики, не всегда можно определить что вы уже передали все запрашиваемые данные. При этом флаг еоф, если вы его уже установили - при следующем вызове (в рамках одного и того же запроса) обнуляется.
  • Максимальное количество байт, которое вы можете передать пользователю за раз ограничено константой PROC_BLOCK_SIZE, которое на киллобайт меньше чем PAGE_SIZE (я так и не понял почему, даже просматривая исходный код), но... если соблюдено условие start < page (воторой способ работы с механизмом), то можно передать и PAGE_SIZE (с комментариями в коде -Don't reduce n because doing so might cut off part of a data block.) ограничившись при этом варнингом ядра. Почему так - что за константа, почему возможны вариации - для меня до сих пор загадка. Кстати, константа PROC_BLOCK_SIZE не доступна через заголовочные файлы что б ей можно было воспользоваться для выстраивания логики работы с буфером обмена. По-этому эта константа переопределяется в нескольких местах в коде ядра (при чём не везде одинаково, что может привести к потенциальной ошибке).

bose
Писатель
Сообщения: 107
Зарегистрирован: 23 фев 2012, 14:41
Откуда: Киев
Контактная информация:

Re: проект книги: "Модули ядра Linux"

Непрочитанное сообщение bose » 11 мар 2012, 09:22

Olej писал(а): А теперь минимально-достаточный код функции чтения в модуле:

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

#include "common.h"

static ssize_t proc_node_read( char *buffer, char **start, off_t off,
                               int count, int *eof, void *data ) {
   static char buf_msg[ LEN_MSG + 1 ] =
          ".........1.........2.........3.........4.........5.........6\n";
   LOG( "read: %d (buffer=%p, off=%ld)", count, buffer, off );
   strcpy( buffer, buf_msg );
   LOG( "return bytes: %d%s", strlen( buf_msg ), *eof != 0 ? " ... EOF" : "" );
   return strlen( buf_msg );
};
Всё!
Т.е. в упрощенчестве они дошли до того, что (при передаче объёма данных <=3Kb) в качестве обработчика достаточно одной операции strcpy() ... никаких EOF, разбиения объёма передачи на порции запрашиваемого объёма, позиционирования начала каждой передачи...
Не совсем так. Данный код работает, но делает трижды копирование в буффер одного и того же куска данных. Если слегка модифицировать ваш код (добавим одну строку для ясности)

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

static ssize_t proc_node_read( char *buffer, char **start, off_t off,
                               int count, int *eof, void *data ) {
   static char buf_msg[ LEN_MSG + 1 ] =
          ".........1.........2.........3.........4.........5.........6\n";
   LOG( "read: %d (buffer=%p, off=%ld)", count, buffer, off );
   strcpy( buffer, buf_msg );
   LOG("Copy done\n");
   LOG( "return bytes: %d%s", strlen( buf_msg ), *eof != 0 ? " ... EOF" : "" );
   return strlen( buf_msg );
};
То, прочитав файл обычным катом, получим следующий лог:
[ 3300.806007] ! read: 3072 (buffer=e873f000, off=0)
[ 3300.806020] ! Copy done
[ 3300.806027] ! return bytes: 61
[ 3300.806046] ! read: 3072 (buffer=e873f000, off=61)
[ 3300.806053] ! Copy done
[ 3300.806060] ! return bytes: 61
[ 3300.806106] ! read: 3072 (buffer=e873f000, off=61)
[ 3300.806114] ! Copy done
[ 3300.806120] ! return bytes: 61
Что означает, что трижды одни и те же данные копировались в буфер с одинаковым смещением.

Для случая когда содержимое файла меньше PROC_BLOCK_SIZE, можно модифицировать функцию следующим образом:

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

static ssize_t proc_node_read( char *buffer, char **start, off_t off,
                               int count, int *eof, void *data ) {
   static char buf_msg[ LEN_MSG + 1 ] =
          ".........1.........2.........3.........4.........5.........6\n";
   size_t size;
   size = min_t(size_t,count,strnlen(buf_msg,LEN_MSG));
   LOG( "read: %d (buffer=%p, off=%ld)", count, buffer, off );
   if (off>=size){
	   *eof = 1;
	   LOG("Offset >= Data Size (or request count); eof=1 && return 0;");
	   return 0;
   }
   strncpy( buffer, buf_msg, size );
   LOG("Copy done\n");
   *eof = 1;
   LOG( "return bytes: %d%s", size, *eof != 0 ? " ... EOF" : "" );
   return size;
};
В итоге:
sergey@sergey-Inspiron-1090:~/Projects/workspace/KernelModules/proc$ ./mcat 20
read + 20 bytes, current buffer: .........1.........2
read + 00 bytes, current buffer:
sergey@sergey-Inspiron-1090:~/Projects/workspace/KernelModules/proc$ sudo dmesg -c

[ 1227.396487] ! read: 20 (buffer=ea861000, off=0)
[ 1227.396498] ! Copy done
[ 1227.396505] ! return bytes: 20 ... EOF
[ 1227.396672] ! read: 20 (buffer=ea861000, off=20)
[ 1227.396680] ! Offset >= Data Size (or request count); eof=1 && return 0;
sergey@sergey-Inspiron-1090:~/Projects/workspace/KernelModules/proc$ cat /proc/mod_node
.........1.........2.........3.........4.........5.........6
sergey@sergey-Inspiron-1090:~/Projects/workspace/KernelModules/proc$ sudo dmesg -c

[ 1508.159310] ! read: 3072 (buffer=e55d0000, off=0)
[ 1508.159323] ! Copy done
[ 1508.159331] ! return bytes: 61 ... EOF
[ 1508.159455] ! read: 3072 (buffer=e55d0000, off=61)
[ 1508.159463] ! Offset >= Data Size (or request count); eof=1 && return 0;
Copy done делается всего 1 раз + вместо 3 раз наша функция вызывается 2 раза.

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

Re: проект книги: "Модули ядра Linux"

Непрочитанное сообщение Olej » 11 мар 2012, 12:51

bose писал(а):
bose писал(а): Общее впечатление после работы с данным механизмом (read_proc_t) - он до сих пор работает скорее вопреки нежели благодаря.
Да, там ещё и write_proc_t такой же безобразный есть ;)

Хорошо, давайте двигаться дальше, read_proc_t / write_proc_t взяли на заметку ... там дальше есть вещи куда интереснее :lol:, весёлые вещи...
Последний раз редактировалось Olej 11 мар 2012, 13:06, всего редактировалось 1 раз.

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

Re: проект книги: "Модули ядра Linux"

Непрочитанное сообщение Olej » 11 мар 2012, 13:06

bose писал(а): Не совсем так. Данный код работает, но делает трижды копирование в буффер одного и того же куска данных.
...
Что означает, что трижды одни и те же данные копировались в буфер с одинаковым смещением.
Я это всё видел.
Но это означает только что если они устроили такой идиотизм, то с какой стати я должен за него расплачиваться сложностью? ;-)
3 раза прочитать или 2, весь объём буфера или только его часть (можно и так сделать) - это уже вопросы исключительно производительности. А /proc - это не то место, где считываются большие объёмы и высокоскоростные потоки данных ... на то /dev есть. А /proc - это, в практических целях, каких-то 10 байт отладки-диагностики сосчитать. И если мне из за 2-х считываний вместо 3-х нужно нагромоздить код, которые непонятно как читается, через задницу ихними :mrgreen: стараниями, то я предпочту просто тупое strcpy() - по крайней мере: просто и понятно что здесь происходит, и через 2 недели после написания кода я не забуду зачем я это так намудрил.

bose
Писатель
Сообщения: 107
Зарегистрирован: 23 фев 2012, 14:41
Откуда: Киев
Контактная информация:

Re: проект книги: "Модули ядра Linux"

Непрочитанное сообщение bose » 11 мар 2012, 15:40

Olej писал(а): Хорошо, давайте двигаться дальше, read_proc_t / write_proc_t взяли на заметку ... там дальше есть вещи куда интереснее :lol:, весёлые вещи...
Сомнений нет по поводу интересного, иначе б я здесь не постил.

Просто хочу сделать предложение для качественного улучшения содержимого будущей книги.
Просто на LORе был флуд по поводу русскоязычной-англоязычной лит-ры - http://www.linux.org.ru/news/kernel/6969610?cid=6970425.
На самом то деле мнение отчасти справедливое. Хотя как всегда не без исключений. Так вот - ведь не бывает отвественной и безотвественной работы - есть отвественное и безответсвенное отношение к работе. Я к тому, что если стараться проработать рассматриваемые вопросы немножко глубже, осветить некоторые грани, которые не упоминались в лит-ре со схожей тематикой или представить их в немного в другом ракурсе - от сюда будет больший интерес к данной книге, она не будет смотрется как "ещё одна" на полке у программистов. Вот даже тот самый пример с тезисом Jerry Cooperstein (лучше что б он вообще обошёл эту тему стороной). Теперь при прочтении его книги у меня будет недоверие к автору, так как я уже точно знаю что он не всё проверяет то о чём пишет. Ну а если вы в своей будущей книге раскроете этот вопрос, то в любом случае это будет качественное улучшение по сравнению с Jerry Cooperstein, и пусть на данном конкретном случае... но ведь если ко всем темам так, то и вся книга будет качественно лучше. И тогда я думаю вы не дадите повода для дальнейшего флуда по данной тематике (русскоязычная или англоязычная лит-ра), а цитируемость вашей книги только возрастёт.

Предложение:
  • Перечислить все три способа реализации read_proc_t.
  • Рассказать об особенностях использования параметров в каждом способе.
  • Рассказать о недостатках данного механизма.
  • Привести примеры к 1-у и 2-у способу реализации (3-й способ просто как вариация на тему 1-го).
Ну или как вариант, просто упомянуть, что вот был такой механизм, но он устарел, сейчас используются вот такие...

А я продолжаю дальше бороздить просторы большого театра )))

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

Re: проект книги: "Модули ядра Linux"

Непрочитанное сообщение Olej » 11 мар 2012, 16:06

bose писал(а): Я к тому, что если стараться проработать рассматриваемые вопросы немножко глубже, осветить некоторые грани, которые не упоминались в лит-ре со схожей тематикой или представить их в немного в другом ракурсе - от сюда будет больший интерес к данной книге, она не будет смотрется как "ещё одна" на полке у программистов.
1. вот именно: вопросы /proc - достаточно многочисленно (хоть и не полно, как сейчас стало видно) "обыграны" в литературе, а вот там дальше по тексту будут вопросы, которые даже не назывались в мировой литературе по модулям ядра Linux :-o - вот по ним хотелось бы услышать ... замечания :lol:
bose писал(а): Ну а если вы в своей будущей книге раскроете этот вопрос, то в любом случае это будет качественное улучшение по сравнению с Jerry Cooperstein, и пусть на данном конкретном случае... но ведь если ко всем темам так, то и вся книга будет качественно лучше. И тогда я думаю вы не дадите повода для дальнейшего флуда по данной тематике (русскоязычная или англоязычная лит-ра), а цитируемость вашей книги только возрастёт.
2. ... как вам сказать? ;-)
Я уже давно вышел из возраста, когда меня вообще занимала бы популярность или цитируемость написанного... и даже сам факт того, будет ли оно напечатано в "хардкопи" в конечном итоге, процесс чего уже активно начался было, но как-то застопорилось ... "до начала нового финансового года" у буржуинов, до 1-го апреля :mrgreen:
Это о грустном ;-) ... о том, что "вышел и давно"...
Теперь о приятном (в каждой бочке дёгтя должно быть некоторое количество мёда):
- мне очень хотелось бы, чтобы написанное оказалось полезным кому-то бы из тех, кто занимается реальной практикой написания программ... (ещё и поэтому болтовня по типу a'la LOR меня совершенно не задевает ... "не греет" - ни в плюс, ни в минус);
- и многое из обсуждаемого было положительно принято и оценено теми, для кого и был (второпях и не очень "брежно") подготовлен этот материал - разработчиками, для которых проводилось обучение - это реально воспринимаемая мною оценка;
- именно из-за практической направленности (не "как устроено?", а "как использовать?") меня иногда недостаточно сильно заинтересовывают вопросы, подобные /proc - главная причина здесь в том, что существует альтернативный заменитель - операции через таблицу файловых операций, более общий способ.
Последний раз редактировалось Olej 11 мар 2012, 16:32, всего редактировалось 1 раз.

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

Re: проект книги: "Модули ядра Linux"

Непрочитанное сообщение Olej » 11 мар 2012, 16:27

bose писал(а): Предложение:
  • Перечислить все три способа реализации read_proc_t.
  • Рассказать об особенностях использования параметров в каждом способе.
  • Рассказать о недостатках данного механизма.
  • Привести примеры к 1-у и 2-у способу реализации (3-й способ просто как вариация на тему 1-го).
Ну или как вариант, просто упомянуть, что вот был такой механизм, но он устарел, сейчас используются вот такие...
Предложение хорошее :!:
Мне оно интересно ... настолько интересно, что отвечаю отдельной репликой, а не в потоке предыдущего ответа. ;-)

Только:

1. Я уже потерялся что такое способы 1-й, 2-й, 3-й и 3-й приведённый к 1-му :lol: - настолько много было названо вариантов а потом поправок к ним...
Нужно начинать считать с начала!
Более того, нужно бы просто взять и написать образцы кода на случаи 1-й, 2-й, 3-й ... 10-й - с чётким указанием тех условий-ограничений, которые относятся к каждому из способов.

2. Только делать это нужно бы не на 9-й странице темы
проект книги: "Модули ядра Linux
А наоборт:
- где-то в разделе, например, Общий по Linux и открытому софту ...
- открыть там новую и специальную тему, например так: "чтение-запись данных ядра через /proc" ... (тем более, что и с write_proc_t тогда следовало бы поразбираться)...
- и там уже размеренно и неторопливо + на примерах обсуждать предмет;
- почему бы и нет?: там уже есть частные темы по модулям ядра + это раздел "обсуждения всяких околопингвиньих новостей и баек" :lol:
- те, кому это сложно, не актуально, не интересно - я думаю ;-) , простят, смирятся, пропустят такую тему и читать не станут...
Потому как отдельные вопросы должны обсуждаться в отдельных потоках.

P.S. создайте такую тему для обсуждения ... (+ 1-2 вводных фразы: откуда это переползло обсуждение и откуда ноги растут...), или, если хотите, я такое могу создать?

Я бы с удовольствием поучаствовал в этом + понаписал бы множество тестов-примеров для детального разгребания...

Как вам такой "альтернативный" план? ;-)

Чтоб не загружать здесь обсуждение, потому как дальше, я вам обещаю :-P , будет ещё немало частностей для обсуждений... + их-то все как-раз разумно обсуждать отдельными темами, как вот эти: viewtopic.php?f=9&t=1583 или viewtopic.php?f=9&t=1607

bose
Писатель
Сообщения: 107
Зарегистрирован: 23 фев 2012, 14:41
Откуда: Киев
Контактная информация:

Re: проект книги: "Модули ядра Linux"

Непрочитанное сообщение bose » 11 мар 2012, 20:42

Olej писал(а): P.S. создайте такую тему для обсуждения ... (+ 1-2 вводных фразы: откуда это переползло обсуждение и откуда ноги растут...), или, если хотите, я такое могу создать?
Я бы с удовольствием поучаствовал в этом + понаписал бы множество тестов-примеров для детального разгребания...
Как вам такой "альтернативный" план? ;-)
У меня ещё "висяк" - хочу создать тему для обсуждения *nix систем. Кстати, не могу найти подходящий раздел для этой темы - не подскажите?
Что касается обсуждения proc - то я чувствую что застрял на рассмотрении этой темы, хотя как вы справедливо заметили, там (модули ядра) есть поинтереснее темы. Хочу поскорее дочитать вашу книгу что б сформировать более полную картину как по рассматриваемой в ней теме так и по поводу самой книги (а то я тут советую прочитав только четверть книги, может там дальше мои вопросы раскрыты).

Ещё маленькое отстуление, по поводу ранее мной упомянутого "осветить некоторые грани, которые не упоминались в лит-ре со схожей тематикой или представить их в немного в другом ракурсе". Так вот - всем известно что на тему ядро, модули FreeBSD кол-во книг и публикаций можно сосчитать по пальцам на одной руке. Как то мне на глаза попалась книженция "Designing BSD Rootkits" Joseph Kong http://nostarch.com/rootkits.htm. Я конечно же сразу заинтересовался, хотя тема показалась немного пафосной (известно что если книга называется Hacking ******, то её автоматически можно переименовать в Administration ******, думал что эта что-то сродни им). Ну когда я её начал читать книга оказалась довольно полным и интересно изложенным руководством по программированию модулей для FreeBSD. Хотя способ которым подавался материал нельзя назвать стандартным, что как мне кажется только подогревает интерес к излагаемой теме. Так что кто не читал эту книгу - советую. Тематика которая рассматривается в ней схожа с той которая поднимается в обсуждаемой здесь книге.

Ответить

Вернуться в «Публикации, книги и обсуждения»

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

Сейчас этот форум просматривают: Google [Bot] и 3 гостя