Windows 95 není nic víc než MS-DOS 6 + Window 3.1 s předělaným GUI a schopností pouštět 32-bitové programy. Nevidím důvod, v čem by se W95 mělo chovat „víc“ jako operační systém než W3.1. Do W3.1 šly taky nahrávat „VXD“ ovladače, stejně jako do W95. Jak W95, tak W3.1 funguje i s těmi MS-DOSovými ovladači a používá nějaký šílený algoritmus na rozhovování, které stránky v té MS-DOSové paměti jednotlivá DOS-okna sdílejí (t.j. rezidentní programy natažené před startem Windows) a které ne (programy či rezitení programy puštěné v tom daném okně).
Hint: zkus si pustit v MS-DOS okně W95 debug a vymazat tu tabulku přerušení na začátku paměti. Vytuhne ti celý systém.
Bezva, ale o to přece nešlo. W95 nebyly zabezpečené tak jako NTčka, to nikdo nepopírá. Stačilo přepsat něco v oblasti, kam byla mapovaná DLL, a šlo to do kytek stejně.
Rozhodně si ale nemyslím, že by vymazání oblastí pro interrupty a následné zatuhnutí mělo znamenat, že W95 běželo v DOSu. V chráněném režimu MUSÍ být tabulka interruptů přemístěna jinam, na jiné místo v paměti (a chip co řídí přerušení přeprogramován, protože Int 8, kam se mapuje IRQ8 v chráněném režimu patří výjimce procesoru). Spíš tuhle oblast W95 používají pro zachování kompatibility a příslušné handlery volají z chráněného režimu, aby dali šanci i rezidentním DOSovým programům… a ten systém vytuhne proto, že celý W95 beží v kernel mode, včetně aplikací a DOSového rozhraní.
Rozdíl mezi W3.1 a W95 je ten, že zatímco služby OS ve W3.1 jsou emulovány DOSem, DOS pod W95 je emulován windowsovským ovladačem v 32-bitovém režimu.
W 95 mají io.sys, msdos.sys a command.com stejně jako DOS. Dokonce, pokud při startu zavedeš pouze tyto programy a nikoli GUI (po zmáčknutí F5 či F8), tak z toho DOS máš a pak můžeš napsat „win“ a máš z toho Windows a pak zase kliknout na „restartovat v režimu MS-DOS“ a máš z toho zase DOS.
Kvůli DOSovým rezidentním programům to pořád volá všechny služby přes INT x, stejně jako Win 3.1. Pokud vezmeš DOSový program na omezení přístupu k souborům (jakási primitivní security počítající s tím, že uživatel není dostatečně znalý, aby si to v paměti patchnul) a zavedeš ho ve Win95, tak ti bude fungovat a omezovat přístup k souborům úplně stejně jako v DOSu. Čili ten filesystém stejně jde přes INT 0×21 a reálný mód. Možná ve W95 existují nějaké bypassy, že když na daný interrupt není připojen žádný rezidentní program, tak se provede přímo bez reálného módu; to nevím.
Další ukázka použití BIOSu ve Win95 je přístup na disketu. Žádný program ti neběží po dobu, co se vykonává nějaká operace s disketou. Kurzor po obrazovce jezdí (ten je řešen interruptem), ale jinak nic udělat nejde a všechno reaguje se sekundovým zpožděním. Patrně na tu disketu používají BIOS, kdyby měli skutečný ovladač diskety v chráněném režimu, tak by všechny procesy takhle neblokoval a používal interrupt.
Odhadovat podle zavaděče jak běží W95 je krásný úlet. I Linux lze zavést z DOSu. Dokonce i tak, že shutdown toho Linuxu vrátí řízení DOSu (pokud Linux bude striktně používat jen HMA).
W95 neměly ovladač diskety v chráněném režimu. Jen ovladač diskety byl implementován tak, že přepnul do reálného režimu a operaci provedl v reálném režimu přes BIOS, což je legitimní. I dnes jste v kernel mode schopen napsat ovladač, který významným způsobem zastaví počítač, protože vyžaduje nějakou těsnější komunikaci s HW.
Máte pravdu, W95 měl bypassy. A pokud zjistil, že rezidentní program změnil tabulku interruptů, dal mu šanci v běhu právě tak, že jeho obsluha se zavolala nejdřív. Ale první obsluha byla v chráněném režimu, teprve pak se řešila kompatibilita.
INT 21 je i chráněném režimu. Vůbec ta informace INT 21 neznamená, že je tam reálný mod. Ano, přepnout do reálu se muselo, pokud tam nějaký rezident seděl. V chráněném režimu by totiž nefungoval.
„Jenže 8086 přepínat úlohy neuměla (hacky ve stylu přehazování zásobníky nepočítám, to se samozřejmě dalo dělat i na ZX Spectrum, ale mělo to své problémy). Přepínat úlohy umí až 286ka a stránkování (a tedy plnohodnotnou správu paměti) umí až 386ka.“
Linux na přepínání úloh používá ten „hack ve stylu přehazování zásobníku“. Ano, opravdu to přepne zásobník, nahraje registry a případně přepne tabulku stránek.
To hardwarové přepínání procesů Linux nepoužívá; je zbytečné. Je děláno mikrokódem v procesoru a ten mikrokód je pomalejší než když se přímo napíšou instrukce na přepnutí zásobníku a nahrátí registrů. Ten mikrokód musí kontrolovat spoustu drobností definovaných v architektuře (všechny možné bity v GDT, TSS…), zatímco přímo napsaný kód na přepnutí zásobníku to nedělá.
"Přepínat zpět do reálného režimu bylo potřeba, a Intel si svou hrubku velice záhy uvědomil.
… a čemu to vadilo, že 286 neuměla přepnout do reálného módu? Prostě se zresetovala a BIOS zkontroloval jednu hodnotu v paměti, a pokud seděla, skočil na nějakou adresu.
Buď si děláte srandu, nebo hrůza děs. Pokud Linux takhle přepíná procesy…
Co třeba stránkování, tabulky deskriptorů, ty se taky musí přepnout! Buď tomu tedy nerozumíte, nebo začínám chápat, proč je ten linux tak zprasený. Pryč od něj!
Teh hack s BIOSem je fakt dobrej :-) Miluju za programovací styl „tady to hacknem!“. Pak to podle toho vypadá jak vypadá!!!!
Co to furt meleš? Ty sis prostě vymyslel svoji představu o tom, jak má co fungovat, ovšem skutečná teorie i praxe je jiná. Už ti tu dva lidi nezávisle na sobě řekli, jak se to má s tím přepínáním zásobníků a vypínáním PM u 286.
ad přepínání kontextu – naprostý souhlas s Biktopem i BLEKem. Stejně musí nakonec nějakým způsobem _VŽDYCKY_ dojít k přepnutí zásobníků, protože to je prostě základní princip jakéhokoli multitaskingu: KONTEXT PROCESU je definován ZÁSOBNÍKEM; principiálně je úplně lhostejné, jestli si registry procesoru uložíš do nějaké systémové struktury procesoru, do nějaké svojí tabulky nebo na zásobník, který vzápětí přepneš. Chápeš to? To, co píše BLEK, je chronický problém inteláckých procesorů odjakživa – přepínání procesů pomocí TSS s využitím call bran nebo nested interruptů je zoufale poooomaaaaléééé, protože se přitom dělá spousta věcí, které se vůbec dělat nemusejí, jenže procesor o tom neví, ví to jádro systému – proč modifikovat hromadu systémových registrů, které trvá proklatě dlouho, když to konkrétní implementace vůbec nevyžaduje, např. díky flat modelu apod.? Chce to trochu myslet a ne jen slepě spoléhat na to, co doporučuje výrobce. Zvlášť když svůj výrobek vybavil hromadou redundantních věcí, jež se při přepínání kontextu všechny musejí na úrovni procesoru zohlednit, ale v praxi je najednou nikdo nikdy nepoužije, protože je to naprosto zbytečné.
ad přepnutí reálného režimu 286 – jaký hack zase? Víš vůbec, o čem mluvíš? Přepnutí 286 do reálného režimu v praxi vypadalo tak, že jsi zrušil tabulku vektorů přerušení a záměrně vygeneroval výjimku „neplatný operační kód“. To při neexistenci oné tabulky způsobilo trojitou výjimku a přechod CPU do stavu shutdown, který detekoval externí HW a zresetoval ho. Tabulku přerušení stejně musíš modifikovat pro reálný režim, takže to žádná operace navíc není a jako ten neplatný kód se obvykle (po uvedení 386) dávalo MOV CR0,EAX (který je na 286 samozřejmě nedefinovaný), neboli přepnutí do reálného režimu vypadalo z hlediska programátora skoro stejně na 286 i 386. Klidně tomu říkej hack, ale v porovnání s „oficiální“ metodou (přes klávesnici) to bylo nesrovnatelně elegantnější a mnohem rychlejší.
Fakt si o tom všem nejdřív něco zjisti, než o tom začneš plácat nesmysly na diskusích, kam choděj lidi, kteří tomu narozdíl od tebe rozuměj. Jak si vůbec troufáš posuzovat, jestli je nějaký operační systém po programátorské stránce zprasený, když problematice teorií a technik operačních systémů vůbec nerozumíš, jak je vidět? To ses hochu měl dát na politiku nebo k zelenejm, tam každej kecá o věcech, o nichž nic neví a nikomu to nevadí, ale tady s takovou budeš akorát za trotla.
Stačilo napsat jedno slovo HACK. Programování ve stylu ala HACK opravdu nehovím (ačkoliv pravda je, že mne k tomu občas okolnosti nutí, takže právě proto jsem proti němu!). Pokud zde máme technické prostředky jak něco řešit čistě, měly by se využít a ne to ohackovat.
Přepínání do reálného režimu 286 považuji za hack, tečka.
Přehazování zásobníku místo použití brány považuju za hack, tečka.
Pokud mají inteláci přepínání pomalé, pak je to jejich problém, nikoliv můj. Ale nevěřím tomu, už proto, že konkurence tu je velká (např. AMD). Mimochodem jak přepínáte stránkové registry? LTD tabulky. Nevyjde to v konečném důsledku stejně náročné, jako to dělat ručně?
PS: Flat režim je metla lidstva. Díky tomu se rozmohly viry typu stack overflow a podobně. Při použití segmentového přístupu je ochrana o 100% vyšší. Škoda, že to nikdo nevyužívá (tedy … po pravdě, microsoft využívá registr FS, kde je segment namapovaný na TLS aktuálního vlákna… mimochoděm, taky se musí při přepnutí naplnit správnou hodnotou.)
PSS:Linux je plný hacků, tečka.
Největší problém, který máš, je ten, že o tom víš opravdu kulový. Doporučuji studium nějaké odborné literatury, třeba Madnick, Donovan: Operating Systems, Tanenbaum: Modern Operating Systems nebo aspoň pro ty nejnutnější základy v češtině třeba Čada: Operační systémy. Fakt nemá smysl to s tebou řešit, to je jako bavit se o strategiích při hraní durcha s člověkem, který vůbec nezná pravidla mariáše.
(pozn.: „POST-POST SCRIPTVM“ = „PPS“)