Опубликован: 01.07.2008 | Доступ: свободный | Студентов: 2184 / 322 | Оценка: 3.78 / 3.77 | Длительность: 11:57:00
Лекция 3:

Начальная загрузка операционной системы

< Лекция 2 || Лекция 3: 123456 || Лекция 4 >

Примерный фрагмент управляющей таблицы /etc/inittab

bchk::sysinit:/etc/bcheckrc/dev/console 2>&1
brc::sysinit:/etc/brc > /dev/console 2>&1
is:3:initdefault:
rc:12345:wait:/etc/rc > /dev/console 2>&1
r0:0:wait:/etc/rc0 > /dev/console 2>&1
r2:23:wait:/etc/rc2 > /dev/console 2>&1
r3:3:wait:/etc/rc3 > /dev/console 2>&1
pf:12345:powerfail:/etc/powerfail > /dev/console 2>&1
co:12345:respawn:/etc/sysmonitor console console
t1:23:respawn:/etc/sysmonitor tty01 9600
t2:23:off:/etc/sysmonitor tty02 9600

Формат таблицы:

ИМЯ:Уровни_выполнения:вид_действия:запускаемая команда

ИМЯ: - просто имя строчки - они все должны быть разными
вид_действия:

sysinit запустить один раз после начальной загрузки;

на соответствующем уровне выполнения:

  • wait - запустить один раз и дожидаться, пока не окончится;
  • respawn - запустить параллельно, а если окончится, перезапускать снова;
  • off - ничего не делать (просто игнорировать эту строку).

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

Сперва init запускает процессы, которые "sysinit"

Отработав все строки "sysinit" уровня, init идет все дальше по /etc/inittab и обнаруживает строку initdefault 3 - она заставляет его "перейти" на уровень 3.

Run Command - стандартные RC-каталоги запуска

Перейдя на уровень выполнения 3, init и отрабатывает первую встретившуюся строчку с уровнем "3" - запускается командный файл /etc/rc2 - загляните в него. Там все просто: /etc/rc2 берет и выполняет командные файлы /etc/rc2.d/S*, лежащие в каталоге /etc/rc2.d. Каждый файл выполняется с параметром "start"

Отработав /etc/rc2, init точно таким же образом запускает файл /etc/rc3. Вслед за этим он запускает несколько процессов sysmonitor - по одному на каждый имеющийся терминал. Это те самые процессы, которые говорят на терминал: "Login: " Пользователь, войдя на терминал, некоторое время работает, но как только он "уходит" из системы, на указанном терминале ничего не остается. init тут же выполняет действие "respawn" - перезапускает на терминал sysmonitor - и опять жизнерадостное "Login: " появляется на терминале.

Linux Slackware

По умолчанию init устанавливает уровень выполнения 5. При начальной загрузке отрабатывается файл

/etc/rc.d/rc.S

Затем для перехода в многопользовательский режим

/etc/rc.d/rc.M

из которого запускаются файлы

/etc/rc.d/rc.inet1 устанавливающий сетевые интерфейсы
/etc/rc.d/rc.inet2 запускающий сетевые сервисы
/etc/rc.d/rc.local запускающий несколько полезных программ и
 демонов - например, поддержка мыши, httpd,
 русификация консоли и т.п.

Linux RedHat

Используется стандартная технология rc-файлов System V

RC-каталоги:

/etc/rc.d/rc[0123456].d/
/etc/rc.d/init.d/

Конфигурационные параметры для RC-команд:

/etc/sysconfig/

HP-UX 10.20

Не смотря на BSD-евое происхождение, используется стандартная технология rc-файлов System V

RC-каталоги:

/sbin/rc[0123].d/
/sbin/init.d/

Конфигурационные параметры для RC-команд:

/etc/rc.defaults.d/

SVR4: SUN, Motorola

Используется стандартная технология rc-файлов System V

RC-каталоги:

/etc/rc[0123456].d/
/etc/init.d/

Unix, базовые принципы и особенности

Все системные действия выполняет ядро операционной системы Unix. Ядро - обычный выполняемый файл, расположен в файле /unix или /stand/unix или /vmunix или /vmlinuz (в зависимости от конкретной реализации). Можете посмотреть размер этого файла - не маленький. При начальной загрузке системы ядро целиком загружается в оперативнную память и в дальнейшем резидентно находится в ней, выполняя все необходимые работы.

Что входит в ядро.

  • ДРАЙВЕРЫ УСТРОЙСТВ. И тех, которые есть, и тех, которых нет, но могут быть, а также и такие, которые никогда вам не понадобятся.
  • УПРАВЛЯЮЩИЕ ПОДПРОГРАММЫ: части кода, ответственные за обеспечение работы пользовательских программ - разделение времени и прочих ресурсов системы.
  • СЛУЖЕБНЫЕ ТАБЛИЦЫ И ДАННЫЕ ЯДРА: таблицы текущих процессов, открытых файлов, управляющие структуры...
  • СИСТЕМНЫЕ ВЫЗОВЫ. (То, что MS-DOS называется "21 прерывание", можно считать некоторой аналогией/пародией на системные вызовы.) С точки зрения программиста это обычная си-шная функция, только выполняет она системно-зависимые действия, например: прочитать данные из файла, установить сетевое соединение, создать каталог, и т.д. и т.п. Все системные вызовы (а всего их более 1500 штук) вкомпилированы в тело ядра Unix. Пользовательские программы, вызывающие функции, являющиеся системными вызовами, на самом деле содержат только jump'ы на соответствующие адреса памяти в ядре. В пользовательскую программу системные вызовы не влинковываются.

Что находится в оперативной памяти.

  • ЯДРО ОПЕРАЦИОННОЙ СИСТЕМЫ.
  • БУФЕРНЫЙ КЭШ. Часть оперативной памяти резервируется под кэширование чтения и записи на диск. Любая операция чтения с диска приводит к тому, что прочитанные блоки помещаются в буферный кэш, а из него уже передаются запросившим данные программам. Если блок попал в кэш, то все последующие обращения к нему будут получать образ блока из кэша, причем независимо от того - та же самая программа обращается к блоку или какая-либо другая. Кэшируется также и запись на диск, опять же, разделяемая между всеми выполняемыми программами.
  • ПРОЦЕССЫ. Процессом в Unix называется выполняющаяся программа.

Средства экономии памяти. Виртуальная память.

  • РЕЕНТЕРАБЕЛЬНОСТЬ КОДА. Когда одна и та же программа (выполняемый файл) запущена в нескольких экземплярах, то в оперативную память загружается только одна копия выполняемого ассемблерного кода на всех. Каждый выполнямый процесс использует один и тот же текст программы, просто у каждого процесса имеется свой собственный указатель на текущий оператор.
  • РАЗДЕЛЯЕМЫЕ БИБЛИОТЕКИ. (В Windows есть похожее понятие DLL - динамически подгружаемая библиотека). Некоторое количество часто выполняемых функций (например, printf, да и много других) оформляется в виде специальным образом подготовленной библиотеки (SHARED LIBRARY). При компиляции программы, использующей разделяемые библиотеки, эти функции не линкуются внутрь кода программы. Они "выдергиваются" из библиотеки на стадии выполнения программы. Этим мы экономим место на диске и в оперативной памяти: в программах отсутствует код разделяемых функций, а в оперативной памяти эта функция присутствует в одном экземпляре на всех.
  • SWAPPING. Каждый Unix-процесс функционирует в своем собственном 32-х битном виртуальном адресном пространстве, не пересекающемся с другими. Адресное пространство процесса может быть большим, чем физическая оперативная память. Виртуальная память поддерживается с помощью PAGING'а - разрешения виртуальных адресов в физические "на лету", с подкачкой отсутствующих страниц памяти со swap-области на жестком диске.

    На самом деле SWAPPING'а как такового в Unix'е нет, вместо него применяется гораздо более гибкий PAGING. (swapping - по определению, это ПОЛНАЯ выгрузка программы на swap-область с целью освобождения места в оперативной памяти).

    Область памяти, занятая программой, разделена на три части: TEXT (выполняемые коды программы), DATA (статические данные программы), STACK (динамические данные). Когда операционка освобождает место в памяти за счет TEXT'а, то она не занимается сбросом его на диск. Она сразу помечает его как свободный. Действительно, когда потребуется загрузить TEXT обратно в память, его можно будет взять из самого выполняемого файла с программой. Такая экономия имеет один побочный эффект. Файл программы, которая в данный момент выполняется, невозможно уничтожить. Операционная система сообщит в этом случае: "text file busy", и откажется выполнять удаление.

  • БИТ НАВЯЗЧИВОСТИ. (sticky bit). Выполняемая программа может иметь дополнительный атрибут. Так называемый "бит навязчивости". Когда такая программа заканчивает выполнение, операционка (по возможности) старается не занимать память, в которой находился текст программы. Соответственно, повторный ее запуск произойдет очень быстро - ведь программа все еще загружена в память, ее не требуется зачитывать с диска. Нужно просто передать на нее управление.
< Лекция 2 || Лекция 3: 123456 || Лекция 4 >