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

Documents pareils