Теперь мы уделим внимание особенностям аппаратного управления на РРС и х86. Обе архитектуры имеют аппаратные особенности управления памятью для поддержки окружения с реальной и виртуальной адресацией. Как и все операционные системы, менеджер памяти Linux зависит от аппаратной архитектуры. Этот раздел описывает аппаратную инициализацию на обеих архитектурах. Так как инициализация менеджера памяти полностью аппаратно-зависима, для понимания последовательности процесса инициализации нужно понимать аппаратную спецификацию.
Yaboot - это основанный на OpenFirmware (OF) загрузчик машин PowerPC New World. Аналогично LILO и GRUB, Yaboot использует конфигурационный файл и утилиты наподобие ybin и ybootconf ig для установки загрузочного раздела, содержащего Yaboot. Аналогично BIOS х86, OF позволяет настройку загрузочного диска. Однако в случае OF он различается от системы к системе. Настройки OF обычно можно узнать, введя «Сот-mand+Option/Alt+o+f.?».
Yaboot использует следующие шаги загрузки:
1. Yaboot вызывается OF.
2. Ищет загрузочные устройства, загрузочные пути и открытые загрузочные разделы.
Linux Loader (LILO)' используется в качестве х86-загрузчика Linux уже много лет. Это одна из простейших программ загрузки, доступная для настройки и загрузки ядра Linux. LILO похож на GRUB в плане того, что он тоже работает в два этапа. LILO использует файл конфигурации и не имеет интерфейса командной строки.
Мы снова начнем с инициализации BIOS системы и загрузки MBR (этап 1) в память и передачу в него управления. Остановки и события, возникающие на каждом из этапов LILO, описаны ниже.
Этап 1
1. Начало выполнения и отображение «L».
2. Распознание геометрии диска и отображения «I».
Многозагрузочная спецификация описывает интерфейс между любым потенциальным загрузчиком и любой потенциальной операционной системой. Многозагрузочная спецификация не указывает, как должен работать загрузчик, а только указывает интерфейс для работы с загружаемой операционной системой. Текущая цель - это архитектура х86 и свободные 32-битовые операционные системы, для которых предусматривается стандарт передачи конфигурационной информации из загрузчика в операционную систему.
Grand Unified Bootloader (GRUB)1 - это х86-загрузчик, используемый для загрузки Linux. GRUB 2 на момент написания книги находился в процессе портирования на РРС. Соответствующая документация, включающая его историю и особенности дизайна, находится на www.gnu.org/software/grub. GRUB распознает файловые системы на загрузочных дисках, а ядро может быть загружено из указанного файла, диска и раздела, где оно расположено. GRUB является двухэтапным загрузчиком (two-stage bootloader). Этап 1 инсталлируется в MBR и вызывается из BIOS.
Загрузчики - это программы, находящиеся на загрузочном диске компьютера. Первым устройством загрузки обычно является первый жесткий диск системы. Загрузчик вызывается BIOS (х86) или firmware (РРС) после того, как инициализация системы обеспечит поддержку памяти, прерываний и ввода-вывода, требуемых для загрузки ядра. После загрузки ядро инициализируется и конфигурируется операционной системой.
При включении процессор сначала получает доступ к адресам, которые обычно находятся в доступной для чтения области памяти. Эта доступная только для чтения память обычно располагается в Flash ROM (или просто Flash). Там располагается первый код,юторый выполняется при каждом запуске системы. Этот код отвечает за включение минимума систем, необходимых для загрузки ядра.
На данный момент мы рассмотрели подсистемы ядра Linux и используемые в их операциях структуры. Каждая глава подразумевала, что подсистема была настроена и запущена, а мы фокусировались на типичном управлении подсистемами ядра и обработке их операций. Тем не менее каждая из подсистем должна быть инициализирована перед использованием. Эта инициализация происходит во время загрузки ядра, после того как загрузчик завершит загрузку образа ядра в память и передаст ему управление.
Во время компиляции ядра вставляется соответствующая ветка дерева кода (х86, РРС, MIPS и т. д.). Здесь обсуждается РРС вариант исходного файла для обобщенного драйвера RTC не х86 систем.
/drivers/char/genrtc.с
276 static int gen_rtc_ioctl(struct inode *inode, struct file *file,
277 unsigned int cmd, unsigned long arg)
278 {
279 struct rtc_time wtime;
280 struct rtc_pll_info pll; 281
2 82 switch (cmd) {
283
284 case RTC_PLL_GET:
290 case RTC_PLL_SET:
298
302
305 306 307 308 309 310 311 312 313 314
353 354 355 356 357
В Linux интерфейс к таймеру настенных часов предоставляется через функцию ioctl () драйвера устройства /dev/rtc. Устройство этого драйвера называется Real Time Clock (RTC) . RTC предоставляет функцию для работы со 114-битовым значением в NVRAM. На входе этого устройства установлен осциллятор с частотой 32768 КГц, подсоединенный к резервной батарее. Некоторые дискретные модели RTC имеют встроенные осциллятор и батарею, тогда как другие RTC встраиваются прямо в контроллер периферийной шины (например, южный мост) чипсета процессора.