Принцип функциональной избирательности

ПРИНЦИПЫ ПРОЕКТИРОВАНИЯ ОС.

Принцип модульности

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

Принцип функциональной избирательности

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

Принцип генерируемости ОС

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

Принцип функциональной избыточности

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

Принцип виртуализации

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

Принцип независимости программ от внешних устройств

Этот принцип заключается в том, что связь программ с конкретными устройствами производится не на уровне трансляции программы, а в период планирования ее исполнения.

Принцип совместимости

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

Принцип открытой и наращиваемой ОС

Открытая ОС доступна для анализа как пользователям, так и системным специалистам, обслуживающим вычислительную систему. Наращиваемая ОС позволяет не только использовать возможности генерации, но и вводить в ее состав новые модули, совершенствовать существующие и т. д.

Принцип мобильности (переносимости)

Операционная система относительно легко должна переноситься с процессора одного типа на процессор другого типа и с аппаратной платформы одного типа на аппаратную платформу другого типа.

Принцип обеспечения безопасности вычислений

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

ОСНОВНЫЕ КОМПОНЕНТЫ ОС.

• Ядро • Системный загрузчик • Утилиты поддержки (работа с файловыми системами, сетью, процессами, жестким диском, и т.п.) • Рабочие средства пользователя (командный процессор, редакторы, базовые утилиты утилиты) • Главная системная библиотека (glibc)

ОСНОВНЫЕ КОМАНДЫ.

СПРАВОЧНЫЕ.

• man Получение справочной информации по команде или утилите, имя которой указано в командной строке. Например, команда “man man” даст подробное руководство по использованию справочной системы man

• info Аналог man

РАБОТЫ С ДИРЕКТОРИЯМИ

• pwd Вывод пути к текущему каталогу • ls Вывод списка файлов и каталогов текущего или указанного каталога

• cd Смена текущего каталога • mkdir Создание каталога • rmdir Удаление каталога

РАБОТЫ С ФАЙЛАМИ

• which Поиск пути до исполняемого файла • locate Поиск файла содержащего в названии запрашиваемую фразу – Ex: $ locate phrase • file Определение типа файла – Ex: $ file /bin/ls • grep Поиск в файлах строк, совпадающих с заданным шаблоном и их вывод – Ex: $ grep «hello» textfile

• sort Сортировка строк текстовых файлов • diff Поиск различий между двумя файлами • more Постраничный вывод файла • less Постраничный вывод файла с возможностью навигации в обоих направлениях

УПРАВЛЕНИЯ ПРАВАМИ ДОСТУПА

• chmod Изменение прав доступа к файлу – Ex: $ chmod <permission mode> filename

• chown Изменение владельца файла -Ex: $ chown owner filename • chgrp Изменение группы-владельца файла

– Ex: $ chgrp newgroup filename

УПРАВЛЕНИЯ ПРОЦЕССАМИ

• ps Вывод списка работающих процессов • fg Продолжение работы отложенного процесса – Ex: $ fg %PID

• bg Продолжение работы отложенного процесса в фоне • kill Завершение работы указанного процесса.

– Ex: $ kill PID – Ex: $ kill -9 PID – принудительное завершение процесса

• & Запуск процесса в фоновом режиме – Ex: $ firefox &

ОБРАБОТКА ПОТОКОВ ФИЛЬТРАМИ

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

Передаваемые командам параметры могут служить входными данными этих команд, а выходные данные могут выводиться на ваш терминал.

echo -e "apple\npear\nbanana"|sort

- Перенаправление вывода с помощью оператора >

- Команды cat, od и split. od – создает (выводит) дамп файла в восьмеричном формате

split – разбивает файл на части (-b N – размер каждого файла-части)

Для вывода содержимого файла на стандартное устройство вывода используется команда cat. С помощью cat вы можете объединить несколько файлов и вывести их содержимое на экран.

Команда wc выводит количество содержащихся в файле строк и слов, а также размер файла в байтах, определить который можно также с помощью команды ls -l. Команды head и tail позволяют отображать либо первую часть файла (заголовок), либо последнюю (хвост).

Команды expand, unexpand и tr. Команды sort и uniq. Команды cut, paste и join

РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ

Принцип функциональной избирательности - student2.ru

grep — утилита командной строки, которая находит на вводе строки, отвечающие заданному регулярному выражению, и выводит их, если вывод не отменён специальным ключом.

Принцип функциональной избирательности - student2.ru

УПРАВЛЕНИЕ ЗАДАНИЯМИ. ПОСЫЛКА СИГНАЛОВ ПРОЦЕССУ.

• Нажатие Ctrl+C посылает текущему процессу сигнал SIGINT и обычно приводит к его прерыванию

• Ctrl+\ посылает процессу сигнал SIGQUIT, сигнал немедленно завершит процесс и создаст дамп памяти (core dump) • Использование Ctrl+Z посылает сигнал SIGSTOP • Большинство сигналов в Linux отправляются программе и обрабатываются ею. – Например, нажатие Ctrl+C посылает SIGINT процессу, а тот его обрабатывает

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

• Но два сигнала – SIGSTOP и SIGKILL – процессу не отправляются. Вместо этого они передаются непосредственно ядру, потому что требуют внешнего воздействия на процесс отправка. SIGSTOP и запуск fg (возобновление) похожи на нажатие паузы на вашем CD-плейере, поскольку процесс на самом деле не прекращает существование, а просто временно приостанавливает работу. %1 означает, что Bash должен послать сигнал заданию №1. jobs - возвращает список всех созданных нами заданий.

УПРАВЛЕНИЯ ПРОЦЕССАМИ

• ps Вывод списка работающих процессов • fg Продолжение работы отложенного процесса – Ex: $ fg %PID

• bg Продолжение работы отложенного процесса в фоне • kill Завершение работы указанного процесса.

– Ex: $ kill PID – Ex: $ kill -9 PID – принудительное завершение процесса

• & Запуск процесса в фоновом режиме – Ex: $ firefox &

КОМАНДА BATCH

Если время выполнения для вас не имеет значения, используйте batch. Различие заключается в том, что batch начнёт выполнять ваши задания сразу же, как только загрузка системы опустится ниже 0,8 (т.е. машина будет не слишком занята). Синтаксис намного проще, поскольку не нужно указывать время: просто наберите batch, нажмите Enter, добавьте свои команды и нажмите Ctrl+D, чтобы сохранить задание. Введя atq, вы увидите ваше задание в очереди «B», что означает запуск с более низким приоритетом, чем у других заданий и большинства программ в системе. По этой причине ваше задание стартует только тогда, когда система бездействует, но, если оно запустится, а в следующую секунду машину потребует другая работа, ваше задание тихонько переберется в фоновый режим и отдаст ресурсы процессора. Оно не останавливается, но из-за более низкого приоритета получит намного меньше процессорного времени.

За команды at и batch отвечает демон atd. При его запуске мы можем задать параметр загруженности системы, при котором нужно запускать выполнение задания. По умолчанию он равен 0.8

Синтаксис atd –l –b –d –s

-l Минимальный фактор загрузки

-b Минимальный интервал, в секундах, между запуском двух пакетных заданий (по умолчанию 60).

-d Отладка; выводит сообщения об ошибках на стандартный поток ошибок

-s Эта опция используется для совместимости со старыми версиями at

ПОМЕЩЕНИЕ ЗАДАНИЙ В ФАЙЛЫ.

Если вы хотите, чтобы at или batch читали ваши задания из файла, просто используйте -f имяфайла перед указанием времени, например, так:

– at -f myjob.job tomorrow – batch -f myjob.job

ПЕРЕМЕННЫЕ СРЕДЫ.

Системные переменные определяются и хранятся в окружении родительского процессора. Они также называются переменными окружения. Имена этих переменных состоят из заглавных букв, и могут быть показаны командой 'set'. Примерами системных переменных являются PWD, HOME, USER. Значения этих системных переменных могут быть показаны по отдельности командой 'echo'. Например, 'echo $HOME' выведет значение, хранящееся в системной переменной HOME • Когда устанавливаете системную переменную, не забудьте использовать команду 'export', чтобы сделать ее доступной дочерним процессорам (любые процессоры, которые запущены из текущего, включая сценарии): bash$ SCRIPT_PATH=/home/blessen/shellscript bash$ export SCRIPT_PATH • Современные командные процессоры также позволяют сделать это одной командой: bash$ export SCRIPT_PATH=/home/blessen/shellscript

СЦЕНАРИИ.

Наборы команд могут компоноваться в командные файлы, называемые скриптами, где в первой строке в специального вида комментарии указывается командный интерпретатор для исполнения этого набора.

• Все сценарии должны начинаться со строки "#!/bin/bash" или с указания любого другого процессора, который вы предпочитаете • Эта строка называется shebang • Она уведомляет оболочку о том, какой командный процессор должен использоваться • сделать сценарий исполняемым, используя команду "chmod"

РОЛЬ И ВЛИЯНИЕ

Кроме того, что каждый пользователь стремится по максимуму автоматизировать выполняемую им работу с помощью сценариев shell, так и сценарии инициализации системы и множества приложений есть ничто иное как просто сценарии shell. Одно из фундаментальных изменений в подходе к программированию за последние 15 лет связано с переходом от традиционных языков программирования систем, таких как Си или С++, к языкам описания сценариев наподобие Perl или Tcl. Языки сценариев предназначаются для иных задач, нежели языки программирования систем, а потому фундаментально отличаются от них. Языки сценариев создавались для "склеивания" мощных готовых компонентов в предположении, что большинство из них уже существует и надо лишь связать их между собой.

ВЫПОЛНЕНИЕ СЦЕНАРИЯ

• Это может быть сделано вводом имени сценария в командную строку с указанием его пути • Если сценарий находится в текущей директории, это очень просто: bash$ ./firstshellscript.sh • Если вы хотите увидеть выполнение пошагово, что очень полезно для отладки - тогда выполните сценарий с опцией '-x' (что означает 'раскрыть аргументы'): sh -x firstshellscript.sh • В сценариях командного процессора все строки, начинающиеся с #, являются комментариями. • Многострочные комментарии: двоеточие и одинарные кавычки

АРГУМЕНТЫ КОМАНДНОЙ СТРОКИ

Это переменные, которые содержат аргументы выполняемого сценария. Доступ к этим переменным может быть получен через имена $1, $2, ... $n, где $1 первый аргумент командной строки, $2 второй, и так далее. Аргументы располагаются после имени сценария и разделены пробелами. Переменная $0 - это имя сценария. Переменная $# хранит количество аргументов командной строки, это количество ограничено 9 аргументами в старых шеллах и практически неограниченно в современных.

КОД ВОЗВРАТА

• Эта переменная сообщает нам, была ли последняя команда успешно выполнена. Она обозначается $?. Нулевое значение означает, что команда была успешно выполнена • Любые другие числа означают, что команда была выполнена с ошибкой (также некоторые программы, такие как 'mail', используют ненулевое значение возврата для отображения состояния, а не ошибки)

ОБЛАСТЬ ВИДИМОСТИ

• При написании сценариев процессоров видимость переменных используется для различных задач • В процессорах есть два типа видимости: глобальная и локальная • Локальные переменные определяются, используя ключевое слово "local" перед именем переменной, все остальные переменные, кроме связанных с аргументами функции, - глобальные, и поэтому доступны из любого места сценария

ВВОД-ВЫВОД В СЦЕНАРИЯХ

• Для ввода с клавиатуры используется команда 'read'. Эта команда считает значения, набранные на клавиатуре, и присвоит каждое определенной переменной. • Для вывода используется команда 'echo'.

АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ:sum=`expr 12 + 20` echo $[12 + 10] echo $(12 + 10)

ОПЕРАТОР УСЛОВИЯ

if [ "$username" = "blessen" ]

then

echo 'Успешно!!! Вы зашли.'

else

echo 'Извините, неправильное имя пользователя.'

fi

СРАВНЕНИЕ ПЕРЕМЕННЫХ

-eq Равно -ne Не равно -lt Меньше -le Меньше или равно -gt Больше -ge Больше или равно

• Если переменные являются строками, вы должны использовать эти опции:

– = Равно – != Не равно – < Первая строка отсортирована перед второй – > 1я строка отсортирована после 2й

ЦИКЛЫ

for ((<начальное значение>; <условие>; <инкремент/декремент>)) do … done num=1 while [$num –lt 5] do num=$[$num + 1]; echo $num; done

SELECT, CASE

select <переменная> in <список> do <любые выражения или операторы> done case $<переменная> in <выбор1>) <любые выражения или операторы> ;; <выбор2>) <любые выражения или операторы> ;; *) echo "Извините, неправильный выбор" ;; esac

ОТВЕТЫ НА ВОПРОСЫ:

9.Какие недостатки несёт интерпретация сценариев? Занимает больше времени (компиляция выполняется один раз, интерпретация каждый раз при обращении к коду) Преимущества: переносимость с одного железа на другое

10. Почему в сценариях не реализуется поддержка чисел с плавающей запятой? - Стандартная командная оболочка POSIX - sh их не поддерживает, так как она направлена на написание системных сценариев, и если была бы поддержка чисел с плавающей запятой, это бы сильно усложнило интерпретаторы

11. Как ускорить работу, выполняемую сценарием? Улучшить код, дать ему больший приоритет, написать его не как сценарий, а как программу, так как в этом случае скомпилируется весь код и потом запустится, так быстрее.

ТИПЫ ОПТИМИЗАЦИЙ.

• оптимизации под типы приложений (оптимизация размера исполняемого кода, времени выполнения без ущерба для его размера и только времени выполнения)

• процессорные оптимизации (планирование инструкций, оптимизация под конкретный процессор, автоматическая и ручная диспетчеризация процессоров)

• дополнительные оптимизации (управление точностью вычислений с плавающей точкой, математические библиотеки стандартных функций)

ОПЦИИ ОПТИМИЗАЦИИ

• /Od (Linux: -O0) • Отключает возможности оптимизации• Следует использовать для проведенияотладки и быстрой компиляции• Данную функцию можно использоватьна начальных стадиях разработкиприложения до того момента, когда Выубедитесь в его корректной работе.

• /O1 (Linux: -O0) Оптимизация скорости пока есть благоприятствование размеру кода • O1 может повысить производительность приложений с кодом большого размера и множеством разветвлений, а также сократить время выполнения, устранив код внутри циклов • В большинстве случаев обеспечивает создание кода наименьшего размера • Эта функция применяется для приложений с высокими требованиями к размеру кода и его размещению, как, например, приложения больших баз данных и коды со множеством разветвлений без

использования циклов

• /O2 (Linux: -O2) По умолчанию. Оптимизация скорости приложения. Рекомендуемый уровень • В большинстве случаев создает самый быстрый код, но может увеличить код до размера, значительно превышающего -O1 • Для наилучшей общей производительности при работе с типичными приложениями целочисленных вычислений, которые мало используют вычисления с плавающей запятой

• /O3 (Linux: -O3) (Оптимизации высокого уровня) Включает /O2 на ряду с более агрессивными оптимизациями

• Иногда может замедлить код в сравнении с /O2 • Рекомендуется для приложений с циклами, интенсивно использующими вычисления с плавающей точкой, и для обработки больших массивов данных • Использование этой функции может увеличить время компиляции • Повышение производительности зависит от типа приложения; производительность некоторых приложений может остаться прежней

• -fast Увеличивает скорость работы всей программы:

i64 Linux: Поддерживает -O3 -ipo -static

i64 Windows: Поддерживает -O3 -Qipo (Qipo ~ ipo)

i32 Linux: Поддерживает -O3 -ipo -static -xP (-xP – векторизация)

i32 Windows: Поддерживает -O3 -Qipo -QxP

IPO (Interprocedural Optimization)– межпроцедурный анализ и оптимизации, которые делает компилятор над нашим кодом. Подключается он опцией -ipo и позволяет проводить оптимизации не для одного отдельного файла с исходным кодом, а для всех исходников одновременно. В этом случае компилятор знает намного больше и может сделать значительно больше выводов и, соответственно, преобразований/оптимизаций. При компиляции с -ipo меняется привычный нам порядок компиляции и линковки.

• -ip (между процедурами) • -ipo (между процедурами и между исходными файлами)

-static – Предотвращает линкование с общими библиотеками

ОТЛАДКА

• Используйте опции /Zi (Windows) и –g (Linux) для генерации информации символьной отладки (symbolic debugging), которую используют инструментальные средства анализа производительности. • Создает информацию по отладке • Добавляет информацию в объектный файл с тем, чтобы любая отдельная сборочная линия могла быть связана с соответствующим кодом • Выберите эту функцию наряду с требуемым вариантом оптимизации, например, -O2. В противном случае -Od (Linux: -O0) выбирается по умолчанию

МАТЕМАТИЧЕСКИЕ БИБЛИОТЕКИ

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

• Иногда обеспечивается более высокая скорость, чем при использовании libc.lib и libm.lib Microsoft и libm.a GNU*. • Автоматически заменяет многие функции в ОС Microsoft libc.lib и libm.lib и GNU libm.a. • Создает оптимальный код для всех процессоров на базе архитектуры Intel | gcc code.c -lm

ОПТИМИЗАЦИЯ ВЫСОКОГО УРОВНЯ

• High Level Optimizer (HLO) • HLO ориентирован на максимальную скорость работы • Может переписать алгоритм, чтобы максимально увеличить количество успешных обращений к кэш-памяти, осуществляя более агрессивный анализ зависимости по данным • Пример: gcc -O3 superprog.cpp

• Циклы должны удовлетворять тем же требованиям, что и для векторизации • HLO необязательно повысит производительность некоторых приложений. - разворачивание циклов!

ПРОГРАММИРОВАНИЕ ЯДРА LINUX

Ядро́ (kernel) — центральная часть операционной системы (ОС), обеспечивающая приложениям координированный доступ к ресурсам компьютера, таким как процессорное время, память, внешнее аппаратное обеспечение, внешнее устройство ввода и вывода информации. Также обычно ядро предоставляет сервисы файловой системы и сетевых протоколов.

Различают понятия монолитного ядра, модульного ядра и микроядра.

Монолитное ядро предоставляет богатый набор абстракций оборудования. Все части монолитного ядра работают в одном адресном пространстве. Это такая схема операционной системы, при которой все компоненты её ядра являются составными частями одной программы, используют общие структуры данных и взаимодействуют друг с другом путём непосредственного вызова процедур.

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

Микроядро предоставляет только элементарные функции управления процессами и минимальный набор абстракций для работы с оборудованием. Бо́льшая часть работы осуществляется с помощью специальных пользовательских процессов, называемых сервисами. Решающим критерием «микроядерности» является размещение всех или почти всех драйверов и модулей в сервисных процессах, иногда с явной невозможностью загрузки любых модулей расширения в собственно микроядро, а также разработки таких расширений.

Из презентации:

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

• Ядро Linux – 1991 год Линус Торвальдс (Minix-подобная операционная система). Первый официальный выпуск Linux 1.0 в марте 1994. Одной из многих сильных сторон ОС, основанных на Linux - является то, что они поддерживают широкий диапазон аппаратных средств и платформ. Каждая версия, начиная с 1.2, включала поддержку новых типов процессоров и особенностей. Поддержка Hyperthreading (один физический процессор – несколько логических) появилась еще в ядре 2.4.17.

МОДУЛИ ЯДРА.

Ядро, способное поддерживать большое разнообразие аппаратных средств, будет слишком большим. Модули ядра позволяют при необходимости загрузить обеспечивающее поддержку программное обеспечение, такое как драйверы для аппаратных средств или файловые системы. Это позволяет запускать систему с небольшим ядром и затем подгружать модули по мере необходимости. Часто эта подгрузка происходит автоматически, например, при подключении устройств USB.

КОНФИГУРИРОВАНИЕ МОДУЛЕЙ

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

• Воспользуйтесь командой lsmod, чтобы узнать, какие модули загружены на вашей системе в настоящее время

• Большинство из них поставляются вместе с ядром • Однако некоторые, такие как nvnet, nvidia и sata_nv от корпорации NVIDIA, содержат проприетарный код и не являются частью стандартного ядра • Таким образом, модульный подход позволяет подключать проприетарный код к ядру с открытым кодом.

• Помимо имени модуля, команда lsmod показывает также размер и число пользователей модуля. • Команда modinfo выдает информацию об одном или нескольких модулях • Эта информация содержит полный путь до файла, имя автора, лицензию, другие параметры, которые можно передать модулю, версию, зависимости и другую инфо. • Если "use count" модуля равен 0, вы можете без опасений удалить его: rmmod • Удаленный вами модуль может понадобиться вновь • Чтобы загрузить модуль, введите команду insmod, полный путь для модуля, который необходимо загрузить, и все необходимые опции. • Команда modprobe предоставляет высокоуровневый интерфейс, оперирующий именами модулей, а не именами путей файлов • Она также управляет загрузкой дополнительных модулей, от которых зависит загружаемый модуль, и позволяет не только загружать, но и удалять модули.

ЗАВИСИМОСТИ

• Если один модуль зависит от другого, при помощи команды modprobe можно управлять автоматической загрузкой нескольких модулей • Зависимости прописаны в файле modules.dep, хранящемся в подкаталоге /lib/modules соответствующего ядра (uname -r) • Этот файл вместе с несколькими map-файлами генерируется при помощи команды depmod • Команда depmod просматривает модули в подкаталоге /lib/modules текущего ядра и обновляет информацию о зависимостях

• Вы можете изменить поведение команд modprobe и depmod, скорректировав файл /etc/modules.conf • Обычно это делается для создания псевдонимов (alias) для имен модулей и определения команд, которые должны быть запущены после загрузки модуля или перед его отключением

• Вы должны также знать, что некоторые системы используют другой конфигурационный файл, modprobe.conf, и есть системы, которые хранят информацию о конфигурации модулей в каталоге /etc/modules.d • В некоторых системах вы можете встретить файлы с названием /etc/modules • Эти файлы содержат имена модулей ядра, которые должны быть загружены в ходе загрузки системы

КОНФИГУРАЦИЯ

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

• Цель menuconfig использует программу с меню-интерфейсом, построенную на базе ncurses, для создания или обновления файла .config • Вы должны только ответить на вопросы для элементов, которые хотите изменить

• Цель xconfig использует систему графического меню, основанную на QT, используемом в KDE

• Цель gconfig использует систему графического меню, основанную на QT, используемом в GNOME

• Цель oldconfig позволяет создать конфигурацию с использованием существующего файла .config

СБОРКА

• Чтобы начать сборку ядра 2.6, выполните make • Чтобы начать сборку ядра 2.4, выполните эти три команды: make dep make bzImage make modules • Первая создает файлы необходимых зависимостей. Вторая собирает ядро. И последняя собирает модули

УСТАНОВКА

• Сначала вам необходимо выполнить make modules_install для установки модулей ядра в новый подкаталог /lib/modules

• И в заключение, вам необходимо выполнить make install для установки нового ядра и стартового RAM-диска (initial RAM disk) в каталог /boot и обновления конфигурации загрузчика

• Обратите внимание, что в процессе сборки автоматически создается необходимый стартовый RAM-диск (initial RAM disk или initrd) • Если у вас возникнет необходимость создать его вручную, это можно сделать при помощи команды mkinitrd

УСТАНОВКА ИЗ ИСХОДНИКОВ (ИЗ ОПЫТА)

-докачать необходимые пакеты: kernel-package, libncurses5-dev, fakeroot.

-скачать исходники ядра, распаковать архивы (tar)

-создать символическую ссылку на директорию с исходниками (ln -s path name)

-скопировать старый конфиг (или создать новый) => make menuconfig

-fakeroot make-kpkg –initrd -jN kernel_image kernel_headers

-dpkg -i linux-headers***.deb linux-image***.deb

ОПТИМИЗАЦИЯ ЯДРА

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

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

CONCURRENCY_LEVEL=5 make-kpkg --initrd kernel_image …

Цифра 5 означает запуск 5-ти одновременных компиляций. ОЧЕНЬ МАЛО. ДОБАВИТЬ!!!

ЗАГРУЗКА МОДУЛЕЙ

• Возникает необходимость загрузки новых возможностей – модулей. Демон kmod вызывает утилиту modprobe, передавая: Название модуля или Универсальный идентификатор. Если передается универсальный идентификатор, то modprobe сначала пытается отыскать имя соответствующего модуля в файле /etc/modules.conf. Данному универсальному идентификатору соответствует файл модуля *.ko. Затем modprobe отыскивает файл /lib/modules/version/modules.dep и вызывает insmod, чтобы сначала загрузить необходимые для удовлетворения зависимостей модули, а затем и запрошенный модуль.

ИСПОЛНЕНИЕ МОДУЛЯ

Работа программы – main(). Модули – init_module() (или функция, определённая через вызов module_init). Функция запуска модуля, подготавливает его для последующих вызовов. Вторая точка входа в модуль – cleanup_module производит "откат" изменений. Любой модуль обязательно должен иметь функцию инициализации и функцию завершения.

ПРОСТРАНСТВА ИМЕН???

УПРАВЛЕНИЕ УСТРОЙСТВАМИ

В Linux каждое аппаратное устройство представлено псевдофайлом (файлом устройства) в каталоге /dev. Этот файл обеспечивает средства взаимодействия с аппаратурой.

Работу по подключению и удалению устройств выполняет ядро системы. Изменения состояния устройств (подключение нового или удаление существующего) должны быть при этом видимы в пользовательском пространстве. При подключении новых устройств они должны тут же корректно настраиваться и (при необходимости) опознаваться пользовательскими приложениями. Файлы устройств (device nodes) в каталоге /dev обеспечивают доступ к соответствующим устройствам. В данном каталоге находятся файлы только тех устройств, которые в настоящий момент подключены к системе. Каждое устройство имеет свой соответствующий файл. Если устройство отключается от системы — данный файл удаляется.

Содержимое каталога /dev хранится на виртуальной файловой системе и все файлы, находящиеся в нем, создаются при каждом запуске системы. Модифицированные или созданные вручную файлы не сохраняются после перезагрузки. Файлы и каталоги, которые необходимо сохранить или которые всегда должны присутствовать в каталоге /dev, независимо от состояния соответствующего устройства, необходимо помещать в каталог /lib/udev/devices. При запуске системы содержимое данного каталога копируется в /dev.

ДРАЙВЕРЫ УСТРОЙСТВ

Драйверы устройств являются одной из разновидностей модулей ядра. Например, драйвер звуковой платы связывает файл устройства /dev/sound со звуковой платой. Пользовательское приложение может использовать для своей работы /dev/sound, ничего не подозревая о типе установленной звуковой платы.

Одному устройству могут соответствовать несколько файлов устройств (узлов) - 1, нескольким устройствам — один файл устройства - 2, ни одному устройству — файл устройства - 3, одному устройству — ни один файл устройства - 4.

1) Если на одном жестком диске несколько разделов (каждому разделу – файл)

2) Если устройства имеют одинаковый контроллер и соответственно одинаковый драйвер

3) /dev/null (вся информация, попавшая туда, пропадает) /dev/random (для устройств генерирующих рандомные данные) /dev/urandom (для устройств генерирующих псевдорандомные данные) /dev/zero (устройство генерирует нули)

4) Если устройство не опознано или вообще не является устройством.

МЛАДШИЙ И СТАРШИЙ НОМЕРА

• Все файлы устройств создаются в процессе установки системы с помощью утилиты mknod

• Чтобы создать новое устройство, например, с именем "coffee", со старшим номером 12 и младшим номером 2, нужно выполнить команду mknod /dev/coffee c 12 2

• Когда происходит обращение к файлу устройства, ядро использует старший номер файла, для определения драйвера, который должен обработать это обращение • Это означает, что ядро в действительности не использует и даже ничего не знает о младшем номере • Единственный, кто обеспокоен этим – это сам драйвер • Он использует младший номер, чтобы отличить разные физические устройства.

НАПИСАНИЕ ДРАЙВЕРА

-лицензия GPL - GNU Public License

-структура file_operations

• Определена в файле linux/fs.h • Содержит указатели на функции драйвера, которые отвечают за выполнение различных операций с устройством • Например, практически любой драйвер символьного устройства реализует функцию чтения данных из устройства, и адрес этой функции, среди всего прочего, хранится в этой структуре. • Компилятор gcc предоставляет программисту довольно удобный способ заполнения полей структуры в исходном тексте • Ниже приводится пример подобного заполнения:

struct file_operations fops = {.read=device_read, .write=device_write, .open=device_open, .release=device_release};

• Добавление драйвера в систему подразумевает его регистрацию в ядре • Это означает - получение старшего номера в момент инициализации модуля • Получить его можно вызовом функции register_chrdev(), определенной в файле linux/fs.h

int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);

• где unsigned int major -- это запрашиваемый старший номер устройства, • const char *name -- название устройства, которое будет отображаться в /proc/devices • struct file_operations *fops -- указатель на таблицу file_operations драйвера

IOCTL

Принцип функциональной избирательности - student2.ru • В POSIX следует использовать специальную функцию с именем ioctl (сокращенно от Input Output ConTroL) • Любое устройство может иметь свои команды ioctl, которые могут читать (для передачи данных от процесса ядру), писать (для передачи данных от ядра к процессу), и писать и читать, и ни то ни другое • Функция ioctl вызывается с тремя параметрами: дескриптор файла устройства, номер ioctl и третий параметр, который имеет тип long, используется для передачи дополнительных аргументов

УПРАВЛЕНИЕ ПРОЦЕССАМИ. ВЫПОЛНЕНИЕ ПРОГРАММНОГО КОДА. ОСНОВНЫЕ ПОНЯТИЯ

Выполнение программного кода включает: – Сегмент текста (text section) – объектный код, находящийся в состоянии исполнения – Сегмент данных (data section) – глобальные переменные – Набор ресурсов (открытые файлы, ожидающие обработку сигналы) – Адресное пространство – Не менее одного потока выполнения (execution thread) • Реализацию выполнения программного кода называют процессом(process) – абстрактное понятие в системах POSIX

Поток выполнения – объект, выполняющий операции внутри процесса:

– Счётчик команд (program counter) – Стек выполнения – Набор регистров процессора

• Ядро планирует выполнение отдельных потоков, а не процессов • Раньше отдельный процесс содержал только один поток • Процесс, содержащий несколько потоков, называется многопоточным (многопоточной программой) • В Linux уникальная реализация потоков – это специальный тип процессов

Каждый процесс предусматривает наличие двух виртуальных ресурсов:

– Виртуальный процессор

• Создаёт для процесса иллюзию монопольного использования всей вычислительной системы (ВС)

• Физическим процессором совместно пользуются десятки процессов

• Эта виртуализация и помещение процессов на физический процессор называется планированием процессов – Виртуальная память

• Создаёт для процесса иллюзию того, что процесс один располагает всей памятью ВС

Потоки одного процесса: – Совместно используют одну и ту же виртуальную память (адресное пространство) – Каждый получает свой виртуальный процессор

Программа не является процессом

–Процесс – выполняющаяся программа + набор ресурсов + адресное пространство (АО)

– Несколько процессов могут выполнять одну и ту же программу

– Несколько процессов могут использовать одни и те же ресурсы (файлы, АО)

В Linux создание процесса осуществляется с помощью системного вызова fork() (fork – ветвление)

– новый процесс создаётся путём полного копирования уже существующего

• Вызвавший fork() процесс – родительский (parent) – Продолжает выполнение

• Новы

Наши рекомендации