Главная » Ядро Linux

Функции munmap()  и do_munmap(): удаление интервала адресов

Добавлено Дата: 12 April, 2012 категория: Ядро Linux

Функция  do_manmap()  удаляет  интервал  адресов  из  указанного  адресного  пространства процесса.  Эта  функция  объявлена в  файле   <asm/mman.h>  следующим образом.

int do_munmap(struct mm_struct *mm, unsigned long start, size t_len)

Читать »

Средства синхронизации в ядре – ЧАСТЬ 1

Добавлено Дата: 12 April, 2012 категория: Ядро Linux

Таблица 9.1 . Полный список всех атомарных операций с целыми числами

Атомарная целочисленная операция                       Описание

ATOMIC_INIT(int i)

in t atomic_ read(atomic_t *y)

void atomic_set (atomic_t  *v,    in t i)

Читать »

Реализация  связанных списков в ядре  Linux

Добавлено Дата: 12 April, 2012 категория: Ядро Linux

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

Читать »

Кратко об объектах kobjec t и файловой системе sysfs

Добавлено Дата: 11 April, 2012 категория: Ядро Linux

В  этой главе рассматривается модель представления устройств, файловая  система sysfs,  объекты  kobjec t и уровень событий ядра. Описание материала главы было бы невозможно без рассмотрения родственных вещей: были также описаны множества kset , подсистемы, атрибуты, типы ktype и счетчики ссылок kref. Эти структуры предназначены для использования  разными людьми в разных местах. Разработчикам драйверов необходимо только ознакомление с внешними интерфейсами. Большинство подсистем драйверов эффективно скрывают внутренние механизмы использования объектов kobjec t и других, близких к ним структур. Понимание основных принципов работы и знание основного назначения интерфейсов, таких как   sysfs_create_file( )  , является достаточным для разработчиков драйверов. Однако для разработчиков, которые занимаются разработкой основного кода ядра, может потребоваться более детальное понимание принципов функционирования объектов kobject . Объекты kobjec t могут оказаться еще более важными,  так как их могут использовать и те  разработчики, которые вообще не занимаются разработкой подсистем драйверов!!!

Читать »

Управление и манипуляции с объектами kobjec t

Добавлено Дата: 11 April, 2012 категория: Ядро Linux

Теперь, когда у нас уже есть представление о внутреннем устройстве объектов kobjec t и связанных с ними структурах данных, самое время рассмотреть экспортируемые интерфейсы,  которые дают возможность управлять объектами kobjec t и выполнять с ними другие манипуляции. В основном, разработчикам драйверов непосредственно не приходится иметь дело с объектами kobject . Структуры kobjec t встраиваются в  некоторые специальные структуры данных (как это было в  примере структуры устройства посимвольного ввода-вывода)  и управляются "за  кадром" с помощью соответствующей подсистемы драйверов. Тем не менее, объекты kobjec t не всегда могут оставаться невидимыми, иногда с ними приходится иметь дело, как при разработке кода драйверов, так и при разработке кода управления подсистемами ядра.

Читать »

Уровень слябового распределителя памяти

Добавлено Дата: 11 April, 2012 категория: Ядро Linux

Выделение и освобождение структур  данных — это одна  из наиболее частых  операций, которые выполняются в любом  ядре.  Для  того  чтобы  облегчить  процедуру частого выделения и освобождения данных  при программировании,  вводятся списки свободных ресурсов (free list). Список свободных ресурсов  содержит некоторый набор уже выделенных структур  данных.  Когда  коду необходим новый  экземпляр структуры данных, он  может  взять  одну  структуру  из  списка свободных ресурсов, вместо того  чтобы  выделять  необходимый объем  памяти и заполнять его данными соответствующей структуры.  Позже, когда  структура  данных  больше  не нужна, она снова возвращается в список свободных ресурсов, вместо  того чтобы  освобождать память. В этом смысле  список свободных ресурсов  представляет собой  кэш  объектов, в котором хранятся объекты  одного  определенного, часто  используемого типа.

Читать »

Порядок следования байтов

Добавлено Дата: 10 April, 2012 категория: Ядро Linux

 (byte ordering) — это порядок, согласно которому байты расположены в машинном слове.  Для  разных  процессоров может  использоваться один  из двух типов  нумерации байтов  в машинном слове:  наименее значимый (самый  младший) байт  является либо  самым  первым   (самым левым, left-most), либо самым  последним (самым правым, right-most) в слове.  Порядок байтов  называется обратным (big-endian), если наиболее значимый (самый старший) байт хранится первым, а за ним  идут байты  в порядке убывания значимости. Порядок байтов  называется прямым (little-endian), если наименее значимый (самый младший) байт хранится первым, а за ним  следуют байты  в порядке возрастания значимости.

Читать »

Множество О

Добавлено Дата: 10 April, 2012 категория: Ядро Linux

Полезным обозначением асимптотического поведения функции является верхняя граница — функция, значения которой всегда больше значений изучаемой функции. Говорят, что  верхняя граница некоторой функции растет быстрее, чем рассматриваемая функция. Специальное обозначение "большого-О" используется для описания этого  роста.  Это  записывается как  f (х)  

Читать »

Базисное дерево

Добавлено Дата: 10 April, 2012 категория: Ядро Linux

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

Читать »

"Зверек другого рода"

Добавлено Дата: 9 April, 2012 категория: Ядро Linux

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

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

Читать »

Структура bi o

Добавлено Дата: 9 April, 2012 категория: Ядро Linux

Основным контейнером для  операций ввода-вывода в ядре  является структура bio , которая определена в файле  <linux/bio.h> . Эта  структура  представляет активные операции блочного ввода-вывода в виде списка сегментов (segment). Сегмент — это участок  буфера, который является непрерывным в физической памяти, т.е. отдельные буферы  не обязательно должны быть непрерывными в физической памяти. Благодаря тому, что буфер  может представляться в виде нескольких участков, структура bi o даст возможность выполнять операции блочного ввода-вывода, даже  если данные одного  буфера  хранятся в разных  местах  памяти. Ниже  показана структура bi o с комментариями, описывающими назначение каждого  поля.

Читать »

Системные  вызовы для управления планировщиком

Добавлено Дата: 9 April, 2012 категория: Ядро Linux

Операционная  система Linux  предоставляет семейство системных вызовов для управления параметрами планировщика.  Эти  системные вызовы позволяют манипулировать приоритетом процесса,  стратегией планирования  и процессорной привязкой, а также  предоставляют механизм, с помощью которого можно явно  передать процессор (yield)  в использование другим  заданиям.

Читать »

Режим реального времени

Добавлено Дата: 8 April, 2012 категория: Ядро Linux

Операционная система Linux  обеспечивает две  стратегии планирования  в режиме реального времени (real-lime): SCHED_FIFO и SCHED_RR. Стратегия планирования SCHED_OTHER является обычной стратегией планирования, т.е.  стратегий планирования  не  в режиме реального времени. Стратегия SCHED_FIFO  обеспечивает простой алгоритм планирования  по  идеологии "первым вошел  — первым  обслужен" (first-in first-out, FIFO) без  квантов времени.  Готовое к выполнению задание со  стратегией планирования SCHED_FIFO  всегда  будет планироваться на  выполнение перед  всеми заданиями со стратегией планирования SCHED_OTHER.  Когда  задание со стратегией

Читать »

С чего необходимо начать

Добавлено Дата: 8 April, 2012 категория: Ядро Linux

Итак, готовы  ли вы начать  охоту за ошибками? Этот путь может  оказаться длинным  и полным разочарований. Некоторые ошибки ставили  в тупик  все сообщество разработчиков ядра на несколько месяцев. К счастью, на каждую  из таких злостных ошибок находятся простые, которые легко  исправить. Если  вам повезет, то все проблемы, с которыми вы столкнетесь, будут простыми и тривиальными. Однако чтобы это  проверить, необходимо начать  исследования. Для  этого  понадобится следующее.

Читать »

Области памяти

Добавлено Дата: 7 April, 2012 категория: Ядро Linux

 (memory areas)   представляются  с  помощью  объектов областей памяти,  которые хранятся в  структурах  типа  vm_area_struct .  Эта  структура  определена  в файле  <linux/mm.h> .   часто  называются областями  виртуальной памяти (virtual memory area, или VMA).

Читать »