[OSy] .entry sekce a volani SYSCALL

Martin Decky decky at dsrg.mff.cuni.cz
Fri Dec 29 14:04:22 CET 2006


Hezky den,

> Jakym zpusobem definovat sekci .entry? A kde ji provadet? Je mi jasne,
> ze funkce __entry bude prvni funkci, ktera se zavola po prepnuti do user
> modu, ale jakym zpusobem definovat, ze zrovna tato funkce se ma zavolat?
> My to zatim trochu obchazime tim, ze vime presne adresu kde je librt.a
> umisteno a tam se prepiname, ale pres vyuziti sekce .entry by to bylo
> asi cistsi.

Smysl sekce .entry ve spojitosti s binary formatem uzivatelskeho procesu
je takovy, aby se kod funkce __entry() objevil ve vystupu linkeru
zarucene na pozici 0. Toho se dosahne tak, ze linker pouzije sekci
.entry jako prvni na vystupu a tato sekce obsahuje jako prvni symbol
__entry.

Pri spousteni procesu tedy kernel vi, ze musi skocit na virtualni adresu
0 v ramci adresniho prostoru procesu (pripadne na jinou adresu, pokud
jste se rozhodli usporadat adresni prostor procesu jinak, ale kazdopadne
na relativni adresu 0 od pocatku binarky procesu).


Pokud byste se rozhodli implementovat (zjednoduseny) zavadec formatu
ELF, potom tu sekci .entry vubec nepotrebujete, protoze byste si z
prislusne ELF hlavicky primo precetli relativni adresu entry pointu.

> Druha otazka souvisi s prechodem z user modu do kernelu pres volani
> SYSCALL. Pred samotnym volanim ukladame do registru a0-a3 parametry jako
> kod funkce a parametry fce. Potom se zavola instrukce syscall, ktera
> zpusobi vyjimku a kontrolu prevezme general exception handler v kernelu.
> Cemu nerozumim je to, proc kdyz si hned jako prvni vec v exception
> handleru necham vypsat obsah registru, tak v registrech a0-a3 jsou uplne
> jine hodnoty nez ocekavam. Mohli byste nas prosim nekdo nasmerovat co
> delame spatne nebo co mame zhruba udelat, aby na tato vec fungovala,
> protoze my tady nad tim uz sedime tak 4. den a porad nic :( a uz moc
> nevime kam se divat.

Tady vam asi nikdo bez znalosti vaseho kodu konkretne neporadi, budete
to muset odkrokovat uz z toho user space (a presvedcit se, ze se do
registru skutecne ulozi spravne hodnoty a kde se pripadne necim prepisi).

Podstatne je spravnym zpusobem vysvetlit prekladaci, do jakych registru
ma ulozit argumenty, co instrukce SYSCALL ovlivnuje a v obsluze vyjimky
cist hodnoty registru ze spravneho mista (je mozne, ze uz nejsou v
registrech, ale ulozene na nejakem zasobniku).


M.D.



More information about the NSWI004 mailing list