1. ACPI exista doar pe unele sisteme, nu pe toate.
2. ACPI nu are treaba cu SPD din memorii.
3. Reserved memory list e citita de Windows din BIOS, altfel ar scrie din nimereala direct in memory mapped devices. Se pot remapa unele resurse (Plug'n Play), numai sub 4 GB (limita e data de specificatiile PCI, mostenite parca si de PCIe). Computerele care vad peste 4 GB de RAM in Windows au de obicei au memoria neutilizabila intre 3 si 4 GB remapata peste 4 GB, nu memory mapped devices remapate peste 4 GB (desi se poate face si asta).
1. De la epoca Pentium_III_pe_socket incoace, TOATE au ACPI. Bine, excludem serverele cu EFI si alte ciudatenii, desi s-ar putea sa aiba si alea!
2. Nici n-am zis ca are.
3a. Nu exista memory mapped devices altele decat cele standard (VGA, porturi seriale, paralele, un vector spre tabelele ACPI/PnP, shadow ROM) si cele ale placilor ISA non-PnP. Toate astea se afla in spatiul 640 KB - 1 MB. Peste 1 MB TOTUL e liber fiindca restul adreselor nu apar decat atunci cand placile PnP sunt initializate de driver. BTW, nici nu poti accesa >1 MB fara sa treci din modul real (BIOS) in modul protejat (HIMEM.SYS) sau V86 (EMM386.EXE, respectiv memory managerul windows-ului)!
Deci, ca sa fie clar:
Imediat dupa POST, nu exista nici o adresa >1 MB utilizabila, cu atat mai putin ocupata. Odata ce ai incarcat un driver, apare maparea adreselor catre hardware.
Windows 2000 si mai nou NU citeste BIOS-ul! Citeste din ACPI lista device-urilor placii de baza, apoi prin PnP, lista cu resursele necesare placilor de extensie. ISA PnP acceptau 2-3 variante de configurare. Placile PCI accepta orice adrese/porturi/IRQ-uri le-ai da.
BTW, ca tot veni vorba de IRQ. Window-ul initializeaza si foloseste APIC-ul pentru intreruperi (32 IRQ-uri disponibile), nu IRQ-urile scanate de BIOS (16 toate, din care vreo 8 sunt fixe).
3b. La maparea memoriei ai facut o varza intre memoria reala si memoria virtuala.
Memoria neutilizabila reala este cea mapata catre hardware. Degeaba pui un modul de memorie pentru intervalul 3.5 - 4 GB daca toate adresele alea duc catre memoria placii grafice spre exemplu.
Cand ai un sistem de operare 64bit, ai obligatoriu si drivere 64bit cu care poti aloca memorie oriunde.
Exista un hack prin care poti activa PAE pe Win2003 32bit (M$ crippleware) si implicit ai acces la 16GB RAM (procesoarele 32bit au adrese pe 36biti), dar driverele fiind 32bit, ma indoiesc ca exista vreo metoda de a le muta dincolo de 4GB astfel incat sa nu mai blocheze memoria reala instalata.
Acum, in ce priveste memoria virtuala, orice program are acces la 4 GB de memorie, indiferent cata memorie ai in calc si indiferent cate alte programe sunt pornite in acelasi timp. De aia se numeste virtuala.
Dar, cu exceptia catorva programe mai speciale (IIS spre exemplu), toate pot aloca maxim 3 GB, restul pana la 4 GB fiind memorie shared. Adresele alea "shared" sunt pentru comunicarea cu Windows si cu driverele. In Win9x se putea comunica si direct cu hardware-ul, dar ghinion, WinNT nu mai da voie.
Nu-mi este clar daca in WinNT intervalul 0 - 1 MB mai este mapat catre memoria reala (adica memoria conventionala + porturile firmware-ului) ca in Win9x sau nu. Accesul la porturi si intreruperi fiind oricum interzis.
BIOS blocheaza memoria RAM care se suprapune peste memory mapped IO intr-un mod nu prea eficient,iar cel mai simplu mod de a evita complet complexitatea programarii este sa dezactiveze din start ultimul GB - de ce sa te chinui sa remapezi eficient o duzina de devices ca sa lasi 3.7 GB utilizabil (maximul vazut de mine vreodata) cand poti sa tai un GB (ca RAM-ul e ieftin) si asta e, userul nu o sa planga. Cu un update de BIOS poti sa schimbi comportamentul asta aberant cu unul mai eficient si nu tai la gramada, ci doar zone folosite (si nici alea prea bine, ca un device care foloseste 4 kb poate bloca 16 MB say 64 MB (ca sa faci o harta detaliata la nivelul de kilobit ai nevoie de o gramada de memorie doar pentru descrierea si managementul ei; iar memoria aia nu e in RAM, e in chipset, adica e foarte limitata).
BIOS-ul nu blocheaza nimic! Unde te crezi? In puscaria aia de Windows??

Faci confuzie intre porturi si memorie mapata catre hardware. Si portul este tot un interval de adrese, dar nu-i acelasi lucru cu memoria mapata.
1) BIOS-ul aloca porturi dar NU mapeaza memorie. ROM-urile sunt in mod normal accesate printr-un port (o adresa de memorie care duce cate placa care are cipul pe ea). Toata memoria alocata de BIOS este in intervalul 640 KB - 1 MB, iar acolo nu pot exista decat porturi, majoritatea la adrese standard, si shadow ROM - o copie a ROM-urilor pentru acces mai rapid la ele. Shadow ROM nu este memorie mapata. Este memorie fizica alocata, scrisa si ocupata.
2) Intervalul 3 - 4 GB nu este "marcat" ocupat de BIOS. BIOS-ul nici nu poate adresa zona aia din moment ce ruleaza in modul real. (De fapt, poate, printr-un bug al 486-urilor care din motive de compatibilitate a fost declarat "feature", dar asta e alta discutie.) Chestia e ca odata ce ai trecut de POST, nu exista nimic peste 1 MB pana nu treci macar in modul protejat.
3) Toata maparea memoriei o fac driverii. In Win9x poti chiar sa schimbi adresele. Le poti pune cam oriunde, ca memoria virtuala alocata de programe oricum n-are nici o treaba cu adresele fizice alocate de driveri.
4) Ce ai explicat tu cu upate-ul de BIOS este adevarat dar din alt motiv decat cel dat de tine. Alocarea memoriei pentru placile PCI o face driverul, dar nu oricum, ci dupa o "harta". "Harta" respectiva este data de PCI Miniport Driver (sau cum s-o numi el in WinNT), care obtine o lista a necesitatilor de memorie a hardware-ului prin diverse metode. La Win9x adresele puteau fi luate din mai multe surse si utilizatorul putea alege ce stia el ca-i mai bun:
- Lista de la Microsoft sau producatorul placii de baza. PCI Miniport Data se numea lista. MINI.PCI cred ca se numea fisierul,
- Tabelele ACPI,
- Tabelele APM + PCI PnP,
- Interogat BIOS-ul prin intreruperile lui.
Mai nou, totul se face prin ACPI. Desi ACPI-ul este o functie a chipsetului, tabelele ACPI sunt stocate in ROM-ul BIOS-ului. Ele sunt gata construite, nu le face BIOS-ul pe loc la bootare. De aia un update de BIOS poate duce la alta mapare a memoriei.
Tabelele ACPI aloca resursele pentru componentele placii de baza a calculatorului: chipset, APIC, power management, USB, etc. Resursele pentru placile de extensie sunt negociate prin PnP.
Uite, ca demonstratie, iti lista continutului BIOS-ului placii mele. Poti observa in lista, pe langa codul BIOS executabil, cateva ROM-uri (managerele RAID-urilor, ROM-ul placii de retea, etc.), utilitarul integrat de flashuit BIOS-ul si
tabelele ACPI.
Iti mai atasez si continutul efectiv al tabelelor ACPI sa vezi cam despre ce e vorba in ele, desi nu prea ai ce citi.