original in es Emiliano Ariel Lesende
es to en Gonzalo Garcia Agullo
en to nl Tom Uijldert
Deze serie is niet voor nieuwkomers maar voor gevorderde programmeurs. Uiteraard staat het je vrij dit hoe dan ook te lezen en de schrijver zal zijn best doen eventueel opkomende vragen via e-mail te beantwoorden.
Nieuwe fouten en oplossingen voor het systeem worden bijna dagelijks gevonden en gepubliceerd. Het is tegenwoordig bijna onmogelijk om de broncode in zijn geheel nog te overzien. Er is aan samengewerkt door hele volksstammen programmeurs die een homogene stijl van coderen trachten te handhaven maar feitelijk toch uiteenlopen.
Linux ondersteunt volledige multitasking. Alle processen zijn onafhankelijk van elkaar. Geen ervan hoeft de processor op te geven voor andere processen.
Linux kan alle resources die het heeft laten delen door de gebruikers die op het systeem zijn aangesloten via meerdere terminals.
Alleen dié delen van het programma die nodig zijn worden ingeladen in geheugen.
Als er niet genoeg geheugen is zal Linux op zoek gaan naar pagina's ongebruikt geheugen van 4K die het kan vrij maken en op schijf opslaan. Als een dergelijke pagina weer nodig is zal Linux deze weer van schijf herstellen op de originele plaats. Op oudere Unix systemen en sommige moderne zoals Windows wordt geheugen vrijgemaakt door een compleet proces naar schijf te schrijven. Dit is minder efficiënt.
Gebruikers van MSDOS zijn gewend om met Smartdrive te werken. Een programma wat een vast stuk geheugen reserveert voor gebruik als disk cache. Linux daarentegen heeft een heel wat flexibeler caching systeem. Meer geheugen wordt gebruikt als dit beschikbaar is, minder wanneer het geheugen meer nodig is voor processen en andere delen van het systeem.
Een bibliotheek is een verzameling van routines die programma's kunnen gebruiken voor het bewerken van data. Er zijn een aantal standaard bibliotheken die door meerdere processen tegelijk worden gebruikt. Op oudere systemen worden deze bibliotheken in ieder programma meegenomen, zodat ze meerdere keren in het geheugen worden ingeladen, iedere keer dat een proces wordt gestart dat deze bibliotheek gebruikt. In moderner systemen, zoals Linux, worden deze bibliotheken 1 keer ingeladen en gedeeld tussen alle processen die het nodig hebben.
POSIX 1003.1 beschrijft een standaard koppeling voor Unix besturingssystemen. Deze koppeling is beschreven als een verzameling C-routines en wordt tegenwoordig ondersteund door alle moderne besturingssystemen. Windows NT biedt ondersteuning voor POSIX 1003.1. Linux 1.2 is 100% compatibel met POSIX. Verder worden er nog een aantal System V en BSD koppelingen ondersteund of ontwikkeld.
Wie wil er niet willekeurig welke programma's van DOS, Windows95, FreeBSD of OS/2 applicaties onder Linux uitvoeren? Er zijn dus DOS, Windows en Windows95 emulatoren in ontwikkeling. Verder kan Linux andere binaire versies uitvoeren die voldoen aan de iBCS2 (intel Binary Compatibility) standaard.
Linux ondersteunt een groot aantal bestandsformaten. De meest gebruikte is tegenwoordig het Second Extended File System (Ext2). Een ander ondersteund formaat is de File Allocation Table (FAT), in gebruik door systemen die op DOS zijn gebaseerd. FAT is echter niet geschikt voor beveiliging en multiuser toegang vanwege restricties in het ontwerp.
Linux kan worden opgenomen in ieder lokaal netwerk. Iedere bekende Unix-dienst wordt ondersteund zoals Networked File System (NFS), remote login (telnet, rlogin), dial- up SLIP en PPP, enzovoorts. Integratie als server of client voor andere netwerken wordt ook ondersteund, inclusief bestanden delen en afdrukken in Macintosh, Netware en Windows.
Linux maakt gebruik van dit mechanisme om ondersteuning te bieden aan inter-proces communicatie, semaforen en gedeeld geheugen.
Structuur van de broncode-boom: Linux kernel broncode kun je meestal vinden onder /usr/src/linux. We zullen andere directories dus relatief aan dit pad opgeven. Het overzetten van het systeem op niet-Intel architecturen was de aanleiding om de boomstructuur om te gooien na versie 1.0. Code die specifiek met de architectuur heeft te maken is nu te vinden onder de arch/ hiërarchie. De code voor 386, 486, Pentium en Pentium Pro processoren kun je vinden onder arch/i386. De directory arch/mips is voor systemen, gebaseerd op MIPS, arch/sparc voor Sun Sparc, arch/ppc voor PowerPC/PowerMacintosh systemen enzovoorts. We zullen ons beperken tot de Intel architectuur, daar deze het meest wordt gebruikt met Linux.
De kernel van Linux is gewoon een standaard C programma. Er zijn slechts twee belangrijke
verschillen. Het startpunt voor een programma in C is main(int argc, char
**argv)
. In de Linux kernel is dit start_kernel(void)
. Er is nog geen
programmeeromgeving als de kernel wordt geladen en opgestart. Dit betekent dat er een aantal
essentiële dingen moet gebeuren voordat de eerste C-routine kan worden aangeroepen.
De assembler code die dit moet doen zit onder arch/i386/asm.
De betreffende assembler routine laadt de kernel op adres 0x100000 (1 Mbyte) van het
geheugen, installeert vervolgens de interrupt afhandelingroutines, global file
descriptor tabellen en interrupt descriptor tabellen, die alleen worden gebruikt
tijdens opstarten. Op dit punt aangeland wordt de processor in protected mode
gezet. De directory init/ bevat alles wat er nodig is om de kernel op te starten
(te initialiseren). Hier bevindt zich de start_kernel()
routine wiens
verantwoordelijkheid het is de kernel behoorlijk op te starten, rekening houdend met alle
parameters die tijdens opstarten zijn opgegeven. Het eerste proces wordt aangemaakt zonder
systeemaanroep (het systeem zelf is namelijk nog niet geladen). Dit is het beroemde
idle proces, degene die de processor bezighoudt als geen ander proces hem
nodig heeft.
De directories kernel/ en arch/i386/kernel bevatten, zoals het pad al aangeeft, de hoofdbestanddelen van de kernel. Hier zijn ook de belangrijkste systeemaanroepen. Ook andere taken zoals de time handler, scheduler, DMA manager, interrupt handler en signal controller zijn hier te vinden.
De code voor het managen van geheugen staat in mm en arch/i386/mm/. Dit is voor het alloceren en weer vrijgeven van geheugen voor processen. Ook paging van geheugen is hier te vinden.
Het Virtual File System (vfs) zit in fs/. Ondersteuning voor diverse bestandsformaten is te vinden onder de diverse subdirectories. De meest belangrijke daarvan is Ext2 en Proc. We zullen ze later wat nader bekijken.
Alle besturingssystemen hebben drivers nodig voor de aansturing van de diverse hardware onderdelen. Voor de Linux kernel zijn die te vinden onder drivers/.
Onder ipc/ vindt je de Linux implementatie van System V IPC.
Broncode voor de implementatie van diverse netwerk protocollen, sockets en Internet domeinen vindt je onder net/.
Een aantal standaard C-routines kun je vinden in lib/, zodat de kernel zélf er gebruik van kan maken.
Te laden modules worden gegenereerd tijdens compileren van de kernel en worden in modules/ opgeslagen. Deze is leeg tot de eerste compilatie.
Waarschijnlijk de meest belangrijke directory voor programmeurs is include/. Hier vind je alle C header bestanden die door de kernel worden gebruikt. Bestanden voor het intel platform kun je vinden onder include/asm-386
Compileren: Een nieuwe kernel wordt in essentie in drie stappen aangemaakt:
Ik hoop dat je wat aan dit artikel hebt gehad. e-mail gerust commentaar, suggesties en kritiek naar elesende@nextwork.net.