Toon posts:

[Linux] Betekenis van HIGHMEM/LOWMEM

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Ik heb een Dual CPU server met 1,5GB RAM waar RedHat 8.0 op draait.
In de dmesg viel me het volgende op (dik gedrukt):
Linux version 2.4.18-14smp (bhcompile@stripples.devel.redhat.com) (gcc version 3.2 20020903 (Red Hat Linux 8.0 3.2-7)) #1 SMP Wed Sep 4 12:34:47 EDT 2002
BIOS-provided physical RAM map:
BIOS-e820: 0000000000000000 - 000000000009f800 (usable)
BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 000000005fff0000 (usable)
BIOS-e820: 000000005fff0000 - 000000005fff8000 (ACPI data)
BIOS-e820: 000000005fff8000 - 0000000060000000 (ACPI NVS)
BIOS-e820: 00000000fff80000 - 0000000100000000 (reserved)
639MB HIGHMEM available.
896MB LOWMEM available.

found SMP MP-table at 000fa600
Intel MultiProcessor Specification v1.1
Wat betekent dat HIGHMEM/LOWMEM nu precies. Is het geheugen boven die 896MB alleen adresseerbaar als kernel memory terwijl alles onder 896MB voor user-mode bestemd is ?

Moet ik die zg. "BIGMEM" kernel gaan gebruiken om alles (1,5G) aan te kunnen spreken ?

[ Voor 4% gewijzigd door Verwijderd op 12-06-2003 21:50 ]


Verwijderd

Highmem is boven 1024 KiloBytes :)

BIGMEM Linux kernels zijn voor systemen met meer dan 4 Giga bytes geheugen.

Allemaal niet van belang voor jou, die geheugennmap die je laat zien is maar de eerste megabyte.. :+

  • Sjonny
  • Registratie: Maart 2001
  • Laatst online: 08:57

Sjonny

Fratser

hmm.. vaag.. leek mij logischer als die grens op 1 gig had gelegen.
bigmem heb je pas na de 4 gig nodig (2^32, en 3x raden hoeveel bits je intel is ;))

The problem is in the part of your brain that handles intelligence.


Verwijderd

Topicstarter
raden hoeveel bits je intel is
Uhhh 33 bits :P

Verwijderd

offtopic:
Bunny_Feet schreef op 12 June 2003 @ 21:57:
[...]

Uhhh 33 bits :P

:D
Geeft de uitdrukking "The odd one out" weer een hele nieuwe betekenis!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op 12 juni 2003 @ 21:55:
Highmem is boven 1024 KiloBytes :)

BIGMEM Linux kernels zijn voor systemen met meer dan 4 Giga bytes geheugen.

Allemaal niet van belang voor jou, die geheugennmap die je laat zien is maar de eerste megabyte.. :+
't Highmem wat de kernel aangeeft is wat anders dan wat er vroeger met dos mee bedoeld werd hoor.

Highmem is alles boven een bepaalde range, hoe die range precies tot stand komt zou ik niet weten, maar tot nu toe heb ik die altijd op 896MB zien staan.

De bigmem-kernel is idd geloof ik voor 4-64GB systemen, maar als je ooit zelf een kernel gaat compileren moet je wel large memory support tot max 4GB aanzetten, ipv dat op 1GB te laten staan.

  • Wilke
  • Registratie: December 2000
  • Laatst online: 23:14
Precies wat ACM zegt :)

Kijk ook eens wat 'free' en '/proc/meminfo' ervan zeggen?

Zal vast wel goed gaan hier, want het lijkt er op dat Linux het prima herkent en dus vast ook gebruikt...

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 02-05 18:38

deadinspace

The what goes where now?

Verwijderd schreef op 12 juni 2003 @ 21:50:
code:
1
2
639MB HIGHMEM available.
896MB LOWMEM available.

Wat betekent dat HIGHMEM/LOWMEM nu precies. Is het geheugen boven die 896MB alleen adresseerbaar als kernel memory terwijl alles onder 896MB voor user-mode bestemd is ?
i386 is een 32-bit architectuur, en gebruikt dus 32 bit voor geheugen addressering. Dat betekent dat de address space 4 GB (2^32 bytes) is.

Moderne (nouja, niet-antieke) protected mode CPU's (waaronder alle incarnaties van i386) kennen een fysical / virtual memory scheiding. Fysical memory is het fysieke geheugen van de computer, virtual memory is de geheugenruimte die een process "ziet". Virtual memory is gemapt op fysical memory (of op andere zaken, zoals swap of files - maar dat terzijde).

Als een process dus 1 MB geheugen toegewezen heeft gekregen, dan valt deze 1 MB in zijn virtual memory. Maar dan kan het process nog niks. Die ene MB uit zijn virtual memory moet gemapt zijn op een MB uit het fysical memory. Het process spreekt gewoon het geheugen uit zijn virtual memory aan, en de CPU vertaalt deze virtual adresses (die alleen gelden in het wereldje van dat ene process) naar fysical adresses (die echt overal in je fysieke geheugen kunnen zijn). Zo kan het ook zijn dat 2 aaneengesloten MBs uit het virtual memory van het process gemapt zijn naar twee ver uit elkaar liggende MBs in het fysical memory; het maakt het process allemaal niet uit, de CPU regelt het wel (Overigens vindt dit doorgaans niet plaats met hele MBs, maar in pages van 4 KB op i386).

Maar i386 heeft een (tamelijk vervelende) beperking. Zo moet het virtual memory van een process en het fysical memory samen in de ene address space van 4 GB gemapt zijn. Dat betekent dus effectief dat je de 4 GB address space moet opdelen in een fysical address space en een virtual address space. Niet alle architecturen hebben deze beperking; zo kunnen Sparc CPU's er een fysical address space van 4 GB op nahouden en een virtual address space van 4 GB.

De Linux kernel doet een 1/3 split. 1 GB (ongeveer - 896 MB eigenlijk) fysical address space, 3 GB virtual address space. Dit betekent dat processes een virtual address space van 3 GB hebben, en dus 3 GB aan geheugen (echt geheugen, uitgeswapt, mmapped i/o, etc) kunnen gebruiken. Dat de fysical address space 1 GB is betekent dat er op elk moment maar 1 GB fysiek geheugen (low memory) kan zijn dat actief gebruikt wordt door het OS of processes.

Geheugen dat buiten deze 1 GB valt is dus even niet in gebruik. Dit is het high memory. Als de kernel echter geheugen nodig heeft, en er is geen low memory meer over, dan kan de kernel een page low memory naar het high memory verplaatsen, en een page uit het high memory naar het low memory verplaatsen. De (voorheen highmem, ongebruikte) page is dan beschikbaar voor gebruik. De page die van lowmem naar highmem is verplaatst is op dat moment echter niet bruikbaar. Maar de kernel kan deze weer terughalen naar het lowmem als hij nodig is. Dit principe lijkt heel erg op het swappen van geheugen naar je HD als je te weinig geheugen vrij hebt, maar het is uiteraard vele vele malen sneller.

Een andere manier om tegen dit alles aan te kijken is het volgende: de software kan je geheugen alleen zien via een window. Vergelijk dit met bijvoorbeeld met een armband of een ring die op een vel papier ligt. Je mag alleen het papier dat je door de ring of armband ziet gebruiken, maar je mag de ring of armband wel verplaatsen om zo toch het hele papier te kunnen gebruiken. Je gehele geheugen (1.5 GB) is dan het papier, en de ring of armband is dan de 1 GB lowmem. Alleen het geheugen binnen dat window van 1 GB kan gebruikt worden, maar de kernel kan het window naar hartelust verplaatsen (Linux/i386 gebruikt overigens strikt genomen geen window - een window is een aaneengesloten ruimte, terwijl de verdeling lowmem/highmem erg gefragmenteerd kan zijn. Maar het gaat om het idee).

Windows NT heeft overigens een 2/2 split, en in Linux 2.5 kun je uit meerdere splits kiezen (oa 1/3, 2/2, 3/1 en 1.5/2.5 meen ik), al is het sterk aan te raden gewoon de default (1/3) te gebruiken.
Moet ik die zg. "BIGMEM" kernel gaan gebruiken om alles (1,5G) aan te kunnen spreken ?
Als je je eigen kernel compiled:
zet "high memory support - 4 GB" (oid) aan.

Voor wat je nu draait:
Je dmesg geeft sowieso al aan lowmem en highmem te hebben. Alleen dat al impliceert dat de kernel alles kan gebruiken. Controleer met "free -m" hoeveel geheugen er totaal bruikbaar is.

  • igmar
  • Registratie: April 2000
  • Laatst online: 20-04 22:06

igmar

ISO20022

Sjonny schreef op 12 June 2003 @ 21:56:
hmm.. vaag.. leek mij logischer als die grens op 1 gig had gelegen.
bigmem heb je pas na de 4 gig nodig (2^32, en 3x raden hoeveel bits je intel is ;))
Met een grote maar : > 4 GB gebruikt PXA extensies, en ik dien je bigmem support aanzet boot de kernel alleen op systemen die PXA ondersteunen. Geen PXA, geen bootende kernel in dat geval :)

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 02-05 18:38

deadinspace

The what goes where now?

igmar schreef op 13 juni 2003 @ 10:08:
Met een grote maar : > 4 GB gebruikt PXA extensies, en ik dien je bigmem support aanzet boot de kernel alleen op systemen die PXA ondersteunen. Geen PXA, geen bootende kernel in dat geval :)
PXA ken ik niet, probeer het eens met PAE (Physical Address Extension) ;)

Overigens heb je sowieso PAE als je meer dan 4 GB RAM hebt, en als je dat niet hebt, dan zet je die optie waarschijnlijk niet aan.

Los daarvan heeft elke moderne Intel CPU (alles vanaf de PPro iirc) PAE. Niet dat het nuttig is om aan te zetten als je het niet nodig hebt, maar toch :P

  • zaphod_b
  • Registratie: Oktober 2001
  • Laatst online: 03-05 16:48
Zeer heldere uitleg deadinspace, wel boeiend om te lezen, wist ik niet allemaal! Echter, miereneukermode: er zit 1 klein foutje in. Vertaling van virtual mem naar phys mem wordt niet door de CPU gedaan. Dit doet je OS. Zo heeft elk OS zijn eigen 'paging algorithme', want dat is eigenlijk wat je hier beschrijft: het geheugenmanagement. Dit is gelukkig in Linux redelijk okiedokie voor mekaar ;).

Verwijderd

Voor wat betreft het I/O gedeelte in de kernel die gemapped word naar een fysical adres. Gebruikt de 2.4 kernel althans een bounce buffer. Dit functioneerd als een brug tussen de LOW en HIGH mem gedeelte. Dit is nodig omdat niet alle 'devices' uitgerust zijn met 'zoveel' bits om geheugen te adresseren. De bounce buffer zit zo 'laag' in het geheugen dat ieder device er na kan lezen/schrijven. Deze worden dan door de kernel gecp-ed naar het highmem gedeelte zodat het lijkt of de io gemapped is op de highmem gedeelte. Dit is natuurlijk een extra schrijf/lees/schrijf actie en een lees/schrijf/lees. maar het valt in het niet bij het uitswappen van LOW pages.

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 02-05 18:38

deadinspace

The what goes where now?

zaphod_b schreef op 14 June 2003 @ 01:30:
Vertaling van virtual mem naar phys mem wordt niet door de CPU gedaan. Dit doet je OS.
Nee hoor, dat doet de CPU :)

Het OS is wel degene die de pagetables samenstelt, en dus bepaalt welk memory naar waar gemapt wordt, maar het feitelijke vertalen van de adressen op het moment dat ze gebruikt worden gebeurt door de CPU (De MMU - Memory Managemen Unit - van de CPU om specifiek te zijn).

Het zou ook een flink trage boel worden als voor elke memory access het OS tussenbeide moest komen :P
Zo heeft elk OS zijn eigen 'paging algorithme', want dat is eigenlijk wat je hier beschrijft: het geheugenmanagement.
Ja, dat is het samenstellen van de pagetables, bepalen welke pages naar HD gepaged worden e.d.... Maar ik had het meer over hoe de CPU het doet :)

Verwijderd

Deadinspace, kun je jouw linux-geheugen ff op cd zetten zodat ik deze net zoals in de matrix bij mij in me hoofd kan pompen???

  • zaphod_b
  • Registratie: Oktober 2001
  • Laatst online: 03-05 16:48
deadinspace schreef op 15 June 2003 @ 16:19:
[...]
Ja, dat is het samenstellen van de pagetables, bepalen welke pages naar HD gepaged worden e.d.... Maar ik had het meer over hoe de CPU het doet :)
Ah, dan hadden we het toch over hetzelfde ding ;). Ik dacht even nml dat je het volledige paging-algorithme aan de CPU wilde toeschrijven ;).

En je hebt volledig gelijk met de MMU, daar is ie voor ;). Maar gelukkig hebben we ook een OS, wat slim bedenkt welke pages ie nu wel of niet van lowmem naar highmem zal gooien, en welke naar swapspace enzovoort.

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 02-05 18:38

deadinspace

The what goes where now?

Verwijderd schreef op 16 juni 2003 @ 00:34:
Deadinspace, kun je jouw linux-geheugen ff op cd zetten zodat ik deze net zoals in de matrix bij mij in me hoofd kan pompen???
Hier, begin maar met lezen:
http://lxr.linux.no/source/ :+
zaphod_b schreef op 16 June 2003 @ 15:28:
En je hebt volledig gelijk met de MMU, daar is ie voor ;). Maar gelukkig hebben we ook een OS, wat slim bedenkt welke pages ie nu wel of niet van lowmem naar highmem zal gooien, en welke naar swapspace enzovoort.
Samenvatting: het OS beslist wat er moet gebeuren, en de CPU doet het vuile werk :P :)

  • igmar
  • Registratie: April 2000
  • Laatst online: 20-04 22:06

igmar

ISO20022

deadinspace schreef op 13 June 2003 @ 21:48:

PXA ken ik niet, probeer het eens met PAE (Physical Address Extension) ;)
Die idd :) Teveel met PXE gewerkt :(
Pagina: 1