Zkuste si zahrát takový myšlenkový experiment. Máte stroj času a můžete se s ním přenést do minulosti, řekněme mezi roky 1970-1985. Můžete si vybrat libovolný z nich. Úkolem bude založit v USA start-up s tím, že budete mít zajištěnou rozumnou kapitalizaci (ale ne neomezenou). Vašim cílem bude:
* vytvořit takovou počítačovou platformu, která bude
- ve své době úspěšná a pokud možno dominantní
- levná, populární mezi domácími uživateli i v business sféře
- schopná se plynule rozvíjet tak, aby byla schopna přežít a udržet si dominanci do dnešních dnů
- ideálně se dostat do lepšího stavu, než ve kterém jsme dnes
* váš start-up bude bude finančně úspěšný až do dneška a udrží si nad touto platformou dostatečnou kontrolu
Ač budete mít výhodu znalostí člověka z roku 2021 a toho, co fungovalo a co ne, I tak by splnění těchto cílů bylo hodně komplikované. Samozřejmě můžete vycházet pouze z technologií dané doby.
Když si tuhle myšlenkovou hru zahrajete, možná dospějete k závěru, že PC platforma si svoje vítězství nakonec docela zasloužila. Sice nebyla z počátku rozhodně levná a firma, která s ní přišla, z ní nakonec příliš neprofitovala, takže zadání splněno nebylo, ale pro všechny ostatní ten výsledek byl docela příznivý.
To je pravda, ale zase některé věci by v PC nestály nic, kdyby se nad nimi přemýšlelo:
1) barvová paleta v CGA. Ta karta uměla 16 barev, akorát pro grafické režimy vybrali ty nejhorší možné kombinace a navíc zbytečně (stačilo tam nechat LUT z textového režimu a hned by se lépe žilo)
2) nezavádět takovou divnost, jako A20 GATE, která se s námi táhne už těch 40 let (dneska nerelevantní, ale někde v hardware ta emulace pořád je)
3) neudělat botu při výběru dodejce operačního systému (a toto byl skutečně takový typ chyby, která prostě v korporaci dřív či později nastane)
4) toto je spíš na Intel - rozumné přepínání mezi real a protected režimem u 286. jasně, už jsme překonali různé extendery, ale řešení hackem přes reset CPU tedy moc nesvědčí o tom, že při designu domýšleli všechny důsledky
ad 4) tady si dovolím protinázor, tuhle problematiku jsme v té době docela řešili na škole.
Ten princip nebyl špatný, dost připomíná securelevel z *BSD, prvotní myšlenka byla taková, že do protected modu přepínáte proto, aby Vás hlavně chránil a tím pádem naopak byla snaha zabránit se z něj jakkoli dostat.
Trochu problém v tom případe nastal až "díky" DOSu, tak se holt historie vydala jiným směrem a v 386 už Intel přišel jednak s v86 modem na emulaci DOSu (ale, podstatné, se zapnutou pagging unit a na ring3 se všemi veselostmi s iopl a privilegovanými instrukcemi), druhák to už nedám z hlavy, tuším že přes CR0? přímo přepnutí zpátky do reálu.
Původní Windows tomu taky coby nadstavba nad DOSem nepomohly, až tuším W95 pokud měly drivery jako první dokázaly jet bez přepínání zpátky do reálu pod tím, definitivní tečku za tím nesmyslem udělal ale až NT kernel.
Dlužno podotknout že nejen DOS byl veselý, třeba Novell NetWare 2.xx byla taky veselost (byly 2 mody - dedikovaný v protected mode 286, a pak že to běželo vedle DOSu do kterého se to vracelo resetem cpu.
Ostatně i NetWare 3.xx bootoval z DOSu a během inicializace uměl přepnout zpátky do reálu (a silně se doporučovalo hned po inicializaci dát do autoexecu REMOVE DOS, protože samozřejmě ten DOS byl reálný a dokud běžel tak server stál)
jj souhlasím s tím, že teoreticky je to správná cesta (asi jste taky probírali Popek-Goldberg teorém?). Prostě mít real mód jen na boot a potom ihned přepnutí do protected s tím, že vracet se nemá význam. Jenže je tam právě ten DOS a nános starých aplikací, které bylo zapotřebí podporovat a ideálně ostatním nabídnout o něco víc, než 640 kB RAM :-)
Ono se to nakonec díky nalezení toho triku s resetem dalo nějak dohromady, ale prostě praxe s 286 nebyla tak dobrá; z toho čipu by se dalo vytáhnout víc.
Někdo to shrnul tak, že ideálně žádná 286 neměla vzniknout a mělo se přejít přímo na 386, jenže to je ten zpětný pohled, který nefunguje... :-)
Ja som sa nad tym nedavno zamyslal a ta 286tka je v podstate taky proto mikrokontroller s MPU. Niekde na urovni dnesnych Cortex-M, ale trocha roztahanejsia. Az 386tka tomu dala poriadnu MMU. Tam si ale Intel usekol (IMO) botu, ze dovolil beztrestne kombinovat paging so segmentaciou. Ta segmentacia bola celkom vtipne a povedzme, ze na svoju dobu aj genialne riesenie manazmentu pamate, ale tipol by som si, ze so strankovanim to vsetkym zucastnenym dnes len robi vrasky na cele a pridava jeden dalsi level, ktory sa musi tolerovat, aj ked sa v reale prakticky vobec nepouziva.
Vubec nechapu proc se segmentace do x86_64 dostala (fs,gs), kdyz to slo snadno resit jako ve svete ARMu ze thread- a process- infobloky se daji strcit do nejakeho MSR. Prijde mi to ... no nevim jak to nazvat proc si bordelit ISA nejakymi FS:, GS:, GDT, LDT kdyz se to realne k nicemu smysluplnemu dneska uz nepouziva. Nebo ano ?
Intel při přechodu na 32 bity původně využil dvě ze čtyř zbývajících neobsazených pozic ve tříbitovém zakódování čísla segmentového registru. Když se AMD rozhodlo ponechat FS a GS ve své architektuře AMD64 pro účely ukazatele na Thread Information Block a Thread LocalStorage, Intel to pak od nich rychle zkopíroval kvůli kompatibilitě.
Takže oba segmentové registry se i dnes využívají v 64bitových Windows i Linuxu.
Podrobně je to rozebráno na Stack Overflow.
Kdysi jsem cetl nejaky clanek, kde to pekne rozebirali.
Kdyz u Intelu vznikala 8086, bylo jasne, ze krome dvojnasobne datove sbernice se adresova sbernice musi take o nekolik bitu z mnoha duvodu zvetsit oproti 8bitovym CPU (vic pameti kvuli code density, moznosti prepinani mezi "aplikacemi" v RAM, podpora nejakeho budouciho OS, inovace proti 8-bitum,...).
Udelat vsechny registry treba 24bitove (cokoliv jineho nez n*8 bylo ihned zavrhnuto), byl neprekrocitelny rubikon (cena, spotreba, rychlost,...; uz tech 16 bitu bylo na ALU dost ambicioznich - treba MUL/DIV instrukce byly "must have"). Udelat pouze "adresovaci" registry 24bitove (vedelo se, ze Motorola neco takoveho "pece") narazelo na problemy pri presunech 16bit univ. reg.. <-> 24bit "adr." reg., nutnosti jinych instrukci pro MOV reg, imm/mem atd. Smysl samozrejme davalo rozdelit adr. registry na dve casti, Hi & Lo, kde Lo bude mit sirku univ. registru (16 bitu) a Hi taktez, nebo klidne mene (32bit. adresaci stejne nepotrebujeme). Proste klasicke neprekryvajici se strankovani.
A pak prisel ten genialni napad - nechat Hi registr prece jen 16bitovy, ale pri vypoctu adresy ho zarovnat vlevo, tj. hornich n bitu Lo se bude prekryvat s dolnimi n bity Hi, a Lo a Hi se budou scitat (ALU uz tam prece mame, ze). V ten moment se granularita pocatku stranek smrskla (z 64 kB na 16 bajtu pro nakonec zvolenou sirku adr. sbernice 20 bitu) a kod se bez nutnosti prepoctu Lo (napr. JUMPy) dal alokovat po 16bajtovych krocich. Kusy ruznych kodu tak bylo mozne skladat pekne za sebou bez nutnosti rekompilace nebo alespon korekce adresovych ofsetu, a to rozhodlo. Jaka to byla chyba bylo nejpozdeji zrejme pri vyvoji 80286...
Ano bylo to tak. Popravdě kdyby ten posun udělali ne o čtyři bity ale o osm bitů, tak by granularita pořád ještě byla dobrá (256 bajtů - to máme my od 6502 rádi :-) a problém by se posunul někam k 16 MB, což už by bylo hratelné delší dobu a možná by odpadla DOSovská omezení (16 MB bylo totiž hodně ještě v dobách 486).
Btw k té ALU: oni ji tam právě museli přidat, konkrétně blok číslo 3 (https://en.wikipedia.org/wiki/Intel_8086#/media/File:Intel_8086_block_scheme.svg). Nebylo to tedy tak, jako kdyby byla stránka (nebo řekněme segment) zcela odsunutá o 16 bitů (a i tam by byly problémy s relativními skoky přes kapacitu stránky/segmentu).
teď už si nevzpomenu - používal vůbec nějaký OS všechny čtyři ringy? Pokud vím (ale už je to dávno), tak se jelo maximálně na dva ringy - jádro a userland. I když mít oddělené drivery ve svém ringu by taky nebylo k zahození v dobách W3.11/W95, kdy různé obskurní zařízení bez problému poslalo celý OS do kytek...
Dost se o tom mluvilo, ale nejsem si vědom že by se v nějakám skutečném ne zcela obskurním OS podobný koncept vyskytl, přitom smysl by to dávalo, a nejen u W3.11/W95 jak píšete, ale i u modernějších OS.
Konkrétní příklad - původní Windows měly drivery sice v nule, ale samotnou grafiku v csrss, tedy sice subsystému, ale standardně na ring3, mám pocit až do 3.51.
NT4 přišly s win32k.dll, což byl možná dobrý krok z pohledu rychlosti vykreslování (graf. operace se přenesly zpátky do ring0), ale stabilitě systému zvlášť s obskurnější grafikou to moc nepřidalo.
A případ tisku na Win2000 terminal serveru by snad patřil do každé učebnice jak se to nemá dělat - to si na pobočce koupili nějakou obskurní tiskárnu s prapodivnými drivery, připojili se na firemní terminál server, dali něco tisknout, milé drivery se hezky pustily v ring0, ale toho terminál serveru a následně volaly desítky naštvaných uživatelů že díky modré smrti přišli o práci.
(jistě, dalo se to nastavit i lépe, pak ale zase hrozily potíže ať už politického (koupili jsme za půl mega Minoltu, jak to že na ní nemůžu tisknout?) nebo technické (300DPI bitmapa přes 128kb linku) rázu. Ale původní poznámka že tiskové drivery v kernel space nemají co dělat IMHO platí)
Ano, OS/2 pouzival vic nez jen ring 0 a 3. Podle Wiki vyuzival i Ring 2 pro privilegovane uzivatelske aplikace: https://en.wikipedia.org/wiki/Protection_ring
Dalsi vyuziti ringu 1 bylo u VMware, jeste v dobach pred hw asistovanou virtualizaci. Spatne se to dohledava, ale ring 0 virtualizovaneho guest OS bezel snad na ringu 1 v hostitelskem OS. (Uvedeno napr. v dokumentaci z r. 2005: https://www.vmware.com/pdf/esx_vin_eval.pdf)
A Apple je z těch firem, které jste jmenoval, také jediná, která dosud existuje. Takže je potřeba hodně tvůrčí myšlení, aby z toho člověk vyvodil, že se "platforma x86 nikde jinde neujala". Spíš bych řekl, že "se neujali" ti, kdo na ni nevsadili. (I Apple u ní skončil a jeho post-x86 éra sotva začala, takže je předčasné ji hodnotit.)
Ale ona se skutečně jinde neujala. Jen v oblasti PC a to je komodita, ne další x86 platforma. Z těch firem, která PC dělaly, přežil jen Dell. Ostatní, včetně IBM, Tulip, Olivetti, Compaq, Escom a desítky dalších už dávno s PC skončili (a většinou skončili úplně, protože je zničilo to, co je dostalo na vrchol - jednoduchý vstup na trh skládaček jménem PC, kde se moc nedá inovovat a kdo nemá celý řetězec jako Dell, prodělá).