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 
 Интервью 
 Kernel
 HOW-TO 1
 Ptrace
 Kernel-Rebuild-HOWTO
 Runlevel
 Linux daemons
 FAQ
NEWS
Последние статьи :
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
  SQL 30.07   
  Python 10.06   
 
TOP 20
 Alg3...2093 
 Intel 386...781 
 Secure Programming for Li...664 
 Trees...656 
 Си за 21 день...574 
 2.0-> Linux IP Networking...563 
 Ethreal 1...559 
 Lists...558 
 Стивенс 1...553 
 Stein-MacEachern-> Час...548 
 Steve Pate 3...536 
 Ethreal 2...522 
 Rodriguez 6...499 
 Python...489 
 Стивенс 4...487 
 William Gropp...457 
 Advanced Bash Scripting G...453 
 Стивенс 5...425 
 Keogh 2...408 
 Комментарий...398 
 
  01.08.2020 : 2947670+ посещений 

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

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

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