Kernel geheimen

ArticleCategory:

Kernel Corner

AuthorImage:

[Foto van de Auteur]

TranslationInfo:

original in es Emiliano Ariel Lesende

es to en Gonzalo Garcia Agullo

en to nl Tom Uijldert

AboutTheAuthor:

Abstract:

Welkom bij de eerste van een reeks artikelen over de geheimen van de Linux kernel. Waarschijnlijk heb je in het verleden al eens een blik op de broncode geworpen. Het zal je dan wel zijn opgevallen dat er weinig over is van de originele 100 kb aan gecomprimeerde bestanden en dat dit is uitgegroeid tot meer dan 300 bestanden met meer dan 2 miljoen regels broncode die tezamen en gecomprimeerd 9 Megabyte in beslag nemen.

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.

ArticleIllustration:

[Illustratie]

ArticleBody:

Linux: het Internet Operating Systeem

Linux is een vrij te distribueren operating systeem voor de PC architectuur en anderen. Het is compatibel met de POSIX 1003.1 standaard en bevat tevens een hoop extra's die ook zijn te vinden in Unix System V en BSD 4.3. Een aantal grote brokken van de Linux kernel code waarover deze serie gaat zijn geschreven door Linus Torvalds, een Finse student Informatica. De eerste kernel kwam uit in November 1991.

Belangrijkste eigenschappen

Linux heeft voorzieningen voor de meeste behoeften van een modern Unix besturingssysteem:

Het compileren van de kernel

Laten we eens kijken naar de broncode van de kernel voordat we de kernel zélf gaan bestuderen.

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:

In volgende artikelen gaan we in op details en achtergronden van deze scripts en hoe ze te veranderen voor het maken van een nieuwe configuratie.

Ik hoop dat je wat aan dit artikel hebt gehad. e-mail gerust commentaar, suggesties en kritiek naar elesende@nextwork.net.

Meer informatie