GNU/Linux >> Znalost Linux >  >> Linux

Použití segmentačních registrů

  1. Určitě jste četli opravdu staré knihy, protože nikdo neprogramuje reálný režim už;-) V reálném režimu , můžete získat fyzickou adresu přístupu do paměti pomocí phyical address = segment register * 0x10 + offset , offset je hodnota uvnitř jednoho z obecných registrů. Protože tyto registry jsou široké 16 bitů, segment bude dlouhý 64 kb a s jeho velikostí nemůžete nic dělat, jen proto, že neexistuje žádný atribut! Pomocí * 0x10 násobení, zpřístupní se 1 MB paměti, ale existují překrývající se kombinace v závislosti na tom, co vložíte do registrů segmentů a registr adres . Nezkompiloval jsem žádný kód pro reálný režim , ale myslím, že je na OS, aby nastavil registry segmentů během načítání binárního souboru, stejně jako by zavaděč alokoval některé stránky při načítání binárního souboru ELF. Zkompiloval jsem však kód jádra prostého kovu a musel jsem tyto registry nastavit sám.

  2. Čtyři segmenty jsou v plochém modelu povinné kvůli architektonickým omezením. V chráněném režimu registry segmentu již neobsahuje základní adresu segmentu, ale selektor segmentu což je v podstatě offset do GDT. V závislosti na hodnotě selektoru segmentu , CPU bude na dané úrovni oprávnění, jedná se o CPL (Current Privilege Level). Výběr segmentů ukazuje na deskriptor segmentu který má DPL (Descriptor Privilege Level), což je nakonec CPL, pokud registr segmentu je vyplněno tímto selektorem (alespoň platí pro selektor kódového segmentu). Proto potřebujete alespoň pár selektorů segmentů k odlišení jádra od uživatelské země. Kromě toho jsou segmenty buď segmentem kódu, nebo segmentem dat, takže nakonec skončíte se čtyřmi deskriptory segmentů v GDT.

  3. Nemám žádný příklad seriózního OS, který by nějak využíval segmentaci, jen proto, že segmentace je stále přítomna pro zpětnou shodu. Použití přístupu plochého modelu není nic jiného než prostředek, jak se ho zbavit. Každopádně máte pravdu, stránkování je mnohem efektivnější a všestrannější a dostupné téměř na všech architekturách (alespoň na konceptech). Nemohu zde vysvětlit vnitřní stránkování, ale všechny informace, které potřebujete vědět, jsou uvnitř vynikajícího Intel man:Intel® 64 a IA-32 ArchitecturesSoftware Developer’s ManualVolume 3A:System Programming Guide, Part 1


Rozšíření Benoitovy odpovědi na otázku 3...

Rozdělení programů na logické části, jako je kód, konstantní data, modifikovatelná data a zásobník, provádějí různí agenti v různých okamžicích.

Nejprve váš kompilátor (a linker) vytvoří spustitelné soubory, kde je toto rozdělení specifikováno. Pokud se podíváte na řadu formátů spustitelných souborů (PE, ELF atd.), uvidíte, že podporují nějaké sekce nebo segmenty nebo jak to chcete nazvat. Kromě adres, velikostí a umístění v souboru tyto sekce nesou atributy, které OS sdělují účel těchto sekcí, např. tato sekce obsahuje kód (a zde je vstupní bod), toto - inicializovaná konstantní data, tamto - neinicializovaná data (obvykle nezabírající místo v souboru), zde je něco o zásobníku, támhle je seznam závislostí (např. DLL), atd.

Poté, když OS začne spouštět program, analyzuje soubor, aby zjistil, kolik paměti program potřebuje, kde a jaká ochrana paměti je potřeba pro každou sekci. To se běžně provádí prostřednictvím tabulek stránek. Kódové stránky jsou označeny jako spustitelné a pouze pro čtení, stránky konstantních dat jsou označeny jako nespustitelné a pouze pro čtení, ostatní datové stránky (včetně těch ze zásobníku) jsou označeny jako nespustitelné a pro čtení i zápis. Tak by to mělo být normálně.

Programy často potřebují čtení i zápis a zároveň spustitelné oblasti pro dynamicky generovaný kód nebo jen proto, aby mohly modifikovat existující kód. Kombinovaný přístup RWX může být buď specifikován ve spustitelném souboru, nebo vyžádán za běhu.

Mohou existovat další speciální stránky, jako jsou ochranné stránky pro dynamické rozšiřování zásobníku, které jsou umístěny vedle stránek zásobníku. Váš program například začíná s dostatečným počtem stránek alokovaných pro zásobník o velikosti 64 kB a poté, když se program pokusí o přístup za tento bod, OS zachytí přístup k těmto ochranným stránkám, přidělí více stránek pro zásobník (až do maximální podporované velikosti) a posouvá ochranné stránky dále. Tyto stránky není nutné specifikovat ve spustitelném souboru, OS si s nimi poradí sám. Soubor by měl specifikovat pouze velikost zásobníku a možná umístění.

Pokud v OS není žádný hardware nebo kód, který by rozlišoval paměť kódu od datové paměti nebo vynucoval přístupová práva k paměti, je rozdělení velmi formální. 16bitové programy DOS v reálném režimu (COM a EXE) neměly kód, data a segmenty zásobníku označeny nějakým zvláštním způsobem. COM programy měly vše v jednom společném 64KB segmentu a začínaly na IP=0x100 a SP=0xFFxx a uvnitř mohlo být pořadí kódu a dat libovolné, mohly se prakticky volně prolínat. Soubory DOS EXE specifikovaly pouze počáteční umístění CS:IP a SS:SP a dále kód, data a segmenty zásobníku byly pro DOS nerozeznatelné. Vše, co bylo potřeba udělat, bylo načíst soubor, provést relokaci (pouze pro EXE), nastavit PSP (Prefix programového segmentu obsahující parametr příkazového řádku a některé další ovládací informace), načíst SS:SP a CS:IP. Nedokázal ochránit paměť, protože ochrana paměti není dostupná v režimu skutečné adresy, a tak byly 16bitové spustitelné formáty DOSu velmi jednoduché.


Linux
  1. Jak používat Nginx k přesměrování

  2. Proč stránky Unix Man Pages používají dvojité zaškrtnutí místo dvojitých uvozovek?

  3. Jak používat manuální stránky, abyste se naučili používat příkazy?

  1. Jak používat BusyBox na Linuxu

  2. Je lepší použít $(pwd) nebo $pwd?

  3. Linux – použití O_direct na Linuxu?

  1. Jak používám cron v Linuxu

  2. Jak používat Su Command v Linuxu

  3. Kdy použít Nohup?