Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
 Kernels
 Boot 
 Memory 
 File system
 0.01
 1.0 
 2.0 
 2.4 
 2.6 
 3.x 
 4.x 
 5.x 
 6.x 
 Интервью 
 Kernel
 HOW-TO 1
 Ptrace
 Kernel-Rebuild-HOWTO
 Runlevel
 Linux daemons
 FAQ
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 Linux Kernel 2.6...5175 
 Trees...951 
 Максвелл 3...877 
 Go Web ...832 
 William Gropp...816 
 Ethreal 3...792 
 Gary V.Vaughan-> Libtool...782 
 Ethreal 4...776 
 Rodriguez 6...771 
 Ext4 FS...766 
 Clickhouse...765 
 Steve Pate 1...762 
 Ethreal 1...747 
 Secure Programming for Li...737 
 C++ Patterns 3...724 
 Ulrich Drepper...704 
 Assembler...699 
 DevFS...670 
 Стивенс 9...657 
 MySQL & PosgreSQL...639 
 
  01.01.2024 : 3621733 посещений 

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

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

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