Toon posts:

Waarom zijn Linux systemcalls alleen statisch toe te voegen?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hierbij een rare vraag en ik hoop dat iemand mij hier antwoord op kan geven.

Waarom zijn Linux system calls alleen statisch toe te voegen door de kernel code te wijzigen.
De reden dat ik dit vraag is, omdat het wel mogelijk is vanuit een eigen module een '/proc' entry te creeren waarmee vervolgens wel variabele waarden in kernel space kunnen worden gezet, in de eigen geimplenteerde module.
Hiermee is het ook mogelijk zelf gedefinieerde kernel functies uit te voeren, middels de entry die je hebt gedefinieerd in het '/proc' filesysteem.
Dus lijkt het mij niet dat het wegens veiligheidsoverwergingen is?

Kan iemand mij dit uitleggen? Waarom bestaat er geen kernel functie voor het dynamisch toevoegen van een system call? :?

Verwijderd

Topicstarter
Sorry, misschien had ik deze post in de 'Dev' schuur moeten doen. Sorry. ;)

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 13-05 17:10

deadinspace

The what goes where now?

Ik heb er even naar gekeken, maar ik heb maar weinig ervaring met kernelhacken (gebrek aan tijd en geen machine die over de zeik mag), dus zekerheid kan ik niet geven.

De systemcalls staan in een tabel, sys_call_table (in linux/arch/i386/kernel/entry.S). Entries in deze tabel veranderen is mogelijk, waardoor je systemcalls kunt onderscheppen en hun functie kunt overnemen, maar entries aan deze tabel toevoegen is run-time niet mogelijk.

Misschien dat je deze tabel kunt dupliceren in je module, en daaraan je eigen systemcall toevoegen. Dan zou je elke referentie naar die tabel moeten wijzigen zodat die naar jouw tabel refereert.
Ik vrees alleen echter dat de referenties naar die tabel overal in de instructies staan, en dat die allemaal wijzigen dus niet te doen is. Als er een pointer naar die tabel was, en alle code die pointer zou gebruiken, dan zou het wel mogelijk zijn, maar de tabelnaam wordt gewoon in de code gebruikt, en dat wordt bij het compilen/assemblen waarschijnlijk omgezet naar het geheugenadres in kwestie, wat de referentie naar de tabel dus vastlegt in de feitelijke instructies.

Een pointer-naar-tabel constructie zou in ieder geval systemcalls iets trager maken (toegevoegde dereference), maar verder voorzie ik zo snel weinig problemen met zo'n implementatie. Ik weet niet waarom de kernel het niet op die manier implementeert.
Misschien is er gewoon heel weinig interesse aan het toevoegen van systemcalls vanuit modules (/proc entries en devices zijn veel gewoner), of misschien zie ik wat over het hoofd.

Wat me meteen tot het volgende punt brengt: waarom wil je eigenlijk een systemcall toevoegen vanuit een module?

Bij het googlen kwam ik dit tegen: http://blacksun.box.sk/lkm.html, staat wel interessante informatie in.

Oja, en als je persé een schop naar P&W wil, dan moet je het maar even zeggen, maar ik denk eigenlijk niet dat je topic daar veel meer kans maakt.

Verwijderd

Even domme vraag - wat bedoel je met "system call"? Is nogal een vage term zoals je hem gebruikt. Bedoel je de POSIX syscalls (read()/write()/ioctl()/etc.)? In dat geval - omdat het POSIX is natuurlijk. Bovendien, even realistisch, hoe wil je in hemelsnaam functies toevoegen aan een file_ops-based interface met static headers voor libc? Dat kan niet. ;). Het doel van POSIX is juist om dit te voorkomen. :Y). POSIX is namelijk vrij compleet.

Verwijderd

Topicstarter
POSIX kan dan vrij compleet zijn. Ik wil functionaliteit aan de kernel toevoegen.
Ik ben bezig met een 'realtime' linux kernel (RTAI) waarin ik modules insert die realtime taken uitvoeren. Nou wil ik vanuit user-space een functie aanroepen binnen de modules die ik gebruik, daarom wil ik dus een system call toevoegen. :)

Vandaar :p

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 13-05 17:10

deadinspace

The what goes where now?

Nouja, ik zie zo snel geen methode om systemcalls volledig vanuit een module toe te voegen. Je kunt wel aan de kernel zelf die systemcall toevoegen, met een stub (lege placeholder) als function, en dan dmv die module die function overloaden met de werkelijke functionaliteit.

Anders moet je een device gebruiken, die kunnen wel 100% vanuit een module afaik (of een /proc entry, maar dat acht ik minder geschikt hiervoor).

[ Voor 9% gewijzigd door deadinspace op 28-01-2003 20:14 ]


Verwijderd

Verwijderd schreef op 28 januari 2003 @ 12:36:
POSIX kan dan vrij compleet zijn. Ik wil functionaliteit aan de kernel toevoegen.
Je bent echt vaag - wat voor functionaliteit?
Ik ben bezig met een 'realtime' linux kernel (RTAI) waarin ik modules insert die realtime taken uitvoeren. Nou wil ik vanuit user-space een functie aanroepen binnen de modules die ik gebruik, daarom wil ik dus een system call toevoegen. :)
Apart from the fact dat dit ongelofelijk fout is (de kernel is per definitie niet iets waarbij functies in de programmeer-zin vanuit userspace worden aangeroepen - als je zover bent dan heb je echt iets gigantisch fout gedaan in je design), je kan toch gewoon ioctl() hiervoor gebruiken?

Verwijderd

Het is volgens mij wel mogelijk om dynamisch systemcalls toe te voegen. Hier wat van Google.

http://groups.google.com/...540ask.diku.dk%26rnum%3D7

http://groups.google.com/...0%40saturn.homenet&rnum=1

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 13-05 17:10

deadinspace

The what goes where now?

In die eerste wordt het gebruik van devices voorgesteld.

Die tweede is wat anders. Wat daar wordt voorgesteld schoot me ook al even te binnen toen ik door de lijst met systemcalls bladerde en een enkele ongebruikte entry zag, maar die methode is wel tamelijk ranzig.

Verwijderd

Topicstarter
Apart from the fact dat dit ongelofelijk fout is (de kernel is per definitie niet iets waarbij functies in de programmeer-zin vanuit userspace worden aangeroepen - als je zover bent dan heb je echt iets gigantisch fout gedaan in je design), je kan toch gewoon ioctl() hiervoor gebruiken?
Dus jij vindt system calls per definitie fout? Wat jij hier suggereert is pas vaag :? Wanneer je een system call aanroept, doe je toch ook niets anders dan de kernel vragen functionaliteit voor jou uit te voeren. Waar zijn system calls anders voor ?
Ik begrijp deze opmerking echt helemaal niet. En het is off topic om wat voor functionaliteit het gaat. Dat is niet de vraag die ik stel. Lees de vraag nog eens SVP.
Buiten dat is door de informatie die ik nu heb gegeven niet af te leiden waarom ik een system call gebruik en al helemaal niet welk design ik gebruik.

Dus: Sorry, waarom je zulke informatie post, begrijp ik echt niet en helpen doet het ook niet.

BTW: Volgens mij voldoet Linux pas sinds versie 2.4 enigszins een beetje aan de POSIX standaard. Daarnaast heeft Linux toch ook functionaliteit die niet volgens POSIX is. Bijvoorbeeld 'clone()'.

[ Voor 10% gewijzigd door Verwijderd op 29-01-2003 11:48 ]


Verwijderd

Je roept functionaliteit aan, geen functie. Het ene is functioneel-gericht denken, wat je in deze context zo ongeveer moet doen, het andere is denken in termen van de kernel als een library. En ook al is dit feitelijk het geval (qua structuur e.d.), zo moet je de kernel niet benaderen, omdat de kernel en usersapce juist gescheiden moeten zijn. Dus kernel functies moeten in userland niet bestaan. System calls zijn niet bedoeld om functies uit te voeren, maar om functionaliteit uit te voeren. Zie je het verschil in denken?

Verwijderd

Topicstarter
Ja, heb je mij ooit horen zeggen dat ik het hier niet mee eens ben? Ik begrijp je standpunt, maar niet waarom je dit zegt?
Dat is hier toch niet van belang? En wat betreft het gescheiden houden van user- en kernelspace, dat is toch ook wat ik doe, tenminste wil doen? Ik wil alleen nieuwe functionaliteit toevoegen. Ik wil dat er iets in kernelspace gebeurt wat in standaard Linux nog niet kan gebeuren.

Begrijp je dat ik niet begrijp wat jij nou eigenlijk bedoelt?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 09:48

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 29 January 2003 @ 12:34:
Ja, heb je mij ooit horen zeggen dat ik het hier niet mee eens ben? Ik begrijp je standpunt, maar niet waarom je dit zegt?
Dat is hier toch niet van belang? En wat betreft het gescheiden houden van user- en kernelspace, dat is toch ook wat ik doe, tenminste wil doen? Ik wil alleen nieuwe functionaliteit toevoegen. Ik wil dat er iets in kernelspace gebeurt wat in standaard Linux nog niet kan gebeuren.

Begrijp je dat ik niet begrijp wat jij nou eigenlijk bedoelt?
Het lijkt me sterk dat dat niet in userland kan.. (vandaar waarschijnlijk ook de eerdere vragen om WAT voor functionaliteit het gaat)

Maaruh... waarom moet dit dan dynamisch? Je kan die functionaliteit toch ook op de normale manier (dus kernel recompile) aanmaken? En als een userland programma dynamisch kernel space dingen kan toevoegen is je scheiding tussen user en kernel dus eigenlijk verdwenen.

[ Voor 8% gewijzigd door Creepy op 29-01-2003 12:44 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
En als een userland programma dynamisch kernel space dingen kan toevoegen is je scheiding tussen user en kernel dus eigenlijk verdwenen.
Nou, die scheiding is dan dus indirect ook te laten verdwijnen door een '/proc' entry te creeren vanuit een module. Daarmee is immers toch ook te 'communiceren' met een kernel module en dus indirect te 'communiceren' met kernel space?
Waarom dan niet dynamisch een system call toevoegen?

Verwijderd

Verwijderd schreef op 29 januari 2003 @ 12:49:
Nou, die scheiding is dan dus indirect ook te laten verdwijnen door een '/proc' entry te creeren vanuit een module. Daarmee is immers toch ook te 'communiceren' met een kernel module en dus indirect te 'communiceren' met kernel space?
/proc entries interpreteren slechts dat wat bij de module is geprogrammeerd om te interpreteren. echo "crash" >> /proc/blaat zal de kernel echt niet een random functie blaat laten uitvoeren.
Verwijderd schreef op 29 januari 2003 @ 12:34:
Ja, heb je mij ooit horen zeggen dat ik het hier niet mee eens ben? Ik begrijp je standpunt, maar niet waarom je dit zegt?
Design-related.
Dat is hier toch niet van belang? En wat betreft het gescheiden houden van user- en kernelspace, dat is toch ook wat ik doe, tenminste wil doen? Ik wil alleen nieuwe functionaliteit toevoegen. Ik wil dat er iets in kernelspace gebeurt wat in standaard Linux nog niet kan gebeuren.
Zie Creepy, dat moet je dan niet dynamisch doen.

Verwijderd

Topicstarter
Oke, het gemiddelde tweaker advies is dus om het niet te doen. Ik ben het absoluut oneens met de argumenten die worden aangevoerd. Vooral met betrekking tot de '/proc' entry, waar ik uit ervaring weet dat dit toch echt mogelijk is.
Maar jullie mening is mij duidelijk.. :)

  • TheGhostInc
  • Registratie: November 2000
  • Niet online
Verwijderd schreef op 29 januari 2003 @ 13:06:
Oke, het gemiddelde tweaker advies is dus om het niet te doen. Ik ben het absoluut oneens met de argumenten die worden aangevoerd. Vooral met betrekking tot de '/proc' entry, waar ik uit ervaring weet dat dit toch echt mogelijk is.
Maar jullie mening is mij duidelijk.. :)
Volgens mij is het handiger om gewoon te vertellen *WAT* en *WAAROM* je iets wil.

Als je zegt:
Ik wil iets wat een voertuig zo wrijvingloos mogelijk kan dragen

Dan kan het best zij dat je gewoon op zoek bent naar een stel wielen, en volgens mij is dat al lang geleden uitgevonden ;)

NOFI maar niemand kan hier een duidelijk antwoord op geven zonder dat hij/zij er iets meer vanaf weet, of het wordt gokken. En daarvoor hebben we casino's

Verwijderd

Topicstarter
Nou, dat ben ik wel met je eens, maar ik denk ook dat we een beetje zijn afgedwaald van het initiele vraagpunt. ;)

I rest my case :p

Volgens mij heb ik duidelijk genoeg uitgelegd wat ik bedoel, maar miscchien heb ik dat niet voldoende gedaan.

Maybe I should get it out of my head and find something new 8)7

[ Voor 41% gewijzigd door Verwijderd op 29-01-2003 13:26 ]


  • TheGhostInc
  • Registratie: November 2000
  • Niet online
Verwijderd schreef op 29 januari 2003 @ 13:25:
Nou, dat ben ik wel met je eens, maar ik denk ook dat we een beetje zijn afgedwaald van het initiele vraagpunt. ;)

I rest my case :p
Ben ik het helemaal mee eens, maar herstel je vraag nog een keer, met iets meer informatie:

Ik begrijp dat je Real-time Linux aan het proggen bent, blijkbaar ben je iets modulairs aan het bouwen, waarbij je, voordat je helemaal opgestart bent, nog niet weet wat er allemaal aan hangt?

Verwijderd

Topicstarter
Nou, ik vind dit een geweldige discussie, maar ik kan er helaas geen volledige uitleg over geven. Hoe graag ik dit ook zou willen :D.
Dan zou ik tevens het hele programma idee hier uit moeten gaan leggen en dat lijkt mij niet nodig en dat kan ik helaas ook niet doen.

Sowwy. Ik denk dat we het hier dan maar bij moeten laten. Ik zal eens even weer uitgebreid in de boeken duiken en als ik wat vind dan horen jullie het wel ;)

  • TheGhostInc
  • Registratie: November 2000
  • Niet online
Suc6 alvast

Greetz,
* TheGhostInc .

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 13-05 17:10

deadinspace

The what goes where now?

Verwijderd schreef op 29 January 2003 @ 11:44:
Dus jij vindt system calls per definitie fout?
Mja, ze zijn niet bedoeld om lukraak functionaliteit aan de kernel toe te voegen.
BTW: Volgens mij voldoet Linux pas sinds versie 2.4 enigszins een beetje aan de POSIX standaard.
Valt nogal mee hoor, GNU/Linux POSIX' compliance is al vrij lang vrij goed.
Daarnaast heeft Linux toch ook functionaliteit die niet volgens POSIX is. Bijvoorbeeld 'clone()'.
clone() biedt functionaliteit die glibc via een wrapper als een POSIX functie aanbiedt.

Btw: elke Unix heeft meer-dan-POSIX functionaliteit.
Pagina: 1