LinuxBIOS - Computer Architecture Group
Transcription
LinuxBIOS - Computer Architecture Group
LinuxBIOS Philipp Degler 26 September 2006 /******************************************************************************************************** * * * * *******************************************************************************************************/ Inhaltsübersicht 1 Einführung BIOS / LinuxBIOS 2 Aufbau & Funktionsweise 3 Konfiguration & Installation 4 Beispiele & Demo 5 Fazit 6 Referenzen 1. Einführung BIOS / LinuxBIOS - 8 Folien - 1 2 /******************************************************************************************************** * * * * *******************************************************************************************************/ BIOS = Basic Input Output System LinuxBIOS 1981 1 ~1982 1985 1999 2 EFI 2005 /******************************************************************************************************** * * * * *******************************************************************************************************/ Aufgaben eines BIOS ● Power On Self Test (POST) ● Initialisierung der Hardware (Speicher, CPU, ...) ● Zugangskontrolle / Sicherheit ● Bereitstellung wichtiger Konfigurationsoptionen ● ● 1 Laden und Ausführen von BIOS Erweiterungen auch „Extension ROM“ genannt. Laden und Ausführen eines Bootloaders / Bootmanager 2 /******************************************************************************************************** * * * * *******************************************************************************************************/ Vergleich mit LinuxBIOS LB ● Power On Self Test (POST) ● Initialisierung der Hardware (Speicher, CPU, ...) ● Zugangskontrolle / Sicherheit ● Bereitstellung wichtiger Konfigurationsoptionen ● ● 1 Laden und Ausführen von BIOS Erweiterungen auch „Extension ROM“ genannt. Laden und Ausführen eines Bootloaders / Bootmanager 2 /******************************************************************************************************** * * * * *******************************************************************************************************/ LinuxBIOS Fakten ● ● Gestartet von: Los Alamos National Laboratory (Ron Minnich) Programmiersprache: C, Assembler(wenig) – ● ● ● 1 ½ Mio. Codezeilen Lizenz: GPL v2 Unterstützte Architekturen: Pentium III & IV, AMD K7 & K8, PPC, Alpha bereits auf über 50 versch. Mainboards portiert 2 /******************************************************************************************************** * * * * *******************************************************************************************************/ Wer nutzt LinuxBIOS und warum? ● ● ● Rechenzentren (Rechen-Cluster) – Zuverlässigkeit => Fallback, 32 bit Protected Mode – gute Fernwartungseigenschaften Eingebettete Systeme – schnell => dank minimaler Initialisierung – anpassbar => gerade bei spezial Hardware! Hardware & Firmware Entwickler – 1 gute Debuggingeigenschaften (siehe LSRA Entwicklung HTX-Board) 2 /******************************************************************************************************** * * * * *******************************************************************************************************/ HTX-Board RA-Lehrstuhl ● ● ● 1 Portierung für IWill DK8HTX Mainboard Aktivierung und Initialisierung des HTX-Sockels Schwierigkeiten – IRQ-Routing – MPTable für SMPSupport 2 /******************************************************************************************************** * * * * *******************************************************************************************************/ Systemvorraussetzungen ● ● ● ● ● 1 Beschreibbares ROM (Flash) Explizit unterstütztes Mainboard (ohne Portierung) Mainboard dessen Chips weitestgehend unterstützt werden (mit Portierung) Vorzugsweise Linuxsystem mit gcc Compiler(>=3.3), binutils, Python Zweiter Rechner & serielles Kabel => Debugging bzw. Logging 2 2. Aufbau & Funktionsweise - 11 Folien - 2 /******************************************************************************************************** * * * * *******************************************************************************************************/ LinuxBIOS Boot Sequenz 32 bit Protected Mode 16 bit Real Mode ROM RAM Fallback ? CPU Hyper Transport Initialisierung 2 PCI / Payload /******************************************************************************************************** * * * * *******************************************************************************************************/ Protected Mode ● ● ● ● Verfügbar für x86 >= 80286 Speicheraufteilung mit Hilfe einer Global Descriptor Table (GDT) & pro Task einer Locale Descriptor Table (LDT) Zugriffsschutz über 4 Descriptor Privilege Level Prozessor schützt kritische Systembereiche (Speicher) im Gegensatz zum Real Mode: – kein Paging, Überlappung von Segmenten, – weniger Speicher adressierbar 2 /******************************************************************************************************** * * * * *******************************************************************************************************/ ● ● ersten 16 byte – Sprung zu LinuxBIOS Fallback ersten 64 kb – Fallback Image verbleibenden 448 kb können für Fallback-Payload, Normal Image und Normal-Payload genutzt werden. Fallback BIOS FB. Payload Normal BIOS N. Payload Hauptspeicher startet von unten 2 0xFFFF FFFF 0xFFFF FFF0 0xFFFF 0000 ... ● Flash ROM Memory-Map – 512kb Flash 0xFFF8 0000 0x0000 0000 /******************************************************************************************************** * * * * *******************************************************************************************************/ Erste Codezeilen noch ASM .code16 .globl _start .type _start, @function _start: cli /* Clear Interrupts */ movl %eax, %ebp /* Save the BIST result */ /* Invalidate TLB*/ xorl %eax, %eax movl %eax, %cr3 2 /******************************************************************************************************** * * * * *******************************************************************************************************/ Erste Codezeilen noch ASM movw %cs, %ax shlw $4, %ax movw $gdtptr16_offset, %bx subw %ax, %bx data32 lgdt %cs:(%bx) movl %cr0, %eax andl $0x7FFAFFD1, %eax /* PG,AM,WP,NE,TS,EM,MP = 0 */ orl $0x60000001, %eax /* CD, NW, PE = 1 */ movl %eax, %cr0 /* Restore BIST to %eax */ movl %ebp, %eax 2 /******************************************************************************************************** * * * * *******************************************************************************************************/ Erste Codezeilen noch ASM /** * Now in protected mode jump to a 32 bit code segment. */ data32 ljmp $ROM_CODE_SEG, $__protected_start /** * The gdt is defined in entry32.inc, it has a 4 Gb code segment * at 0x08, and a 4 GB data segment at 0x10; */ .align 4 .globl gdtptr16 gdtptr16: .word gdt_end - gdt -1 /* compute the table limit */ .long gdt /* we know the offset */ 2 /******************************************************************************************************** * * * * *******************************************************************************************************/ Abstraktes Gerätemodell 1..1 BUS 1..1 1..* Device PCI-Device PNP-Device 2 Bridge 1..1 /******************************************************************************************************** * * * * *******************************************************************************************************/ Realisierung des Gerätemodells durch C-Structs struct bus { device_t device_t unsigned ... }; struct device { struct bus * dev; /* This bridge device */ children; /* devices behind this bridge */ reset_needed : 1; /* bus this device is on, for bridge * devices, it is the up stream bus */ device_t next;/* next device on this bus */ device_t sibling; /* chain of all devices */ struct device_operations *ops; ... } 2 bus; /******************************************************************************************************** * * * * *******************************************************************************************************/ Auch Geräte-Operationen werden abstrahiert static void si_sata_init(struct device *dev) { ... } static struct device_operations si_sata_ops = { .read_resources = pci_dev_read_resources, .set_resources = pci_dev_set_resources, .enable_resources = pci_dev_enable_resources, .init = si_sata_init, .scan_bus = 0, }; static struct pci_driver si_sata_driver __pci_driver = { .ops = &si_sata_ops, .vendor = 0x1095, .device = 0x3114, }; 2 /******************************************************************************************************** * * * * *******************************************************************************************************/ Payload ● letzter Schritt des Bootprozesses ist das Laden der Payload ● Payload ist ein binärer Code im ELF-Format ● wird im ROM hinter LinuxBIOS abgelegt ● Achtung: LinuxBIOS und Payload müssen in Flash-ROM des Rechners passen ● Etherboot => booten aus dem Netz ● Filo => booten von Platte, USB 2 3. Konfiguration & Installation - 8 Folien - 3 4 /******************************************************************************************************** * * * * *******************************************************************************************************/ Konfigurationsräume Def. Konfigurationsparameter '/src/config/Options.lb Mainboard '/src/mainboard/../Options.lb' Image '/targets/<vendor>/<mainboard>/O ptions.lb' 3 4 /******************************************************************************************************** * * * * *******************************************************************************************************/ Allgemeine Konfigurationsregeln ● ● Konfigurationsdateien lauten meist auf den Namen Config.lb Werden von generischem Python-Script ausgewertet => config.py ● Kommentare können mit '#' eingeleitet werden ● Schlüsselwörter: – 'option', 'default', 'uses' => Parameterdefinition – 'arch', 'cpu', 'driver', 'object', ... => Anweisungen 3 4 /******************************************************************************************************** * * * * *******************************************************************************************************/ Konfiguration des ROM Image ● '/targets/<vendor>/<mainboard>/Config.lb' – Debug-Level – Imagegröße – Imageaufbau => mit Fallback oder ohne ? – Payload => Filo, etherboot, Linux kernel etc. – 'option PARAMETERNAME=WERT' überschreibt Standardwert des Mainboards. 3 4 /******************************************************************************************************** * * * * *******************************************************************************************************/ Konfiguration Mainboard ● ● /src/mainboard/<vendor>/<model>/Config.lb – Festlegen der Architektur und der CPU – Konfiguration der Mainboard-Chips – Busstruktur wird in Baumstruktur abgebildet – Einbindung weiterer Treiber 'driver OBJECTFILE.o' /src/mainboard/<vendor>/<model>/Options.lb – legt Konfigurationoptionen für Mainboard fest – 'uses PARAMETERNAME' – 'default PARAMETERNAME=WERT' 3 4 /******************************************************************************************************** * * * * *******************************************************************************************************/ Wichtige Mainboard Codes ● auto.c – frühe Mainboard spezifische Initialisierungen vor ● ● irq_tables.c – ● Festlegung IRQ-Routing => wichtig bei Portierung mptable.c – ● Konsole, Memory-Controller, etc. Interrupt-Routing bei Mehrprozessorsystemen failover.c – Fallbackverhalten 3 4 /******************************************************************************************************** * * * * *******************************************************************************************************/ Quellen(=Source) Überblick 1/2 ● src – /arch ● – LinuxBIOS C basierter Start Code /config ● Def. Konfigurationsparametern 3 /console ● – – „Konsolentreiber“ /cpu ● /boot ● – Architektur spezifische Dateien, initialer Startup Code – Implementierung versch. Prozessoren /devices ● Routinen für dynamische Geräteverwaltung & Initialisierung 4 /******************************************************************************************************** * * * * *******************************************************************************************************/ Quellen(=Source) Überblick 2/2 ● src – /include ● – – Header Dateien /lib ● Standardfunktionen wie memcmp, memcpy etc. /mainboard ● – Mainboard spezifische Implementierungen /northbridge ● – /southbridge – /superio – /pc80 ● – Tastatur etc. /stream ● 3 Speicher und Bus spezifische Funktionen Payload 4 /******************************************************************************************************** * * * * *******************************************************************************************************/ Installation ● Build-Verzeichnis erstellen – ● 'buildtarget <vendor>/<mainboard>' im Ordner /targets ausführen Im Build-Verzeichnis 'make' ausführen – Ergebnis: linuxbios.rom ● ● ACHTUNG: Größe sollte EEPROM entsprechenden Image in ROM flashen – /util/flashrom – Prommer 3 4 4. Beispiele & Demo - 4 Folien - 4 5 6 /******************************************************************************************************** * * * * *******************************************************************************************************/ von klein ... Bento: - 7 smartCoreP5 Knoten von Digital Logic - 1 ein 3Com 100 Mbit HUB (ohne Gehäuse) - 3 IBM Thinkpad 12 V Netzteile 4 5 6 /******************************************************************************************************** * * * * *******************************************************************************************************/ ... bis groß Pink: - 1024 Knoten, P4 mit 2,4GHz - Netzwerk: Myrinet 2000 4 5 6 /******************************************************************************************************** * * * * *******************************************************************************************************/ Live-DEMO 4 5 6 5. Fazit - 4 Folien - 5 6 /******************************************************************************************************** * * * * *******************************************************************************************************/ Kontra ● ● Rel. hohe Einstiegshürde – nur bestimmte Mainboards unterstützt – Portierung erfordert gute C-Kenntnisse und ausreichend technische Dokumentation – evtl. BIOS-Savior oder Prommer nötig EEPROM muss flashbar sein und sollte >=128kb Speicher besitzen ● VGA Unterstützung teilweise problematisch ● Kein APM => ACPI noch rudimentär 5 6 /******************************************************************************************************** * * * * *******************************************************************************************************/ Pro ● Open Source ● Aktive Community / Mailingliste ● Modularer, weitestgehend C-basierter Aufbau ● Umfangreicher Support aktueller Chipsätze ● Effizienter Boot-Prozess => schnell! ● Flexibel dank ELF-Boot aka. Payload ● Gute Debuggingeigenschaften 5 6 /******************************************************************************************************** * * * * *******************************************************************************************************/ Fragen ? 5 6 6. Referenzen - 2 Folien - 1 6 /******************************************************************************************************** * * * * *******************************************************************************************************/ Referenzen 1/2 ● ● The Indispensable PC Hardware Book 3rd. Edition, Hans-Peter Messmer, Addison-Wesley PCI Hardware and Software Architecture & Design 3rd. Edition 1996, Edward Solari & George Willse, Annubooks, ISBN:0-925352-32-9 ● http://www.linuxbios.org/index.php/Documentation ● http://www.linuxjournal.com/article/4888 ● http://www.openbios.info/ ● http://developer.intel.com/technology/efi/ ● http://www.qemu.org ● http://www.etherboot.org ● http://developer.intel.com/products/processor/manuals/index.htm – Architectures Software Developer's Manual – Instruction Set Reference – System Programming Guide 1 6 /******************************************************************************************************** * * * * *******************************************************************************************************/ Referenzen 2/2 ● http://www.macintouch.com/pchistory.html#query ● http://dir.gmane.org/gmane.linux.bios ● http://superschurke.wordpress.com/2006/06/02/bootsektor-mit-gcc/ ● http://home.comcast.net/~fbui/intel.html ● http://sandpile.org/aa64/crx.htm 1 6