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

Выделение памяти, связанной с определенным процессором

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

В современных операционных системах  широко используются данные,  связанные с определенными процессорами (per-CPU  data).  Это данные, которые являются уникальными для  каждого  процессора. Данные,  связанные с  процессорами,  хранятся в массиве.  Каждый  элемент  массива соответствует своему  процессору системы.  Номер процессора является индексом в этом  массиве. Таким   образом была  реализована работа  с данными, связанными с определенным процессором, в ядрах  серии  2.4.  В таком  подходе  нет  ничего   плохого,  поэтому  значительная  часть  кода  ядра  в  серии   2.6 все  еще  использует этот  интерфейс.  Данные  объявляются следующим образом,

Читать »

Алгоритм планирования – ЧАСТЬ 2

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

struct prio_array (

int nr_active;                  /* количество заданий */ unsigned long bitmap[BITMAP_SIZE]; /* битовая маска приоритетов */ struct list head queue[MAX_PRIO];/* очереди приоритетов */

};

Константа MAX_PRIO — это  количество уровней приоритета в системе. По умолчанию  значение этой  константы равно  140. Таким образом, для  каждого значения приоритета  выделена одна  структура struc t   list_head .  Константа BITMAP_SIZE — это размер   массива переменных,  каждый  элемент которого имеет  тип  unsigne d   long . Каждый бит этого  массива соответствует одному  действительному значению приоритета.  В  случае  140 уровней приоритетов и  при  использовании 32-разрядных машинных слов, значение константы BITMAP_SIZE равно  5. Таким образом, поле  bitma p — это  массив из пяти  элементов, который имеет  длину  160 бит.

Читать »

Очереди запросов

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

Дляблочныхустройствподдерживаютсяочередизапросов(requestqueue),вкоторых хранятся ожидающие запросы на  выполнение операций блочного ввода-вывода. Очередь  запросов представляется с помощью структуры  request_queue , которая определена в файле   <linux/blkdev.h> .  Очередь  запросов  содержит двухсвязный список запросов и соответствующую управляющую информацию.  Запросы добавляются  в очередь  кодом  ядра  более  высокого уровня, таким  как  файловые системы. Пока  очередь  запросов не  пуста, драйвер  блочного устройства, связанный с очередью, извлекает запросы из  головы  очереди  и отправляет их на соответствующее блочное устройство. Каждый элемент списка запросов очереди—  это один  запрос, представленный с помощью структуры  struc t   request .

Читать »

Связанные списки

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

Рис.  А.2.  Двухсвязный  список

Источник: Лав,  Роберт. Разработка ядра  Linux, 2-е  издание. : Пер.  с англ.  — М.  : ООО  «И.Д.  Вильяме» 2006. — 448 с. : ил. — Парал. тит. англ.

Ядро  Linux в сравнении с классическими ядрами Unix

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

Благодаря   общему   происхождению  и  одинаковому  API,   современные  ядра  Unix имеют   некоторые  общие   характерные   черты.   За  небольшими  исключениями  ядра Unix   представляют   собой   монолитные  статические   бинарные  файлы.   Это  значит, что  они  существуют в  виде  больших  исполняемых  образов,   которые  выполняются один  раз  и  используют одну копию  адресного  пространства.  Для  работы  операционной   системы   Unix  обычно   требуется   система   с  контроллером  управления  страничной   адресацией   памяти   (memory   management  unit);   это  аппаратное  обеспечение позволяет  обеспечить  защиту  памяти  в  системе  и  предоставить  каждому  процессу уникальное  виртуальное   адресное   пространство.   В  списке   литературы    приведены мои  любимые   книги   по  устройству  классических  ядер  операционной  системы   Unix.

Читать »

Обработчик прерываний таймера

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

Теперь, когда  мы разобрались, что такое  jiffie s и HZ, а также  какова  роль системного таймера, рассмотрим реализацию обработчика прерываний системного таймера.  разбит  на две части:  часть, зависимую от аппаратной платформы, и независимую часть.

Читать »

Хранение дескриптора процесса

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

Система идентифицирует процессы с помощью уникального значения, которое называетс я идентификатором процесса (process identification,  PID).  Идентификато р PID — это целое число, представленное с помощью скрытого типа pid_t5 , который обычно соответствует знаковому целому— int.

Читать »

Контекст системного  вызова

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

Как уже обсуждалось в главе 3, "Управление процессами",  при выполнении  системного  вызова ядро работает в контексте  процесса.  Указатель curren t указывает на текущее задание, которое и есть процессом,  выполняющим системный вызов.

В контексте  процесса ядро может переходит в приостановленное состояние  (например,  если системный вызов блокируется при вызове функции или явно вызывает функцию  schedule ()), а также является полностью вытесняемым.  Эти два момента важны.  Возможность  переходить в приостановленное состояние  означает,  что системный  вызов может использовать большую часть функциональных возможностей ядра. Как будет видно из главы 6, "Прерывания  и обработка прерываний",  наличие возможности  переходить в приостановленное состояние значительно упрощает программирование  ядра7. Тот факт, что контекст процесса является  вытесняемым,  подразумевает,  что, как и в пространстве  пользователя,  текущее задание может быть вытеснено другим заданием. Так как новое задание может выполнить тот же системный  вызов,  необходимо убедиться, что системные  вызовы являются реентерабельными. Это очень похоже на требования,  выдвигаемые для симметричной  мультипроцессорной  обработки.  Способы  защиты,  которые обеспечивают реентерабельность, описаны  в главе 8, "Введение в синхронизацию выполнения  кода ядра", и в главе 9, "Средства синхронизации в ядре".

Читать »

Вызовы syscall

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

Системные вызовы (часто  называемые syscall в ОС  Linux)  обычно реализуются в виде  вызова  функции. Для  них  могут  быть  определены один   или  более  аргументов (inputs), которые могут  приводить к тем  или  иным побочным эффектам3 , например к записи данных  в файл  или  к копированию некоторых данных  в область  памяти, на которую указывает переданный  указатель. Системные  вызовы также  имеют  возвращаемое значение типа  long 4 , которое указывает на  успешность выполнения  операции  или  на возникшие ошибки. Обычно, но  не всегда, возвращение отрицательного значения указывает на  то, что  произошла ошибка. Возвращение нулевого значения обычно (но  не  всегда)  указывает на  успешность выполнения операции. Системные вызовы ОС  Unix  в  случае  ошибки записывают специальный код  ошибки в  глобальную  переменную errno . Значение этой  переменной может  быть  переведено в удобочитаемую формy  с помощью библиотечной функции perro r () .

Читать »

Функция printk( )

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

Функция  форматированного вывода  сообщений printk( )   работает аналогично библиотечной функции printf( )  языка С.  Действительно в этой  книге  до этого  момента  мы  не  видели  никаких существенных отличий в ее использовании. Для  большинства задач  это  именно так:  функция printk( )  — это  просто  функция ядра, выполняющая форматированный вывод  сообщений. Однако, некоторые различия все же  имеются.

Читать »

Интерфейсы для ввода энтропии

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

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

void add_interrupt_randomness(int irq)

void add_keyboard_randomness (unsigned  char scancode)

void add_mouse_randomness(  u32 mouse_data)

Читать »

История переносимости Linux

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

Когда  Линус  Торвальдс впервые выпустил операционную  систему  Linux  в  ничего не подозревающий мир,  эта  ОС  работала только  на аппаратной платформе Intel  i386. Хотя  данная операционная система  и  была  достаточно хорошо   обобщена и  хорошо написана,  переносимость для  нее  не  была  основным  требованием.  Однажды Линус даже  говорил,  что  операционная  система   Linux  не  будет  работать  ни  на  какой   аппаратной платформе,  кроме   i386!  Тем  не  менее  в  1993  году  началась работа  по  пор-

Читать »

Пару слов о переносимости

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

Если  говорить  коротко, то написание переносимого, ясного  и красивого кода подразумевает следующие два момента.

• Код  необходимо разрабатывать с учетом  самого  общего  сценария:  следует предполагать, что все, что может  случиться, обязательно случится, и  принять на этот счет все возможные меры.

Читать »

Перед тем как начать

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

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

Читать »

Передача процессорного времени

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

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

Читать »