Manajemen memori DOS

**Manajemen memori DOS** merupakan mekanisme pengaturan memori pada sistem operasi DOS. Sistem operasi berjalan dalam mode *real* dengan arsitektur berbasis prosesor intel x86. Dalam mode real, hanya 20-bit pertama dari bus alamat yang akan digunakan oleh sistem operasi untuk mengakses memori, sehingga menjadikan jumlah memori yang dapat diakses hanya mencapai 220=1048576 bytes (1 MB) saja, dari yang seharusnya 32-bit/40-bit pada prosesor-prosesor modern.

## Jenis-jenis ruang alamat memori MS-DOS

DOS akan membagi area memori yang hanya 1 MB tersebut menjadi dua buah ruang alamat, yakni sebagai berikut:
* Conventional Memory (memori konvensional)
* Upper Memory, atau Upper Memory Block, atau High Memory

Jika manajer memori diinstalasikan di dalam CONFIG.SYS (sebagai contoh, saat HIMEM.SYS dan EMM386.EXE diinstalasikan), maka jumlah ruang alamat pun dapat bertambah. Selain duajenis di atas, DOS juga menawarkan dua jenis memori lagi, yakni:
* Extended Memory
* Expanded Memory

### Conventional Memory
Ruang alamat ini merupakan ruang alamat yang digunakan oleh program agar dapat dieksekusi. Ukurannya hanya 640 Kilobytes saja, yang diambil dari ruang alamat 1 MB pertama. Semua program komputer yang berjalan (baik itu berjalan di latar depan atau latar belakang) menggunakan ruang area ini.

### Upper Memory
Upper memory adalah ruang alamat yang dapat digunakan untuk tujuan khusus, seperti halnya untuk mengatur memori video. Ukurannya adalah sisa dari 1 MB memori pertama yang tidak digunakan oleh conventional memory, yakni 384 KB.

### Extended Memory
Extended memory adalah memori tambahan setelah 1 Megabyte pertama di mana kombinasi antara upper memory block dan conventional memory berakhir. Pengguna dapat menambahkan banyak memori ke sebuah komputer, tetapi MS-DOS tidak akan menggunakannya, kecuali beberapa program yang didesain agar dapat mengakses ruang alamat Extended memory, seperti Windows.

Extended memory membutuhkan sebuah driver untuk dapat digunakan, yang disebut sebagai *Extended Memory Manager*, seperti halnya HIMEM.SYS. Manajer-manajer memori tersebut akan mengatur ruang alamat memori ini agar dapat digunakan oleh aplikasi yang membutuhkannya, selain tentunya mencegah agar dua aplikasi tidak menggunakan alamat memori yang sama pada satu waktu (yang dapat menyebabkan terjadinya crash/tabrakan antara dua aplikasi).

### Expanded Memory
Expanded Memory merupakan sebuah jenis memori yang, seperti halnya Extended memory, dapat ditambahkan ke dalam komputer IBM PC. Penggunaanya didefinisikan di dalam spesifikasi EMS (Expanded Memory Specification). Perbedaannya terletak pada ukurannya, di mana Expanded Memory dibatasi ukurannya hingga 8 MB saja (spesifikasi EMS versi 3.2) atau 32 MB (Spesifikasi EMS versi 4.0).

Sama seperti halnya Extended memory yang tidak dapat diakses oleh program DOS. Agar dapat diakses, sebuah perangkat mutlak dibutuhkan, yang disebut dengan Expanded Memory Manager seperti halnya EMM386.EXE, yang dapat memetakan beberapa blok (disebut sebagai page) dari expanded memory ke dalam frame yang berada di dalam conventional memory (yang tentunya dapat diakses).

## Bagaimana DOS mengalamati memori
DOS mengalamati memori dengan sebuah cara yang disebut dengan ***segmentation*** (segmentasi). Dalam segmentasi, ruang alamat memori akan dibagi ke dalam beberapa bagian yang disebut dengan ***segmen***. Untuk mengalamati sebuah lokasi yang diperlukan, sebuah program harus menentukan alamat mutlak (*absolute address*) dengan format `xxxx:yyyy` di mana  adalah alamat segmen dan `yyyy` merupakan ***alamat offset*** (ofset merupakan alamat lokasi ke berapa dari segmen tersebut yang dimulai dari permulaan segmen). Kedua bilangan tersebut direpresentasikan dalam bilangan heksadesimal. Nilai *absolute address* dapat dihitung dengan menggunakan perhitungan sederhana: dengan melakukan pemangkatan dengan bilangan 16 (karena memang basis yang digunakan adalah basis 16/heksadesimal) dari segmen dan menjumlahkannya dengan *alamat offset*. Melakukan pemangkatan alamat segmen dapat dengan mudah dilakukan, yaitu dengan menambahkan angka 0 (nol) di samping angka segmen, sehingga yang tadinya hanya berjumlah empat digit akan bernilai lima digit. Hasil dari pemangkatan ini ditambahkan dengan *alamat offset*, dan jadilah alamat mutlak sebuah memori.

Karena dalam *[[real mode]]*, memori komputer hanya dapat diakses hingga 1 MB saja, maka alamat segmen pun dibuat sedemikian rupa. DOS akan membagi 1 MB alamat ke dalam 16 segmen berukuran 65536 bita (64K), yang diberi alamat dari `0x0000` hingga `0x10000`. Memori konvensional dialamatkan oleh DOS pada alamat segmen `0x0000` hingga `0xA000` (10 segmen); Upper memory dialamatkan oleh DOS pada alamat segmen 0xA000 hingga 0x10000 (6 segmen). Beberapa segmen di dalam upper memory dialokasikan untuk beberapa keperluan (tapi tidak harus begitu), yakni segmen `0xA000` dan `0xB000` disediakan untuk *[[memori video|Video Memory]]*; segmen `0xC000` dan `0xD000` dialokasikan untuk pengendali cakram (seperti SCSI) dan beberapa kartu lainnya; sementara segmen `0xE000` dan `0xF000` dialokasikan untuk ROM BIOS. Alokasi segmen-segmen dalam *upper memory* tersebut hanyalah sebuah panduan umum, dan tidak berlaku dalam setiap kasus.

## Pranala luar
* Microsoft support: Overview of Memory-Management Functionality in MS-DOS
* Computer Chronicles (1990). "High Memory Management". From the Internet Archive.