Maxwell linux core kernel commentary

Скотт Максвелл: Ядро Linux в комментариях

Книга Ядро Linux в комментариях представляет наиболее детализированные и емкие комментарии кода ядра Linux, которые окажутся полезными для многих программистов и студентов. Автор подробно исследует код ядра, предоставляя обширные комментарии для наиболее важных функций, системных вызовов и структур данных.

Основным источником вдохновения, побудившим написать эту и другие книги серии «. в комментариях» послужила популярная книга «Lions` Commentary on Unix», написанная Джоном Лайонсом (John Lions). Эта книга, прочитанная и размноженная бесчисленным множеством студентов, посвящена подробному анализу внутренней работы ранней версии операционной системы Unix от AT&T.

Книга Ядро Linux в комментариях также обеспечивает анализ всех особенностей внутренней структуры и функционирования одной из самых мощных и популярных операционных систем. Основные цели, которым служит книга, таковы:

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

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

Возможность работать над кодом и расширять его функциональность — вот что дает концепция открытого исходного кода (open source). Она же является и одной из главных причин столь быстрого развития Linux. От запуска игр до путешествий по Web, построения устойчивых Web-серверов для мелких и крупных Internet-провайдеров и решения серьезных вычислительных задач — все это под силу Linux. Linux нравится народу, а разработчики имеют хорошую мотивацию к изучению, обучению и расширению системы.

Скачано: 5155 раз

Скачать книгу

Источник

unixforum.org

Форум для пользователей UNIX-подобных систем

  • Темы без ответов
  • Активные темы
  • Поиск
  • Статус форума

Ищу: Ядро LINUX в комментариях (Скотт Максвелл)

Ищу: Ядро LINUX в комментариях

Сообщение Jan2ary » 09.11.2005 13:38

Re: Ищу: Ядро LINUX в комментариях

Сообщение AlexeyAL » 09.11.2005 14:26

Когда я вырасту и стану крутым программистом, я напишу свое ядро и подарю его Ричарду Столлмену

Re: Ищу: Ядро LINUX в комментариях

Сообщение flook » 09.11.2005 14:57

Не зря. Толково прокомментировать ядро — много времени уйдет, а за это время уже новое выйдет. Более менее разумно — читать книги о принципах устройства, но не более. Если нужно знание исходников — надо лезть в /usr/src/linux.

Все вышесказанное — ИМХО (кто бы сомневался, да?)

Re: Ищу: Ядро LINUX в комментариях

Сообщение Jan2ary » 10.11.2005 11:55

Ну почитать все равно было бы интересно

книга Скотт Максвелл
ядро LINUX в коментариях

глава 5
страница 350

«29309: А здесь паранойя во всей своей красе!
sys_reboot сравнивает аргументы magic1 и magic2 с магическими числами,
опеределенными в строках с 16002 и 16005. Идея заключается в том,
что если функция sys_reboot вызывается случайно, то весьма нежелательно
также получать значения из аргументов magic1 и magic2.
следует заметить что это не рассматривается как мера по увелисчению
степени безопастности, но только как защита от небрежного использования.
Между прочим, упоминаемые магические числа не выбирались случайным образом.
Первое число относительно очевидно, едакий какламбур из «feel dead». на
следующие тричисла для максимального эффекта лучше смотреть в
шестнадцатиричном виде: 0x28121969, 0x5121996 и 0x 16041998. Они выдлядят
как день рождения супруги Линуса(или возможно когото из родствеников Линуса)
и дни рождения двух его дочерей. Соответственно это наводт на мысль, что с
увеличением семьи Линуса, вероятность случайного вызова перезагрузки будет
стремиться к уменьшению. Однако, я думаю, что жена его остановит до того,
как он исчерпает возможности 32-разрядного пространства.»

Источник

Linux kernel 5.14 — что изменится в новом ядре

Линус Торвальдс представит его в конце августа. Поговорим об изменениях — инженеры удалили устаревший IDE-драйвер, сделали шаги для принятия Rust в качестве официального инструмента разработки и обновили сетевые компоненты.

Unsplash / Dylan Shaw

Сброс балласта

Из ядра уберут legacy-драйвер, обеспечивающий работу устройств с интерфейсом IDE/PATA — оптических дисководов, жестких дисков и «флоповодов». Кодовая база сократится на 41 тыс. строк. Команда давно планировала удалить код, связанный с работой IDE. Инженеры считают, что стандарт устарел и его поддержка не имеет смысла — тот же SATA предлагает более высокую скорость обмена данными и возможность «горячей замены» накопителей — поэтому еще два года назад они пометили соответствующий драйвер флагом deprecated и прекратили развитие.

Продолжить работу со старыми устройствами можно будет благодаря библиотеке libATA. Она остается частью ядра и реализует API драйверов ATA. По словам Кристофа Хеллвига, который занимается развитием kernel 5.14, libATA использует большинство дистрибутивов, и у остальных не должно возникнуть сложностей с переходом. Однако стоит отметить, что в библиотеке нет драйверов для семейства микропроцессоров m68k, хотя эту ситуацию планируют исправить силами комьюнити.

Старые драйвера не единственное, что могут «вырезать» из ядра. Идут разговоры о прекращении поддержки процессоров, давно не получавших обновления. В список на удаление попали десятки чипов, в том числе ARM Footbridge и MIPS Cobalt.

Время «ржавчины»

Еще одно нововведение — признание Rust официальным инструментом разработки ядра (наравне с C). В kernel 5.14 появятся необходимые обновления. Инициативу продвигает Google — по словам его представителей, язык сократит число ошибок памяти, которые составляют 70% баг-фиксов в открытых проектах.

Также стоит отметить, что в Linux будет поддержка ARM и RISC-V благодаря компоненту rustc_codgen_gcc. Это — генератор кода GCC для компилятора rustc. Последний выполняет компиляцию Rust-кода, а GCC — backend-компиляцию, что дает возможность работать с новыми архитектурами. Участники сообщества уже предлагают внедрить аналогичную функциональность на уровне языка, однако такой подход может привести к конфликту лицензий. Дело в том, что Rust использует MIT License и Apache v2, а GCC — GPLv3. Хотя представитель The Rust Foundation в треде на GitHub сообщил, что лицензии совместимы, поэтому можно предположить, что разработчики языка предпримут шаги в этом направлении.

Сетевые улучшения

По словам Линуса Торвальдса, в kernel 5.14 упор был сделан на работу с драйверами, поэтому будет добавлена поддержка новых сетевых компонентов. Среди них — модем M.2 для мобильных компьютеров от Intel, адаптер MikroTik 10G/25G, а также модули Qualcomm QCN9074 и WCN6855.

Unsplash / Aleza van der Werff

Еще разработчики модифицировали сетевой код ядра: расширили возможности генератора трафика pktgen — на 23% для одного потока и на 44% для двух потоков — и оптимизировали работу с Wi-Fi на частоте 6 ГГц. В прошлом году Федеральная комиссия по связи США открыла этот диапазон для беспроводных сетей.

Kernel 5.14 должен повысить производительность гостевых Linux-систем на гипервизоре Hyper-V и реализовать NVMe/TCP. По оценке сайта Phoronix, который освещает темы, связанные с развитием дистрибутивов Linux, последнее обновление может сократить нагрузку на CPU примерно на 15%. Также разработчики выпустили некоторое количество баг-фиксов. Среди них — исправление ошибок, связанных с общими папками в VirtualBox. В целом до релиза новой версии ядра остается месяц, за это время разработчики реализуют другие изменения, которые подготовят фундамент для дальнейшей оптимизации и развития ядра.

Материалы о работе провайдеров у нас на сайте:

Источник

Пишем простой модуль ядра Linux

Захват Золотого Кольца-0

Linux предоставляет мощный и обширный API для приложений, но иногда его недостаточно. Для взаимодействия с оборудованием или осуществления операций с доступом к привилегированной информации в системе нужен драйвер ядра.

Модуль ядра Linux — это скомпилированный двоичный код, который вставляется непосредственно в ядро Linux, работая в кольце 0, внутреннем и наименее защищённом кольце выполнения команд в процессоре x86–64. Здесь код исполняется совершенно без всяких проверок, но зато на невероятной скорости и с доступом к любым ресурсам системы.

Не для простых смертных

Написание модуля ядра Linux — занятие не для слабонервных. Изменяя ядро, вы рискуете потерять данные. В коде ядра нет стандартной защиты, как в обычных приложениях Linux. Если сделать ошибку, то повесите всю систему.

Ситуация ухудшается тем, что проблема необязательно проявляется сразу. Если модуль вешает систему сразу после загрузки, то это наилучший сценарий сбоя. Чем больше там кода, тем выше риск бесконечных циклов и утечек памяти. Если вы неосторожны, то проблемы станут постепенно нарастать по мере работы машины. В конце концов важные структуры данных и даже буфера могут быть перезаписаны.

Можно в основном забыть традиционные парадигмы разработки приложений. Кроме загрузки и выгрузки модуля, вы будете писать код, который реагирует на системные события, а не работает по последовательному шаблону. При работе с ядром вы пишете API, а не сами приложения.

У вас также нет доступа к стандартной библиотеке. Хотя ядро предоставляет некоторые функции вроде printk (которая служит заменой printf ) и kmalloc (работает похоже на malloc ), в основном вы остаётесь наедине с железом. Вдобавок, после выгрузки модуля следует полностью почистить за собой. Здесь нет сборки мусора.

Необходимые компоненты

Прежде чем начать, следует убедиться в наличии всех необходимых инструментов для работы. Самое главное, нужна машина под Linux. Знаю, это неожиданно! Хотя подойдёт любой дистрибутив Linux, в этом примере я использую Ubuntu 16.04 LTS, так что в случае использования других дистрибутивов может понадобиться слегка изменить команды установки.

Во-вторых, нужна или отдельная физическая машина, или виртуальная машина. Лично я предпочитаю работать на виртуальной машине, но выбирайте сами. Не советую использовать свою основную машину из-за потери данных, когда сделаете ошибку. Я говорю «когда», а не «если», потому что вы обязательно подвесите машину хотя бы несколько раз в процессе. Ваши последние изменения в коде могут ещё находиться в буфере записи в момент паники ядра, так что могут повредиться и ваши исходники. Тестирование в виртуальной машине устраняет эти риски.

И наконец, нужно хотя бы немного знать C. Рабочая среда C++ слишком велика для ядра, так что необходимо писать на чистом голом C. Для взаимодействия с оборудованием не помешает и некоторое знание ассемблера.

Установка среды разработки

На Ubuntu нужно запустить:

Устанавливаем самые важные инструменты разработки и заголовки ядра, необходимые для данного примера.

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

Начинаем

Приступим к написанию кода. Подготовим нашу среду:

Запустите любимый редактор (в моём случае это vim) и создайте файл lkm_example.c следующего содержания:

Мы сконструировали самый простой возможный модуль, рассмотрим подробнее самые важные его части:

  • В include перечислены файлы заголовков, необходимые для разработки ядра Linux.
  • В MODULE_LICENSE можно установить разные значения, в зависимости от лицензии модуля. Для просмотра полного списка запустите:
  • Мы устанавливаем init (загрузка) и exit (выгрузка) как статические функции, которые возвращают целые числа.
  • Обратите внимание на использование printk вместо printf . Также параметры printk отличаются от printf . Например, флаг KERN_INFO для объявления приоритета журналирования для конкретной строки указывается без запятой. Ядро разбирается с этими вещами внутри функции printk для экономии памяти стека.
  • В конце файла можно вызвать module_init и module_exit и указать функции загрузки и выгрузки. Это даёт возможность произвольного именования функций.
  • Впрочем, пока мы не можем скомпилировать этот файл. Нужен Makefile. Такого базового примера пока достаточно. Обратите внимание, что make очень привередлив к пробелам и табам, так что убедитесь, что используете табы вместо пробелов где положено.

    Если мы запускаем make , он должен успешно скомпилировать наш модуль. Результатом станет файл lkm_example.ko . Если выскакивают какие-то ошибки, проверьте, что кавычки в исходном коде установлены корректно, а не случайно в кодировке UTF-8.

    Теперь можно внедрить модуль и проверить его. Для этого запускаем:

    Если всё нормально, то вы ничего не увидите. Функция printk обеспечивает выдачу не в консоль, а в журнал ядра. Для просмотра нужно запустить:

    Вы должны увидеть строку “Hello, World!” с меткой времени в начале. Это значит, что наш модуль ядра загрузился и успешно сделал запись в журнал ядра. Мы можем также проверить, что модуль ещё в памяти:

    Для удаления модуля запускаем:

    Если вы снова запустите dmesg, то увидите в журнале запись “Goodbye, World!”. Можно снова запустить lsmod и убедиться, что модуль выгрузился.

    Как видите, эта процедура тестирования слегка утомительна, но её можно автоматизировать, добавив:

    в конце Makefile, а потом запустив:

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

    Теперь у нас есть полностью функциональный, хотя и абсолютно тривиальный модуль ядра!

    Немного интереснее

    Копнём чуть глубже. Хотя модули ядра способны выполнять все виды задач, взаимодействие с приложениями — один из самых распространённых вариантов использования.

    Поскольку приложениям запрещено просматривать память в пространстве ядра, для взаимодействия с ними приходится использовать API. Хотя технически есть несколько способов такого взаимодействия, наиболее привычный — создание файла устройства.

    Вероятно, раньше вы уже имели дело с файлами устройств. Команды с упоминанием /dev/zero , /dev/null и тому подобного взаимодействуют с устройствами “zero” и “null”, которые возвращают ожидаемые значения.

    В нашем примере мы возвращаем “Hello, World”. Хотя это не особенно полезная функция для приложений, она всё равно демонстрирует процесс взаимодействия с приложением через файл устройства.

    Вот полный листинг:

    Тестирование улучшенного примера

    Теперь наш пример делает нечто большее, чем просто вывод сообщения при загрузке и выгрузке, так что понадобится менее строгая процедура тестирования. Изменим Makefile только для загрузки модуля, без его выгрузки.

    Теперь после запуска make test вы увидите выдачу старшего номера устройства. В нашем примере его автоматически присваивает ядро. Однако этот номер нужен для создания нового устройства.

    Возьмите номер, полученный в результате выполнения make test , и используйте его для создания файла устройства, чтобы можно было установить коммуникацию с нашим модулем ядра из пространства пользователя.

    (в этом примере замените MAJOR значением, полученным в результате выполнения make test или dmesg )

    Параметр c в команде mknod говорит mknod, что нам нужно создать файл символьного устройства.

    Теперь мы можем получить содержимое с устройства:

    или даже через команду dd :

    Вы также можете получить доступ к этому файлу из приложений. Это необязательно должны быть скомпилированные приложения — даже у скриптов Python, Ruby и PHP есть доступ к этим данным.

    Когда мы закончили с устройством, удаляем его и выгружаем модуль:

    Заключение

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

    Просто помните, что в пространстве ядра всё под вашу ответственность. Там для вашего кода нет поддержки или второго шанса. Если делаете проект для клиента, заранее запланируйте двойное, если не тройное время на отладку. Код ядра должен быть идеален, насколько это возможно, чтобы гарантировать цельность и надёжность систем, на которых он запускается.

    Источник

    Читайте также:  Windows root system error
    Оцените статью