Back to CSR

IBM PC architektūros trūkumai

arba

Segmentų prakeikimas

Originalus straipnis: https://theworld.com/~swmcd/steven/rants/pc.html

Autorius: Steven W. McDougall

Senovės istorija

1975 m. kompanija „Altair“ išleido į rinką pirmąjį „asmeninį kompiuterį“. Tai buvo tikras kompiuteris, kurį buvo galima įsigyti surinkimo rinkiniu už 400 dolerių. Įvestis buvo atliekama per priekinio skydelio perjungiamuosius jungiklius, o išvestis – per priekinio skydelio šviesos diodus (įjungimo/išjungimo, ne 7-segmentinius). Jo rinka buvo daugiausia mėgėjai ir hakeriai. 70-ųjų pabaigoje asmeninius kompiuterius siūlė daugelis gamintojų, pavyzdžiui, „Tandy“, „Commodore“, „TI“ ir „Apple“. Skirtingų gamintojų kompiuteriai nebuvo suderinami. Kiekvienas gamintojas turėjo savo architektūrą, savo operacinę sistemą, savo magistralės sąsają ir savo programinę įrangą. Įsigydami kompiuterį, jūs netiesiogiai prisiimdavote didelį įsipareigojimą laikytis to gamintojo standartų.

6502

1980 m. pažangiausią architektūrą iliustravo „Commodore 6502“. 6502 yra vieno lusto mikroprocesorius, turintis 8/16 architektūrą, t. y. 8 bitų duomenų magistralę ir 16 bitų adresų magistralę. Programavimo modelis atspindi aparatinės įrangos architektūrą: registrai, kuriuose saugomi duomenų reikšmės, pvz., akumuliatorius, yra 8 bitų, o registrai, kuriuose saugomi adresai, pvz., programos skaitiklis, yra 16 bitų. 16 bitų adresų magistralė suteikia 64K baitų adresų erdvę. Iki 80-ųjų pradžios 64K DRAM atmintys buvo plačiai prieinamos, o 6502 pagrindu sukurti kompiuteriai, tokie kaip „Commodore 64“ ir „Apple ][“, buvo tiekiami su pilnu 64K baitų RAM komplektu. 1980 m. „IBM“ nusprendė įžengti į asmeninių kompiuterių rinką. Jie teisingai suprato, kad nesibaigiantis DRAM kainų kritimas netrukus padarys 8/16 architektūrą pasenusia. Kitas logiškas žingsnis būtų buvęs, tarkime, 16/32 architektūra, pavyzdžiui, „Motorola 68000“. 16/32 architektūra būtų pagerinusi našumą dvigubai padidinusi atminties pralaidumą ir suteikusi 4 GB adresų erdvę – pakankamą artimiausioje ateityje.

Deja, 1980 m. 68000 procesoriaus dar nebuvo rinkoje, kaip ir jokių kitų vieno lusto mikroprocesorių su 16/32 architektūra. Problema ta, kad lusto dydis tiesiogiai priklauso nuo registrų pločio. Pereinant nuo 8/16 prie 16/32, visi registrai tampa dvigubai didesni, visi duomenų keliai tampa dvigubai platesni, ALU sudėties grandinės pernešimo grandinė tampa dvigubai ilgesnė – visas projektas padvigubėja. O 1980 m. gamybos technologijos tiesiog nebuvo pasiekusios tokio lygio, kad vieno lusto 16/32 mikroprocesorių būtų galima pagaminti už rinkai priimtiną kainą.

8086

Tuomet buvo prieinamas „Intel 8086“. 8086 buvo netinkamai suplanuotas bandymas suteikti didesnę nei 64 KB adresų erdvę, išvengiant didesnės architektūros sąnaudų. 8086 iš esmės yra 16/16 architektūra. Jis turi 16 bitų programos skaitiklį, 16 bitų ALU, keturis 16 bitų bendrosios paskirties registrus ir keletą 16 bitų indeksų registrų. Jis taip pat turi keturis 16 bitų segmentų registrus. 8086 atlieka visus skaičiavimus ir duomenų perdavimą 16 bitų aritmetika, su viena išimtimi. Prieš perduodamas adresą į išorinę adresų magistralę, 8086 pasirenka vieną iš segmentų registrų, perkelia jį 4 bitus į kairę ir prideda adresą, naudodamas 20 bitų aritmetiką. Todėl išorinis adresas yra 20 bitų, o procesoriaus adresų erdvė yra 1 MB. Keturi segmentų registrai apibrėžia keturis segmentus:

CS

kodo segmentas

DS

duomenų segmentas

SS

steko segmentas

ES

papildomas segmentas

Dauguma operacijų automatiškai naudoja tinkamą segmento registrą: komandų paėmimui naudojamas CS, įkėlimui ir iškėlimui – DS, o įdėjimui ir išėmimui – SS. Kelios operacijos, pavyzdžiui, blokų perkėlimas, naudoja tiek DS, tiek ES – vieną šaltiniui, kitą – paskirties vietai.

„Intel“ dokumentacijoje ši architektūra apibūdinama kaip patogumas programuotojams: štai jūsų kodas, štai jūsų duomenys, kiekvienas tvarkingai saugomas savo segmente. Kompiuterių mokslų studentai taip pat mėgsta segmentuotas architektūras dėl įvairių priežasčių, susijusių su OS dizainu.

Tačiau iš tikrųjų programuoti šią mašiną yra košmaras. Jūs niekada negalite tiesiog kreiptis į bet ką. Pirmiausia turite įsitikinti, kad segmentinis registras yra nustatytas tam, o tada turite sukurti adresą kaip poslinkį į tą segmentą. Segmentų registras gali nurodyti bet kurią vietą visoje 1 MB adresų erdvėje, bet, kai jis nustatytas, jis suteikia prieigą tik prie 64 KB segmento. Jei turite daugiau nei 64 KB kodo ar duomenų, turite iškart perkrauti segmentų registrus. Ypatinga problema yra ta, kad nėra gero būdo indeksuoti masyvą, kuris yra didesnis nei 64 KB.

„IBM“ ir klonai

Įprastomis aplinkybėmis tokia sudėtinga ir trūkumų kupina konstrukcija kaip 8086 būtų tiesiog ignoruota rinkos ir palaipsniui išnykusi. Tačiau 1980-ieji buvo „Intel“ sėkmės metai. „IBM“ pasirinko 8086 kaip asmeninio kompiuterio procesorių. Remiamas IBM rinkodaros galia ir žinomumu, IBM asmeninis kompiuteris greitai užkariavo didžiąją rinkos dalį. Kiti gamintojai arba pasitraukė iš asmeninių kompiuterių rinkos (TI), arba siekė nišinių rinkų (Commodore, Apple), arba atsisakė savo architektūros IBM naudai (Tandy). Turėdamas beveik 90 % rinkos dalies, asmeninis kompiuteris tapo de facto standartu. Programinės įrangos kūrėjai rašė operacines sistemas (MicroSoft DOS, Digital Research DOS), skaičiuokles (Lotus 123), tekstų tvarkyklės (WordPerfect, WordStar) ir kompiliatorius (MicroSoft C, Borland C), kurie veikė asmeniniame kompiuteryje. Aparatūros gamintojai gamino diskų įrenginius, spausdintuvus ir duomenų surinkimo sistemas, kurios jungėsi prie asmeninio kompiuterio išorinės magistralės.

Nors iš pradžių IBM užkariavo asmeninių kompiuterių rinką, vėliau ją prarado klonų gamintojams. Įpratusi būti vienintele didžiųjų kompiuterių tiekėja, IBM nebuvo pasirengusi įnirtingai konkurencijai, kuri kilo, kai „Compaq“, „Leading Edge“, „AT&T“, „Dell“, „ALR“, „AST“, „Ampro“, „Diversified Technologies“ ir kitos įmonės ėmė varžytis dėl asmeninių kompiuterių rinkos dalies. Be žemų kainų ir aukštos kokybės, klonų gamintojai asmeninių kompiuterių rinkai suteikė dar vieną labai svarbų dalyką: absoliutų aparatinės įrangos standartą. Norėdamas parduoti asmeninio kompiuterio kloną, gamintojas turėjo garantuoti, kad jis paleis visą kliento turimą programinę įrangą ir veiks su visais kliento turimais išoriniais įrenginiais. Vienintelis būdas tai padaryti buvo suprojektuoti kloną taip, kad jis būtų identiškas originaliam „IBM PC“ registrų lygiu. Taigi, „IBM PC“ apibrėžtas standartas tapo nekeičiamas, nes dešimtys klonų gamintojų išleido milijonus kompiuterių, kurie atitiko jį iki smulkiausių detalių. Ši standartizacija buvo svarbus veiksnys, lėmęs žemą PC sistemų kainą ir plačią prieinamumą. Ji taip pat buvo rimta kliūtis bandant peržengti PC architektūros ribas.

Adresų erdvės problemos

Procesorius 8086 suteikia kompiuteriui 1 MB adresų erdvę. Ji patogiai pateikiama kaip šešiolika nesusijusių 64 KB segmentų, paskirstytų taip:

Segmentas

Paskirtis

0-9

RAM

A-B

vaizdo RAM

C-D

ROM įvesties/išvesties plokštėse

E-F

ROM BIOS (operacinės sistemos kodas)

Kadangi RAM leidžiama skirti 10 segmentų, kompiuteris gali adresuoti iki 640 KB pagrindinės atminties. Erdvė tarp 640 KB ir 1 MB yra rezervuota aparatinei įrangai ir operacinei sistemai. Iki 80-ųjų vidurio ši architektūra tapo pasenusi. Buvo prieinami 256 KB ir 1 MB DRAM lustai; vartotojai pirkdavo kompiuterius su pilnu 640 KB RAM komplektu ir norėjo daugiau. Deja, kaip matyti iš aukščiau pateiktos lentelės, kompiuteryje nebėra vietos įdėti daugiau atminties.

Vienas iš sprendimų buvo bankų atrankos atminties sistemos. Gamintojas suprojektuodavo atminties plokštę, pridėdavo keletą bankų atrankos registrų ir atrinktus atminties blokus susiedavo su kompiuterio adresų erdve, paprastai adresu C0000. Naudojant bankų atrankos sistemą, programuotojas yra atsakingas už bankų atrankos registrų valdymą ir duomenų paskirstymo tarp bankų sekimą. Šiandien bankų pasirinkimo sistemos paprastai atitinka „Lotus/Intel/MicroSoft“ išplėstos atminties specifikaciją (LIM-EMS). Šiame kontekste žodis „išplėsta“ konkrečiai reiškia bankų pasirinkimo sistemą.

Išplėstoji atmintis neabejotinai leido kelioms programoms naudoti daugiau nei 640K RAM, tačiau ji aiškiai yra nepakankama kaip ilgalaikis sprendimas didesnio atminties poreikiui patenkinti. Vienintelis tikras sprendimas yra pereiti prie didesnės architektūros. „Intel“ žengė pirmą žingsnį, pristatydama 80286 procesorių.

80286

80286 savo koncepcija panašus į 8086. Tai 16/24 architektūra. Duomenų magistralės ir registrai yra 16 bitų. Išorinė adresų magistralė yra 24 bitų, užtikrinanti 16 MB adresų erdvę. Adresai nurodomi naudojant 16 bitų segmento selektorių ir 16 bitų poslinkį. Segmentų selektorius nurodo atmintyje esantį segmento deskriptorių. Segmento deskriptorius turi 24 bitų segmento bazę, 16 bitų segmento dydį ir keletą atributų bitų. Norint sugeneruoti adresą, 16 bitų segmento poslinkis pridedamas prie 24 bitų segmento bazinio adreso naudojant 24 bitų aritmetiką, o tada perduodamas į išorinę adresų magistralę. 80286 suteikia programuotojui 16 MB adresų erdvę. Tačiau jį vis dar varžo būtinybė manipuliuoti segmentų registrais ir tai, kad kiekvienas segmentas yra ribotas iki 64 KB, kaip ir 8086. Dar svarbiau, kad 80286 yra ribojamas būtinybės išlikti suderinamu su PC.

„Intel“ žinojo, kad naujo procesoriaus nepavyks parduoti, jei jis negalės paleisti esamų kompiuterio programų. Todėl jie sukūrė procesorių 80286 su dviem skirtingais vykdymo režimais: realiuoju režimu ir apsaugotuoju režimu. Apsaugotasis režimas – tai ką tik aprašyta 16/24 architektūra. Realusis režimas yra tiksli 8086 16/16 architektūros emuliacija. Realusis režimas kartais vadinamas DOS režimu. Kai 80286 įjungiamas, jis paleidžiamas realiajame režime. Tai leidžia jam veikti kaip procesoriui IBM PC klone. Naudojamas tokiu būdu, 80286 užtikrina našumo padidėjimą dėl greitesnių taktų dažnių ir 16 bitų duomenų magistralių. Tačiau programuotojas vis dar yra ribojamas PC architektūros, turinčios 1 MB adresų erdvės ir 640 KB RAM apribojimą. Kadangi DOS ir PC programos neveikia 80286 procesoriuje apsaugotame režime, dauguma 80286 procesorių veikia realiame režime.

Išplėstinės atminties beprotybė

Šiandien dauguma 80286 procesorių turinčių kompiuterių parduodami su keliais megabaitais RAM. Kadangi 80286 procesorius turi 16 MB adresų erdvę, ši atmintis adresuojama linijiniu būdu – nereikia jokios bankų pasirinkimo aparatūros. Apsaugotajame režime galima naudoti visą atmintį. Realiajame režime, kaip ir standartinėje PC architektūroje, prieinami pirmieji 640 KB atminties, o likusi dalis – ne. Atmintis, prie kurios negalima prieiti, nes ji viršija 640 KB ribą, nustatytą originalioje kompiuterio architektūroje, vadinama išplėstine atmintimi – jos nereikia painioti su padidinta atmintimi. Dažniausiai išplėstinė atmintis naudojama DOS sistemai sukurti RAM diską. Kai programa nori pasiekti duomenis, saugomus RAM diske, ji nustato režimo bitą, kuris perjungia 80286 procesorių į apsaugotąjį režimą. Tai suteikia jai prieigą prie išplėstinės atminties. Tada programa atlieka norimą duomenų perdavimą tarp savo atminties erdvės ir RAM disko išplėstojoje atmintyje. Nėra jokio būdo grįžti iš apsaugotojo režimo į realųjį režimą, todėl programa turi išsaugoti savo būseną ir iš naujo paleisti procesorių. Perkrovus kompiuterį, procesorius atnaujina pradinės programos vykdymą realiajame režime. Praktikoje visa tai tvarko RAM disko įrenginio tvarkyklė, pvz., RAMDRIVE.SYS.

„Intel“ siekė, kad procesorius 80286 taptų pagrindu tolesnei asmeninių kompiuterių sistemų plėtrai. Visų pirma, kompanija tikėjosi, kad jo suderinamumo su DOS režimas padės jam įsitvirtinti rinkoje, o kai 80286 procesorių bus įdiegta pakankamai daug, programinės įrangos kūrėjai pradės kurti operacines sistemas ir programas, išnaudojančias apsaugotojo režimo galimybes. Tačiau iš tikrųjų PC klonų gamintojai jį naudojo kaip aukštos našumo 8086 procesorių, vartotojai jį naudojo beveik išimtinai realiame režime, o programinės įrangos kūrėjai vengė sudėtingos ir ribotos apsaugotojo režimo segmentuotos architektūros.

80386

Kitas „Intel“ produktas buvo 80386. Kaip ir 80286, 80386 turi segmentinę architektūrą, ir, kaip ir 80286, turi du vykdymo režimus: realųjį ir apsaugotąjį. Apsaugotajame režime 80386 yra 32/32 architektūros. Segmentavimo schema yra dar sudėtingesnė nei 80286, todėl detalių jums nepateiksiu. Tačiau ji leidžia 32 bitų segmentų poslinkius, todėl vienas segmentas gali būti iki 4 GB dydžio. Tai leidžia programuotojui apibrėžti vieną segmentą, apimantį visą turimą atmintį, vietoj to, kad nuolat reikėtų žongliruoti 64 KB segmentų rinkiniu. Tai taip pat leidžia indeksuoti masyvus, kurie yra didesni nei 64K baitų.

Realiojo režimo metu 80386 užtikrina tikslią 8086 16/16 architektūros emuliaciją.

Deja, 80386 galimybės yra naudojamos šiek tiek daugiau nei 80286. DOS ir PC programos neveikia 80386 procesoriuje apsaugotame režime, todėl dauguma 80386 procesorių veikia realiame režime. Mano dabartinio kompiuterio procesorius veikia realiame režime. Jis suteikia prieigą prie 640K baitų pagrindinės atminties ir 3456K baitų RAM disko, iš viso 4M baitų įdiegtos RAM.

Atminties modeliai

Patinka tai ar ne, pasaulyje yra milijonai asmeninių kompiuterių, ir mes turime juos programuoti – realiajame režime. „Microsoft C“ siūlo gausias galimybes, leidžiančias iš blogos situacijos išspausti maksimumą. Viena iš problemų yra tai, ar adresai yra 16 bitų, ar 32 bitų. 16 bitų adresas suteikia poslinkį į vieną segmentą. Segmento registras jau turi būti įkeltas su atitinkamu baziniu adresu. 32 bitų adresas suteikia tiek segmento bazinį adresą, tiek poslinkį į tą segmentą. Prieinant prie atminties per 32 bitų adresą, programa pirmiausia įkelia segmento registrą iš viršutinių 16 adreso bitų, o tada naudoja apatinius 16 adreso bitų kaip poslinkį į tą segmentą. 32 bitų adresai reikalauja daugiau atminties ir daugiau procesoriaus ciklų, tačiau jie suteikia prieigą prie visos 8086 procesoriaus 1 MB adresų erdvės.

Jei programos duomenų kiekis yra mažesnis nei 64 KB, ji gali visus savo duomenis talpinti viename duomenų segmente ir naudoti 16 bitų adresus, kad prie jų prieitų. Panašiai, jei programos kodo kiekis yra mažesnis nei 64 KB, ji gali visą savo kodą talpinti viename kodo segmente ir naudoti 16 bitų adresus šuoliams bei subrutinų iškvietimams. Atvirkščiai, jei kodas ar duomenys netelpa į šias ribas, programa turi naudoti 32 bitų adresus. „Microsoft C“ numato visas keturias galimybes per atminties modelių rinkinį:

Atminties modelis

Duomenų adresai

Kodo adresai

Labai mažas

16 bitų

16 bitų

Mažas

16 bitų

16 bitų

Kompaktiškas

32 bitų

16 bitų

Vidutinis

16 bitų

32 bitų

Didelis

32 bitų

32 bitų

Labai didelis

32 bitų

32 bitų

„Labai mažas“ atminties modelis yra toks pat kaip „Mažas“ modelis, išskyrus tai, kad kodo ir duomenų segmentų bendras dydis neturi viršyti 64K baitų. Be to, „Labai mažas“ modelis sukuria .COM failą vietoj .EXE failo. .COM failai yra šiek tiek mažesni ir įkeliami šiek tiek greičiau DOS aplinkoje.

„Labai didelis“ atminties modelis yra toks pat kaip „Didelis“ atminties modelis, išskyrus tai, kad atskirų masyvų dydis gali viršyti 64K baitų. Tačiau adresai vis tiek saugomi kaip segmentų ir poslinkių poros, o kompiliatorius atsisako atlikti visą 32 bitų adresų aritmetiką su jais. Dėl to „Labai didelis“ masyvams taikomas apribojimas, kad masyvo elemento dydis turi būti 2 laipsnio.

Atminties modelio pasirinkimas yra kompiliavimo metu nustatoma parinktis, todėl galite lengvai eksperimentuoti su skirtingais modeliais.

Pastabos

netinkamai sugalvota, iškreipta ir netobula Mano nuomone 8086 IBM PC kompiuteryje iš tikrųjų buvo naudojamas 8088 procesorius, o ne 8086. 8088 viduje yra toks pat kaip 8086, tačiau turi 8 bitų išorinę duomenų magistralę. Tai leidžia sumažinti sistemos kainą, tačiau sumažėja atminties pralaidumas. išplėsta Įsivaizduokite akordeoną, kurio dumplės išsiskleidžia už klaviatūros. 80286 Yra ir 80186 procesorius. Iš esmės tai yra 8086 su laikrodžiais, pertraukimų valdikliais ir kitomis pagalbinėmis grandinėmis, integruotomis į vieną lustą. Jis daugiausia naudojamas kaip įterptinis procesorius pramoninės kontrolės įrangoje. išplėstas Įsivaizduokite bokštą, kurio papildomi aukštai vis aukščiau ir aukščiau. atstatyti procesorių Aš to neišsigalvojau.