# Segmentació de memòria X86

La segmentació de memòria x86 fa referència a la implementació de la segmentació de memòria a l'arquitectura del conjunt d'instruccions de l'ordinador Intel x86. La segmentació es va introduir a l'Intel 8086 el 1978 com una manera de permetre que els programes abordessin més de 64 KB (65.536 bytes) de memòria. L'Intel 80286 va introduir una segona versió de segmentació el 1982 que va afegir suport per a la memòria virtual i la protecció de la memòria. En aquest punt, el mode original va ser rebatejat com a mode real, i la nova versió va rebre el nom de mode protegit. L'arquitectura x86-64, introduïda el 2003, ha disminuït en gran manera el suport per a la segmentació en mode de 64 bits.
Tant en mode real com en mode protegit, el sistema utilitza registres de segment de 16 bits per obtenir l'adreça de memòria real. En mode real, els registres CS, DS, SS i ES apunten al segment de codi de programa (CS) utilitzat actualment, al segment de dades actual (DS), al segment de pila actual (SS) i a un segment addicional determinat pel programador. (ES). L'Intel 80386, introduït el 1985, afegeix dos registres de segment addicionals, FS i GS, sense cap ús específic definit pel maquinari. La manera en què s'utilitzen els registres de segment difereix entre els dos modes.
L'elecció del segment és normalment predeterminada pel processador segons la funció que s'està executant. Les instruccions sempre s'obtenen del segment de codi. Qualsevol push o pop de la pila o qualsevol referència de dades que faci referència a la pila utilitza el segment de pila. Totes les altres referències a dades utilitzen el segment de dades. El segment addicional és la destinació predeterminada per a les operacions de cadena (per exemple, MOVS o CMPS). FS i GS no tenen usos assignats pel maquinari. El format d'instrucció permet un byte de prefix de segment opcional que es pot utilitzar per anul·lar el segment predeterminat per a les instruccions seleccionades si es desitja.

## Mode real

En mode real o en mode V86, la mida d'un segment pot variar des d'1 byte fins a 65.536 bytes (utilitzant desplaçaments de 16 bits).
El selector de segment de 16 bits del registre de segment s'interpreta com els 16 bits més significatius d'una adreça lineal de 20 bits, anomenada adreça de segment, dels quals els quatre bits menys significatius restants són tots zeros. L'adreça del segment sempre s'afegeix a un desplaçament de 16 bits a la instrucció per obtenir una adreça lineal, que és la mateixa que l'adreça física en aquest mode. Per exemple, l'adreça segmentada 06EFh:1234h (aquí el sufix "h" significa hexadecimal) té un selector de segment de 06EFh, que representa una adreça de segment de 06EF0h, a la qual s'afegeix el desplaçament, donant lloc a l'adreça lineal 06EF0h + 1234 h = 08124 h.
| 0000 0110 1110 1111 0000 | Segment | 16 bits, desplaçat 4 bits cap a l'esquerra (o multiplicat per 0x10) |
| + 0001 0010 0011 0100 | Offset | 16 bits |
| 0000 1000 0001 0010 0100 | adreça | 20 bits |
A causa de la manera com s'afegeixen l'adreça del segment i el desplaçament, una única adreça lineal es pot assignar fins a 2 $^{12}$ = 4096 parells segment:desplaçament diferents. Per exemple, l'adreça lineal 08124h pot tenir les adreces segmentades 06EFh:1234h, 0812h:0004h, 0000h:8124h, etc.
Això podria ser confús per als programadors acostumats a esquemes d'adreçament únics, però també es pot utilitzar amb avantatge, per exemple, quan s'aborden diverses estructures de dades imbricades. Mentre que els segments en mode real sempre són 64 KB llarg, l'efecte pràctic és només que cap segment pot ser més llarg de 64 KB, en lloc d'això, cada segment ha de tenir 64 KB llarg. Com que no hi ha protecció ni limitació de privilegis en mode real, fins i tot si un segment es podria definir com a menor de 64 KB, encara depèn totalment dels programes de coordinar-se i mantenir-se dins dels límits dels seus segments, ja que qualsevol programa sempre pot accedir a qualsevol memòria (ja que pot configurar arbitràriament els selectors de segments per canviar les adreces dels segments sense absolutament cap supervisió). Per tant, el mode real també es pot imaginar com tenir una longitud variable per a cada segment, en el rang d'1 a 65.536 bytes, que simplement no és imposada per la CPU.

## Mode protegit

El mode protegit del 80286 amplia l'espai d'adreces del processador a 2 $^{24}$ bytes (16 megabytes), però no ajustant el valor de canvi. En canvi, els registres de segment de 16 bits ara contenen un índex en una taula de descriptors de segment que conté adreces base de 24 bits a les quals s'afegeix el desplaçament. Per donar suport al programari antic, el processador s'inicia en "mode real", un mode en el qual utilitza el model d'adreçament segmentat del 8086. Tanmateix, hi ha una petita diferència: l'adreça física resultant ja no es trunca a 20 bits, de manera que els punters de mode real (però no els punters 8086) ara poden referir-se a adreces entre 100000 $_{16}$ i 10FFEF $_{16}$. Aquesta regió de memòria d'aproximadament 64 kilobytes era coneguda com l'Àrea de Memòria Alta (HMA), i les versions posteriors de DOS podrien utilitzar-la per augmentar la memòria "convencional" disponible (és a dir, dins dels primers MB). Amb l'addició de l'HMA, l'espai d'adreces total és d'aproximadament 1,06 MB. Tot i que el 80286 no trunca les adreces en mode real a 20 bits, un sistema que conté un 80286 pot fer-ho amb maquinari extern al processador, desactivant la línia d'adreces 21, la línia A20. L'IBM PC AT va proporcionar el maquinari per fer-ho (per a una compatibilitat total amb el programari per als models originals d'IBM PC i PC/XT), i així tots els clons posteriors de PC "classe AT" també ho van fer.

## Referències

* ↑ «Mastering x86 Memory Segmentation» (en anglès americà), 13-04-2020. [Consulta: 8 desembre 2023].
* ↑ «Memory Management, Segmentation, and Paging» (en anglès). [Consulta: 8 desembre 2023].
* ↑ Intel Corporation. IA-32 Intel Architecture Software Developer's Manual Volume 1: Basic Architecture (en anglès), 2004.
* ↑ «[https://pdos.csail.mit.edu/6.828/2018/lec/l-x86-prot.pdf x86 segmentation, page tables, and interrupts]» (en anglès). [Consulta: 8 desembre 2023].