Zavedení Linuxu bez vektoru přerušení

Vít

Zavedení Linuxu bez vektoru přerušení
« kdy: 04. 08. 2011, 19:47:20 »
Dobrý den,

už asi týden se snažím s kamarádem upravit expres gate v notebooku se speciálním tlačítkem na jeho spuštění.
Při jeho stištění se inicializují disky a pak tento zkrácený bios načte soubor CEFULL, jehož pravost pravděpodobně ověří dle hlavičky a pak spustí instrukci na adrese 0xc0. (zjistili jsme to za pomoci smyčky z nop)
Ovšem na obrazovku nelze nic vypsat, protože přerušení 10h způsobí restart. Stejně tak přerušení 13h, takže na disk se nepodíváme. (myslím, že některá přerušení fungují, nebo alespoň nerestartují system).

Je možné upravit linuxové jádro tak, abychom jej umístili do tohoto souboru a dalo se spustit?
(toť jest, odstranit všechna restartující přerušení?)
(zvládnou se zavést správně ovladače?)

Za odpověď děkuji.
« Poslední změna: 04. 08. 2011, 21:50:14 od Petr Krčmář »


JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re: zavedení linuxu bez vektoru přerušení
« Odpověď #1 kdy: 04. 08. 2011, 20:50:54 »
Nejsem si zcela jist, ceho chcete dosahnout, ale tady si nejaky clovek hral se SplashTopem a podarilo se mu z toho spustit Ubuntu: http://phoronix.com/forums/showthread.php?11610-Hacking-Express-gate-%28Asus-Splashtop%29/page10

Vít

Re: zavedení linuxu bez vektoru přerušení
« Odpověď #2 kdy: 04. 08. 2011, 20:58:08 »
No, jde mi o něco dosti podobného, ale raději bych přímo natáhnul svoje jádro hned (tento postup nemohu použít), jenže jak CEFULL tak kernel.bin jsou pro mne dosti nečitelné, a jen jsme se dostali k tomu že do cefullu můžeme dávat instrukce, které se provádějí, ale nejsou tam k dispozici přerušení biosu pro práci s obrazovkou a disky.

Sten

Re: Zavedení Linuxu bez vektoru přerušení
« Odpověď #3 kdy: 04. 08. 2011, 23:27:03 »
Pokud nejsou nastavené vektory přerušení, tak si žádný normální zavadeč (načítající z disku neho jeho emulace) neškrtne. Jako řešení mě napadá napsat jednoduchý vlastní zavaděč, ten uložit do toho souboru spolu s linuxovým jádrem a initramdiskem (takže ExpressGate tohle všechno najednou načtě do paměti). Zavaděč potom po spuštění najde a spustí jádro a předá mu ukazatel na začátek initramdisku.

Vít

Re: Zavedení Linuxu bez vektoru přerušení
« Odpověď #4 kdy: 06. 08. 2011, 10:48:58 »
Ano, ano, nějak takto bych si to představoval. Ale mám dojem, že krátce po zavedení jádra, když pracuje v reálném módu, tak na obrazovku vypisuje právě pomocí přerušení 10h. Což o to, to by se možná dalo odstranit ve zdrojácích, ale později, když se připravuje na přechod do protected modu, tak se připravuje idt (Interrupt descriptor table) a pokud se připravuje z vektoru přeručení, tak by se problém moh šířit dál.


Sneak Attack

Re: Zavedení Linuxu bez vektoru přerušení
« Odpověď #5 kdy: 06. 08. 2011, 13:15:42 »
A co jednoduše přesměrovat to přerušení na vlastní obslužnou rutinu, pokud INT 10h blbne? V real mode to není problém. U 13h by to bylo asi horší.

Jakub Váňa

Re: Zavedení Linuxu bez vektoru přerušení
« Odpověď #6 kdy: 06. 08. 2011, 13:46:26 »
Standardne kernel nebude volat BIOS. Že by si do IDT nacpal nějaké vektory z realu, to mi prijde dost silene a jeste silenejsi, ze by je pouzil.

Sten

Re: Zavedení Linuxu bez vektoru přerušení
« Odpověď #7 kdy: 06. 08. 2011, 14:21:44 »
Ano, ano, nějak takto bych si to představoval. Ale mám dojem, že krátce po zavedení jádra, když pracuje v reálném módu, tak na obrazovku vypisuje právě pomocí přerušení 10h. Což o to, to by se možná dalo odstranit ve zdrojácích, ale později, když se připravuje na přechod do protected modu, tak se připravuje idt (Interrupt descriptor table) a pokud se připravuje z vektoru přeručení, tak by se problém moh šířit dál.

Linuxové jádro nikdy neběží v real módu, protože už zavaděč přepne systém do 32-bit protected módu. Jestli něco vypisuje přes virtuální 86 mód, to jsem nezkoušel, ale nemyslím si to, případně by úplně stačilo nastavit vektor pro 10h někam, kde bude jenom iret.

Jakub Váňa

Re: Zavedení Linuxu bez vektoru přerušení
« Odpověď #8 kdy: 06. 08. 2011, 14:37:08 »
Určitě nic nevypisuje, spíš jsem myslel, že by mohli opravdu nějaké velmi speciální ovladače potřebovat spouštět reálný kód.

Kdysi jsem zkoušel jako zápočtový program modul, který by na žádost uměl spouštět kód v reálu. Tenkrát jsem dostal velmi negativní odezvy z kernel devel konference s tím, že vzniká jakási infrastruktura pro takové ovladače, která by je umožňovala spouštět právě ve v86. Nevím, jestli to v kernelu skutečně je - zatím jsem se s tím nesetkal. Pokud by bylo, určitě se přes to nepíše na obrazovku :D

Sten

Re: Zavedení Linuxu bez vektoru přerušení
« Odpověď #9 kdy: 06. 08. 2011, 15:03:47 »
Kdysi jsem zkoušel jako zápočtový program modul, který by na žádost uměl spouštět kód v reálu. Tenkrát jsem dostal velmi negativní odezvy z kernel devel konference s tím, že vzniká jakási infrastruktura pro takové ovladače, která by je umožňovala spouštět právě ve v86. Nevím, jestli to v kernelu skutečně je - zatím jsem se s tím nesetkal. Pokud by bylo, určitě se přes to nepíše na obrazovku :D

v86d v Linuxu je (mimo kernel), používá jej třeba uvesafb pro přepínání rozlišení. Ale to je ošetřené, pokud ten program zavolá nulový vektor, tak prostě spadne (SIGSEGV) a nic vážného se nestane. Pokud by ale pracoval s vektory přímo kernel, tak jakýkoliv problém by znamenal panic.

Vít

Re: Zavedení Linuxu bez vektoru přerušení
« Odpověď #10 kdy: 13. 08. 2011, 17:12:00 »

Linuxové jádro nikdy neběží v real módu, protože už zavaděč přepne systém do 32-bit protected módu. Jestli něco vypisuje přes virtuální 86 mód, to jsem nezkoušel, ale nemyslím si to, případně by úplně stačilo nastavit vektor pro 10h někam, kde bude jenom iret.

hmm, já vycházel z informacíz této stránky: http://duartes.org/gustavo/blog/post/kernel-boot-process

dále v rámci disassamblování CEFULLu jsme dospěly k závěru že se jedná o 32-bit kód (který samozřejmě moc nechápeme), a někde jsem četl, že počítač po provedení biosu je v realném 16-bitovém režimu. Pak by to znamenalo, že specielní zavaděč od ASUSu přepne do 32-bit modu.

Co se stane, když se v protected modu zavolá int 10h? Lze nějak snadno vypisovat na obrazovku v protcted modu?

dalším zajímavým zdrojem informací je SplashTopOS (ze kterého expresgate vychází), který je možné zavést pomocí grubu. Obsahuje soubor CE_BZ, který se zavádí jakožto linuxové jádro. Jeho začátek obsahuje hlavičku linuxového jádra, a od adresy 800h je kus podobný CEFULLu z express gatu. Ale bohužel nejsem schopen říci, co kód CE_BZ od adresy 200h dělá. (vstupní bod jádra dle výše zmiňovaných stránek).
Dle čeho zavaděč poznává, kde je protected mode část jádra?

Za všechny odpovědi děkuji.

Sten

Re: Zavedení Linuxu bez vektoru přerušení
« Odpověď #11 kdy: 14. 08. 2011, 02:58:41 »
dále v rámci disassamblování CEFULLu jsme dospěly k závěru že se jedná o 32-bit kód (který samozřejmě moc nechápeme), a někde jsem četl, že počítač po provedení biosu je v realném 16-bitovém režimu. Pak by to znamenalo, že specielní zavaděč od ASUSu přepne do 32-bit modu.

Tak jak jsem teď koukal, dříve se bootovalo v real módu a GRUB to stále umí (a GRUB Legacy a LILO to ani jinak nedělají). Na přepnutí do protected módu nicméně stačí čtyři instrukce, takže si to klidně můžete otestovat a případně přepnout sám :-)

Co se stane, když se v protected modu zavolá int 10h?

BIOS je jenom 16-bitový, takže nefunguje v protected módu. Muselo by se na to přerušení pověsit něco, co by přeplo do real módu a zavolalo BIOS. Samozřejmě pokud si tam pověsíte vlastní rutinu na vypisování textu, tak to bude fungovat.

Lze nějak snadno vypisovat na obrazovku v protcted modu?

Buď přepínat do real módu nebo (a to doporučuji) zapisovat přímo do paměti videokarty.

dalším zajímavým zdrojem informací je SplashTopOS (ze kterého expresgate vychází), který je možné zavést pomocí grubu. Obsahuje soubor CE_BZ, který se zavádí jakožto linuxové jádro. Jeho začátek obsahuje hlavičku linuxového jádra, a od adresy 800h je kus podobný CEFULLu z express gatu. Ale bohužel nejsem schopen říci, co kód CE_BZ od adresy 200h dělá. (vstupní bod jádra dle výše zmiňovaných stránek).
Dle čeho zavaděč poznává, kde je protected mode část jádra?

Viz popis bootu v protected módu.

Vít

Re: Zavedení Linuxu bez vektoru přerušení
« Odpověď #12 kdy: 27. 08. 2011, 11:40:48 »
Děkuji za zdroje informací, které zvolna, ve volných chvílích studuji.

Věoval jsem se momentálně zkoumáním CE_BZ, který je možno zavést jakožto standartní linuxové jádro, a od jisté adresy (800h, u jiné verze 600h) Je shodná s CEFULLem příslušn verze (souborem, který natahuje BIOS u notebooků vybavených specielním tlačítkem).

Podle popisů jsem zjistil, že grub měl určit část shodnou s cefullem jakožto protected mode část jádra.
Dále jsem se věnoval zkoumání realmode části CE_BZ, abych zjistil, v jakém stavu se zhruba nachází notebook po provedení zkáceného biosu, na začátku provádění CEFULLu.

Našel jsem tam instrukce které pravděpodobně přepínají grafickou kartu do VESA některého modu:
mov ax,0x4f02
int 0x10

A pak sekvenci přepínající do Protected mode.
(bohužel okolí příliš nerozumím)

Nabízí se tam skutečně tedy udělat 32-bit boot. Ale jak na to?

Z popisu jsem vyrozuměl, že mám někam do paměti nahrát strukturu boot_params, ale kam?
A jak pak mohu nastavit Globální deskriptor z protected mode?
Jsem zmaten tím co se stane po odskoku do Protected mode? co vlastně mohu dělat?

Navíc jádro by bylo umístěno v souboru CEFULL, který se nahraje asi na adresu 1MB. Když už bude celý tento soubor v paměti ram, je nutno přemísťovat strukturu boot_params a protected mode část jádra? Jak zjistit kde v paměti vlastně jsem?

Mnohokrát děkuji za odpovědi.