Win11 - Obnovenie nastaveni
Pavel Hudeček
edizon na seznam.cz
Pátek Únor 14 16:37:45 CET 2025
No HW pro to zcela striktní rozdělení tam je. Stačí ho jen používat. A
ano, místo toho se jako "narovnák na vohejbák" používá ochrana na úrovni
stránek.
Na x86 je to tak, že program je v segmentu indexovaném registrem CS, ten
musí být typu program a segment typu program má možnosti spouštět
program a volitelně číst. Pak je zásobník, kam se pšistupuje přes SS,
tam zas musí bejt jen segment typu stack, v něm nelze spouštět program a
velikost je limitována sdola, aby mohl růst dolů. Nakonec je klasickej
segment data, kam lze přistupovat přes DS, ES, ... Nic nebrání tomu mít
část dat v datech (a třeba i v několika datových segmentech s adresama
od 0, který ležej v paměti jinde) a část v zásobníku. Pro všechny
segmenty jsou pak 3 úrovně oprávnění a pravidla co jde a nejde když se liší.
Podobně jsem to viděl třeba na Cortex A8.
Pak jsou ještě speciální segmenty, jako TSS, kde je všechno pro jeden
proces, včetně masky IO kam může a taky brány volání, aby se dal udělat
call, kde se offsetová adresa ignoruje, aby se daly volat funkce bez
možnosti skočit mimo správný vstupní bod. A určitě od Pentia, kdy jsem
to měl nastudovaný podrobně a psal si vlastní OS v asm, přibylo dost
dalších vychytávek.
Nejdůležitější je, že segmenty by se neměly překrývat. Jenže místo aby
se do C dodělala podpora pointerů i se segmentama, Microsoft i Linuxáci
se na to vy... a segmenty hodili všechny přes sebe, jako to dělaly první
32b herní enginy v DOSu.
PH
Dne 14.02.2025 v 14:46 Miroslav Mraz napsal(a):
> Jenže rozdělení na program, data a zásobník není zase tak striktní,
> třeba lokální proměnné mohou být na zásobníku. Prostě to musí být
> nějak svázáno s překladačem. Nevím jak to mají Windows, ale Linux má
> program v RX (tedy v podstatě read only) stránce, statická data v RW
> stránce, kód z ní tedy spouštět nejde, nejde spustit ani z oblasti
> zásobníku. Jde ale dost jednoduše namapovat stránku s právy RWX, do ní
> nakopírovat cokoli a to pak spustit.
> Tohle má docela dobře ošetřeno webassembly. Aplikace běží v sandboxu,
> takže ven, na železo se nedostanete, ale nejde do toho dostat ani
> nějaký binární blob, který by po spuštění umožnil systémové volání.
> Sice jde v C-čku pracovat s ukazateli na funkce, nepřímé volání
> funguje, ale nikdy nedostanete opravdickou adresu funkce. Ta
> mezivrstva, která se posílá přes web tomu zabrání.
> Vůbec je to složitá problematika, dnešní procesory mají spoustu
> choulostivých míst z principu a obvykle se najde někdo, kdo si toho
> všimne a pak už je jen otázka času kdo a kdy to zneužije.
>
> Mtazík
>
>
> On 14. 02. 25 14:09, Pavel Hudeček wrote:
>> No tohle je pro mě nepochopitelný, proč když 386 a dál, větší ARMy a
>> všechny další CPU u kterých má smysl normální OS, mají HW memory
>> management s oddělenými adresními prostory programu, dat a zásobníku,
>> ...
>> Microsoft to snadno moh udělat když dělal Windows NT, ale neudělal.
>> Linux začal na zelený louce a zase nic.
>> Proč?
Další informace o konferenci Hw-list