Bootstrapping a Linux system
При загрузке линукса на консоль выводится множество сообщений . Полный их список можно
вывести командой
cat /var/log/dmesg | more :
при этом например мой асп 9.2 вывел следующее - первые несколько строк :
Linux version 2.4.22-1.2154.nptl.asp (build@ws163.outpost.sw.ru)
(gcc version 3.3.2 200BIOS-provided physical RAM map:
BIOS-e820: 0000000000000000 - 00000000000a0000 (usable)
...
0MB HIGHMEM available.
383MB LOWMEM available.
ACPI: have wakeup address 0xc0001000
On node 0 totalpages: 98288
zone(0): 4096 pages.
zone(1): 94192 pages.
zone(2): 0 pages.
DMI not present.
ACPI: RSDP (v000 VIA694 ) @ 0x000f61d0
ACPI: RSDT (v001 VIA694 AWRDACPI 0x42302e31 AWRD 0x00000000) @ 0x17ff3000
ACPI: FADT (v001 VIA694 AWRDACPI 0x42302e31 AWRD 0x00000000) @ 0x17ff3040
ACPI: DSDT (v001 VIA694 AWRDACPI 0x00001000 MSFT 0x0100000c) @ 0x00000000
Kernel command line: root=/dev/hdb6 ro rhgb
Initializing CPU#0
Detected 1202.769 MHz processor.
Console: colour VGA+ 80x25
Эти сообщения относятся к группе Kernel Boot messages.
Bootstrap - процесс , который является частью операционной системы , загружаемый в основную память ,
при этом происходит инициализация базовых структур ядра . Загрузка компьютера - сравнительно длительный процесс ,
В начале , при включении компьютера , устанавливается пин RESET , инициализируются регистры процессора
cs , eip . Затем запускается код , который лежит в памяти по адресу 0xfffffff0 - это т.н. ROM-память , или
биос . Биос - это набор низкоуровневых программ для управления устройствами .
Процессор выполняет преобразование адресов памяти по схеме
Logical Address --> Linear Address --> Physical Address
Это может выполняться в 2 режимах - Real mode , Protected Mode . Все процедуры биоса выполняются в Real mode.
Ядро работает в Protected Mode , поэтому после инициализации ядро более не исползует биос , вместо этого
у ядра есть набор драйверов . В Real mode адрес вычисляется по формуле seg*(2*8)+off.
Первая фаза загрузки - POST - происходит выполнение тестов над оборудованием .
Вторая фаза - инициализацмя железа - здесь проверяются IRQ и I/O-порты , выводится таблица устройств .
Третья фаза - ищется загрузчик - либо на флопе , либо на харде , либо на CD .
Четвертая фаза - если загрузчик найден , биос копирует содержимое его 1-го сектора в RAM-память , после чего
стартует с адреса 0x00007c00 , на этом работа биоса заканчивается .
Задача загрузчика - загрузить в память image ядра , эту задачу выполняет Boot Loader.
Если загрузка происходит с харда : первый сектор харда называется Mater Boot Record (MBR), он включает
таблицу партиций и небольшую программу . Эта программа загружает 1-й сектор нужной партиции
и называется LILO (LInux boot LOader).LILO позволяет пользователям выбрать нужную операционную систему .
При загрузке с флопи образ ядра дополнительно сжимается . Код загрузчика для дискеты находится в
/usr/src/linux-2.4.2/arch/i386/boot/bootsect.S.
Код этого файла помещается в начало образа ядра и представляет из себя boot loader.
После того как биос скопирует образ с дискеты в память , он переходит по адресу 0x00007c00 ,
и запускается код boot loader . Этот код выполняет следующее :
копирует себя в память по адресу 0x00090000.
инициализируется Real Mode stack по адресу 0x00003ff4
инициализируется таблица параметров флоппи-диска
выводится сообщение "Loading"
загружается стартовый код ядра с дискеты в память по адресу 0x00090200.
загружается оставшийся код ядра с дискеты в память по адресу 0x00010000
загружается код функции setup()
При загрузке с харда картина немного иная . LILO может быть установлен как в MBR , так и на текущую
партицию . LILO разбит на 2 части - первичный boot loader и вторичный boot loader .
При загрузке первичный код загружается в память биосом по адресу 0x00007c00 , после чего он копирует себя
по адресу 0x0009a000 , инициализирует Real Mode stack (0x0009b000 - 0x0009a200),
после чего загружается вторичный boot loader. Вторичный boot loader предлагает выбрать нужную ОС
из набора имеющихся . После выбора вторичный boot loader загружает boot sector выбранной ОС в память
и запускает этот boot sector , либо копирует все ядро в память .
Функция setup
После чего запускается опять же функция setup() , код которой лежит в /usr/src/linux-2.4.2/arch/i386/boot/setup.S .
Ее код лежит в памяти со смещением 0x200 . Эта функция инициализирует устройства . Она выполняет следующее :
определяется доступная память
инициализируется клавиатура
определяется видео-адаптер
инициализируется дисковый контролер
проверяется шина
проверяется мышь
проверяется поддержка Advanced Power Management
настройки загружаются в память
инициализируются Interrupt Descriptor Table (IDT) и Global Descriptor Table (GDT).
PIC (Programmable Interrupt Controller) инициализируется
процессор переключается из Real mode в Protected mode
путем установки в 1 бита PE регистра cr0
переход в stratup_32( )
Функция startup_32
Существуют 2 функции startup_32(). Они существуют на тот случай , что загружаемое ядро может быть сжатым или нет.
Первая находится в /usr/src/linux-2.4.2/arch/i386/boot/compressed/head.S file.
Она выполняет следующее :
инициализируются регистры сегментации
область данных ядра заполняется нулями
выполняется decompress_kernel( )
и разархивированное ядро размещается по адресу 0x00100000
запускается код по этому адресу 0x00100000.
Вторая версия функции лежит в /usr/src/linux-2.4.2/arch/i386/kernel/head.S file.Она выполняет следующее :
ициализируются регистры сегментации
инициализируется стек ядра
инициализируются Interrupt Descriptor Table (IDT)
сохраняются параметры биоса
регистры gdtr и idtr загружаются адресами GDT и IDT
переход в start_kernel( )
start_kernel()
Эта функция выполняет инициализацию ядра :
paging_init( )
mem_init( )
trap_init( ) , init_IRQ( )
kmem_cache_init( )
time_init( )
После этого на консоль выводится сообщение - "Linux version 2.4.2 …"
|
|