# Basiskennis informatica/Primair geheugen
## Basiseenheid voor verwerking - Bit

De basiseenheid van verwerking is een binaire digit (afgekort: bit). Een bit heeft twee toestanden: 0 of 1. Deze twee toestanden kunnen voorgesteld worden door (fysische) grootheden zoals spanning, stroom, licht...
Een voorstelling van een decimaal getal met bits kan via de BCD-notatie. (Binary Coded Decimal). Hierbij zal men elke decimale digit (= cijfer) voorstellen door zijn binair equivalent. Aangezien een cijfer een van de waarden 0 tot en met 9 kan aannemen van, zijn er 4 bits nodig om alle cijfers binair voor te stellen.
   decimaal: 1971 <=> BCD: 0001 1001 0111 0001 <=> binair: 11110110011

## Geheugenadressen

Het geheugen van een computer bestaat uit een groot aantal kleine eenheden van dezelfde grootte. Elk van deze eenheden is toegankelijk via een uniek nummer. Dit wordt een geheugenadres (Eng: memory address) genoemd.
Byte De adresseerbare eenheden van het geheugen zijn meestal bytes (8 bits). Alleen voor heel eenvoudige processoren, zoals die in toetsenborden gebruikt worden, worden wel 4-bits processoren gebruikt.
Woord De fysieke geheugeneenheden (woorden) zijn tegenwoordig meestal groter, namelijk 32-bits (4 bytes) of 64-bits (8 bytes). Dit heet de woordbreedte van een computer. Er bestaan computers met woordbreedtes van meer dan 64 bits. Vroeger heeft men wel computers gemaakt met een woordbreedte van 12 en 48 bits, maar dit is tegenwoordig niet meer gebruikelijk.
Adresruimte Zulke adressen worden doorgaans geschreven in hexadecimale vorm. Bijvoorbeeld, een geheugen van 64kB kan geadresseerd worden door met de adressen van 000016 tot en met FFFF16. Dit is een 16-bits adres. De 8-bits processoren uit de jaren 80 hadden doorgaans een adresruimte van deze grootte. Tegenwoordig is een adresruimte van gigabytes gebruikelijk, en dit neemt alsmaar toe. Voor het adresseren van 4 gigabyte is een 32-bits adres nodig.
Adresbus De microprocessor heeft aan de buitenkant een aantal verbindingen die samen de adresbus vormen. Op deze verbindingen (32 stuks in het geval van een 32-bits adresbus) komt het adres te staan waarvan de processor de waarde uit het geheugen wil lezen of schijven. De data worden via de databus uitgewisseld. De grootte hiervan is gelijk aan de woordbreedte van de computer.

## Volgorde van bytes

Een computer bezit een geheugen; dit geheugen is een soort gigantisch kladblok waar data in geschreven kunnen worden, om makkelijk data terug te vinden zijn er geheugenadressen. Een 32-bitscomputer heeft zo geheugenadressen die bestaan uit 32 bits. Zo kunnen dus $2^{32}$ verschillende geheugenlocaties aangesproken worden. Indien een geheugenlocatie (de kleinste adresseerbare hoeveelheid) bijvoorbeeld 1 byte bevat beslaat het geheugen maximaal $2^{32}$ bytes (of 4.294.967.296 byte, zijnde een geheugenlimiet van 4 gigabyte op een standaard x86 machine). Het opslaan van een enkele byte is dus geen enkel probleem. Wanneer men 0xAF wegschrijft op adres 0x12341234 dan zal dit perfect lukken en dan zal deze byte er steeds zo uitkomen. Nu kan een enkele byte niet bijster veel informatie bevatten, amper 256 $2^{8}$ verschillende waarden. De oplossing is simpel, gebruik gewoon meer bytes. Een mooi voorbeeld is een standaard IP adres. Neem 192.168.1.1 bijvoorbeeld, dit is een 32 bits getal en vereist dus 4 bytes. Wanneer dit omgerekend wordt naar hexadecimale voorstelling, geeft dit 0xC0A80101 of de volgende bytes die in het geheugen opgeslagen moeten worden: 0xC0,0xA8,0x01 en 0x01. Nu zijn er twee manieren om deze byte op te slaan in het geheugen. Er zijn onder meer de Big Endian benadering en de Little Endian benadering:

### Big Endian

Bij een Big Endian system wordt de meest significante byte op het laagste geheugenadres geplaatst. Een mnemonic is: big end in, of de meest significante wordt eerst geplaatst.
Big Endian wordt vooral toegepast in Motorola 6800, Sparc en PowerPC processorarchitecturen.

### Little Endian

Een alternatieve benadering voor hetzelfde ip adres in Little Endian is het volgende, hierbij wordt de minst significante byte op het laagste geheugenadres geplaatst:
Little Endian wordt vooral gebruikt op de Intel x86 architectuur.
Indien niet een byte, maar bijvoorbeeld een word (16 bit) de kleinste adresseerbare unit zou zijn, zou het probleem er als volgt uitzien:
Hierbij wijst een opeenvolgende geheugenadres dus naar een groep van 16 bits. Intern in de kleinst adresseerbare unit wordt er dus geen endian conversie gedaan, tussen de cellen natuurlijk wel.

### Fouten bij omzetting

Problemen treden op wanneer Little Endian output terecht komt op een Big Endian machine en vice versa indien een van de beide machines daar niet aan aangepast is. Wanneer een protocol tussen twee machines gedefinieerd wordt (bijvoorbeeld een netwerk protocol) dient afgesproken te worden welke de endianess is die gebruikt zal worden voor de datatypes (meestal zal men geneigd zijn hier Big Endian te gebruiken, maar geen van beiden hebben een significant voordeel tegenover de andere). In het geval van een ipadres kan men zo 1.1.168.192 uitlezen in plaats van 192.168.1.1. Een goede oefening voor de lezer is na te gaan wat er gebeurt indien 0x00000001 hetzelfde lot ondergaat.

## Cachegeheugen

Het cachegeheugen is geheugen in een computer dat sneller toegankelijk is dan het geheugen waar de gegevens eigenlijk opgeslagen zijn. Wanneer informatie wordt verkregen op een langzame manier, kan het in een cache(geheugen) geplaatst worden, zodat de computer wanneer die gegevens een volgende keer nodig zijn, ze uit de cache kan halen, in plaats van de langzame manier te herhalen. Cachegeheugen kan op verschillende plaatsen toegepast worden.

### Level 1

Dit is een klein stukje geheugen dat bijzonder snel is en zich op de CPU zelf bevindt. Normaal gesproken wordt het gebruikt om instructies vast te houden terwijl ze worden uitgevoerd. L1-cache zit fysiek tussen de registers van de CPU en de L2-cache.

### Level 2

Dit is een stukje snel geheugen dat zich tussen L1-cache en het "hoofd"-geheugen van de computer bevindt. Vaak is dit groter dan de L1-cache. L1-cache spreekt eerst L2-cache aan voordat het hoofdgeheugen van de computer aangesproken wordt. Over het algemeen buffert L2-cache hetzelfde als L1-cache.

### Level 3

Daar steeds meer CPU-bouwers zowel L1- als L2-cache in de CPU gaan bouwen, is er L3-cache bedacht als extra cache tussen L2-cache en het hoofdgeheugen van de computer.

## Geheugentypen
### Geheugenchips

Van oudsher zijn er twee soorten geheugen aanwezig in een computer: RAM en ROM. Hierbij is RAM (random access memory) geheugen waarin gelezen en geschreven kan worden (bijvoorbeeld een buffer om een tussenresultaat van een bewerking in op te slaan) en is ROM (read only memory) geheugen waaruit enkel gelezen kan worden (bijvoorbeeld om firmware in op te slaan). Maar omdat niet iedereen hier even gelukkig mee is, is er nog een hybride tussenoplossing. Dit betreft geheugens waarvan de inhoud met een speciale procedure gewijzigd kan worden, hoewel dit beter niet te vaak moet gebeuren (bijvoorbeeld om een firmware upgrade mogelijk te maken). Hieronder zullen we de meest voorkomende types van elke klasse bespreken:

#### RAM

RAM bestaat uit twee families: DRAM (dynamisch) en SRAM (statisch). Het grote verschil tussen beide is de levensduur van de data. SRAM kan een waarde die erin gestopt is onbeperkt behouden, dit komt doordat SRAM gebaseerd is op de flipflop als schakeling, terwijl DRAM een waarde maar vluchtig, d.w.z. gedurende een korte tijd, kan behouden, daar DRAM gebaseerd is op een transistor en een condensator als bouwsteen. Daar een condensator altijd een zekere ontlading vertoont, is het nodig dat deze periodiek opnieuw geladen (refreshed) wordt, aangezien anders de inhoud van het geheugen verloren gaat. Hoewel DRAM dus schakelingen nodig heeft die het herladen verzorgen, wordt DRAM toch veel toegepast, omdat een condensator en een transistor zeer weinig chipoppervlakte met zich meebrengen, zodat DRAM zeer goedkoop is.

#### Hybride

Hybride geheugens zijn geheugens die wel gewijzigd kunnen worden en waarbij wijzigingen niet vluchig zijn en worden bewaard, in tegenstelling tot RAM, na een stroomuitval. Een nadeel is dat het herhaaldelijk schrijven nefast kan zijn voor de levensduur van de chip. Veelvoorkomende types zijn hier EEPROM en Flash, welke hier besproken worden:
De huidige EEPROM (of Electrically Erasable Programmable Read-Only Memory) chips kunnen zo'n 100.000 wis/schrijf cycli aan waarbij gans de chip gewist en herschreven wordt.
Flash is te vergelijken met EEPROM, maar hier wordt herschreven in blokken ipv gans de chip, flash is goedkoper dan EEPROM maar zal sneller slijten, al na een 10.000 cycli. Maar doordat enkel blokken herschreven worden kan een aangepast bestandsysteem gebruikt worden (bvb jffs2, jffs) zodat het geheel overal evenredig slijt. Toepassingen hier zijn vooral draagbare muziek spelers, embedded routers en dergelijke.

#### ROM

Twee types ROM zullen hier besproken worden: PROM en EPROM:
PROM (Programmable Read Only Memory) is een ROM dat via een PROM programmer slechts eenmaal geschreven kan worden, dit gebeurt door het vernietigen (of bijmaken) van bepaalde connecties in de structuur van de chip (door wat vrije ruimte op verschillende plaatsen achter laten kan eventueel nog wat aan bugfxes gedaan worden, maar dit gebruik is toch wel redelijk beperkt). PROM chips worden bijvoorbeeld ook gebruikt in de cartridges van bepaalde spelconsoles.
EPROM (Erasable Programmable Read Only Memory) is een PROM type waarbij wissen van de chip mogelijk is onder invloed van UV licht (deze chips zijn typisch voorzien van een venster). Na een blootstelling aan UV licht kan de chip opnieuw geprogrammeerd worden, het geheel is dus natuurlijk niet herprogrammeerbaar in het circuit zelf.

### SIMM

Single Inline Memory Module (SIMM) zijn RAM-modules die het eigenlijke werkgeheugen van een computer vormen. SIMM is een verouderde variant van het huidige DIMM-systeem, ze worden anno 2005 nauwelijks meer verkocht.
SIMM-modules gebruiken contactpunten aan 1 kant van de module. Hierdoor is het aantal contactpunten op een SIMM-kaart lager dan het aantal op een DIMM-kaart. Er bestaan 2 varianten, een 3.5 inch formaat met 30 contactvlakjes, en een 4.25 inch formaat met 72 contactvlakjes.
De 30 pin-variant kan 8-bit dataverkeer aan. Met een breedte van de geheugenbus van 32-bits zijn daarom altijd modules in veelvouden van 4 nodig. De variant met 72 pinnen kan 32-bit dataverkeer aan, waardoor slechts 1 kaart nodig is voor het zelfde effect. Systemen met een geheugenbusbreedte van 64-bits zouden veelvouden van 8 respectievelijk 2 modules nodig hebben, ware het niet dat dergelijke systemen meestal alleen geschikt zijn voor de modernere DIMM modules.

### DIMM

Dual Inline Memory Modules (DIMM) zijn RAM-modules die het eigenlijke werkgeheugen van een computer vormen. DIMM's zijn de modernere versies van het verouderende SIMM-systeem. Ze heten "Dual" omdat ze in tegenstelling tot SIMM's aan beide kanten van het 'reepje' een printplaat en aansluitcontactpunten hebben zitten. DIMM's zijn verkrijgbaar in verschillende versies, o.a. 5 volt en 3 volt, gebufferd of ongebufferd, SDR SDRAM (168 aansluitingen) of DDR SDRAM (184 aansluitingen). SDR staat voor Single Data Rate en DDR staat voor Dual Data Rate en slaat op het aantal bits dat het geheugen per kloktik kan verwerken. SDRAM staat voor Synchronous Dynamic RAM.
De oorspronkelijke SDR versie werden verkocht in de varianten PC66. PC100 en PC133, waar het getal de doorvoersnelheid van de geheugenbus in MHz aangeeft. Bij de modernere varianten wordt de doorvoersnelheid in (Mega)bytes per seconde weergegeven, omdat de modules per keer 32 bits = 4 bytes kunnen transporteren zijn deze getallen een stuk hoger, bijvoorbeeld PC2100, PC2700 of PC3200 voor resp. een 533, 677 of 800 MHz bus.
De meeste recente AMD en Pentium gebaseerde PC's gebruiken ofwel SDR SDRAM in de goedkopere versies of DDR SDRAM in de high-end modellen, beide op 3,3 volt. Deze laatsten hebben een doorvoersnelheid die twee keer zo hoog ligt als die van SDR SDRAM (vandaar de benaming DDR: Dual Data Rate).

### SDRAM

SDRAM staat voor Synchronous Dynamic Random Access Memory. Deze heeft een volledig andere architectuur dan DRAM en is daarom beduidend sneller. Dit geheugentype is er alleen als 168-polige DIMM module voor systemen met een bussnelheid van 66 MHz, 100 MHz en 133 MHz.

### RIMM

Rambus Inline Memory Module (RIMM) is een geheugensoort voor de computer naast de gangbare DIMM en oudere SIMM. Dit geheugen is echter van het bedrijf Rambus Inc. en is in staat veel hogere datasnelheden te behalen door een hogere bussnelheid (tot wel 1200 MHz). Deze snelheden kunnen oplopen tot 10.8 GB/s als ze in Quad-channel zijn uitgevoerd. Het geheugen op een RIMM noemt men ook wel RDRAM, met daarvoor de aanduiding in wat voor channel-specificatie het is. Dus bijvoorbeeld SDR RDRAM, DDR RDRAM of QDR RDRAM.
Dit geheugen is relatief duur en vereist een speciale chipset. Daardoor wordt het bij de thuis-pc haast nooit toegepast en ziet men het enkel bij high-end workstations en servers.
RIMMs kunnen alleen in paren worden gebruikt, dus twee of vier chips op één moederbord. Alle geheugensloten moeten ook opgevuld worden. De gebruikelijk lege sloten worden dan opgevuld met zogenaamde CRIMMs. Dit zijn als het ware lege RIMMs. CRIMMs zorgen er alleen voor dat de stroompjes worden doorgegeven zodat er een elektronisch circuit ontstaat.

### DDR-SDRAM

DDR staat voor Double Data Rate, en is een techniek die gebruikt wordt in computergeheugens.
Geheugens werken aan een bepaalde frequentie, en gebruiken daarbij een kloksignaal. Bij vroegere geheugens, zoals SD-RAM, kon het geheugen alleen gegevens verwerken als het kloksignaal van een lage spanning naar een hoge spanning ging (de zogenaamde opgaande flank). DDR-geheugens kunnen per kloktik tweemaal zoveel data transporteren, omdat zowel op de op- als neergaande flank van het kloksignaal een bit vervoerd wordt. Door gebruik van DDR-geheugens kan de snelheid van het hele computersysteem aanzienlijk toenemen.
DDR2 is de tweede versie van Double Data Rate SDRAM. Het grootste verschil met DDR-SDRAM is dat er 4 bits tegelijk worden uitgelezen, in plaats van de gebruikelijke 2 bits. Om de aanvoer van de extra bits bij te kunnen houden is de I/O-buffer tweemaal sneller gemaakt. Door dit allemaal is er tweemaal zoveel bandbreedte ten opzichte van DDR-SDRAM. Er worden dus gewoon nog steeds 2 bitjes per kloktik verstuurd, echter de klok is tweemaal sneller.