Un gran Alojamiento de memoria en sistemas operativos
Enviado por The Str3ak5 • 20 de Enero de 2018 • Documentos de Investigación • 753 Palabras (4 Páginas) • 136 Visitas
Alojamiento de memoria, y memoria en general (parte 1: conceptos):
(06/12/2017)
1: El concepto:
La memoria podría ser considerada la sangre de un ordenador, por esto mismo, el manejo de la memoria primaria del sistema es una tarea fundamental para cualquier kernel. Dar una manera rápida, sencilla y estandarizada de alojar y liberar memoria, por funciones como malloc(memoria) o free(void) es uno de los 3 pilares del desarrollo de un sistema.
[pic 1]
Hay varios tipos de alojamiento que trataremos más adelante, pero de momento, vamos a indagar en qué es la memoria primaria.
2: La memoria primaria:
No creo que sea necesario decir que es la memoria primaria, así que indagaremos en lo que nos importa al desarrollar un SO.
2.1: El mapa de memoria:
La memoria se organiza en un stack que crece hacia arriba.
Cuando el bootloader o proceso X nos da el poder sobre el ordenador, no encontramos la memoria vacía, sino una memoria fragmentada y irregular, sin esquema fijo (esta dependerá del hardware por ejemplo) ya que al que creó la RAM no le apetecía hacernos la vida fácil.
Podemos dividir la memoria en 2 grandes fragmentos que analizaremos:
[pic 2]
- Low memory (Todo lo que hay por debajo de 1 MiB):
Cuando un ordenador típico arranca con una BIOS activa, el ordenador se vuelve medio loco, y los IRQ del sistema (IRQ0) y los que pone el hardware empiezan a spamear (18 veces por segundo).
Esta memoria tiene de tamaño 0x00100000 (1 MiB) y está supuesta a siempre estar presente, excepto alguna que otra sección.
El bootloader toma posesión y luego este nos entrega el mando, dándonos un mapa de memoria parecido al siguiente:
Convenciones:
RAM tipo 0: Totalmente inusable.
RAM tipo 1: Parcialmente inusable para nuestros fines.
RAM tipo 2: Garantizada a estar libre.
RAM tipo 3: Libre si existe.
La memoria baja:
Principio | Fin | Tamaño | Tipo | Descripción |
0x00000000 | 0x000003FF | 1 KiB | RAM tipo 1 | La IVT de real mode |
0x00000400 | 0x000004FF | 256 bytes | RAM tipo 1 | La BDA (mirar siguiente tabla) |
0x00000500 | 0x00007BFF | Casi 30 KiB | RAM tipo 2 | Mem. convencional |
0x00007C00 (usualmente) | 0x00007DFF | 512 bytes | RAM tipo 1 | El boot sector |
0x00007E00 | 0x0007FFFF | 480.5 KiB | RAM tipo 2 | Mem. convencional |
0x00080000 | 0x0009FBFF | Más o menos 120 KiB (depende) | RAM tipo 3 | Mem. convencional |
0x0009FC00 (usualmente) | 0x0009FFFF | 1 KiB | RAM tipo 0 | EBDA (extended BIOS data area) |
0x000A0000 | 0x000FFFFF | 384 KiB | varios, tipo 0 | Video y ROM |
La BDA:
0x0400 (4 words) | Los puertos IO del COM1-COM4 (cada dirección es 1 word, cero si no hay) |
0x0408 (3 words) | Los puertos IO del paralelo LPT1-LPT3 (cada dirección es 1 word, cero si no hay) |
0x040E (word) | La base address de la EBDA >> 4 (normalmente) |
0x0410 (word) | Packed bit flags para detectar hardware |
0x0417 (word) | Flags para el estado del teclado |
0x041E (32 bytes) | El buffer del teclado |
0x0449 (byte) | El Display Mode |
0x044A (word) | Número de columnas en el modo de texto |
0x0463 (2 bytes, taken as a word) | El puerto base IO para el video |
0x046C (word) | número X de veces que ha tocado el IRQ0 (timer) |
0x0475 (byte) | número X de discos duros detectados |
0x0480 (word) | El principio del buffer del teclado |
0x0482 (word) | El final del buffer del teclado |
0x0497 (byte) | El estado del último SHIFT-LED del teclado |
...