Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
iakovlev.org

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 …"
Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье