PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wird code-bereich bei executables auch "geshared"?



Lin728
24.11.04, 20:23
Grüssi!

Wir entwickeln in der Schule gerade ein embedded-board, zielvorgabe ist 4mb-ram und 8-mbrom mit grafischer oberfläche. Naja, was solls...

Problem was ich bei Einsatz von Busybox habe ist, dass ich nicht weiß, ob Linux die code-segmente von executables standardmäßig shared.
Also so wie bei shared libraries nur halt mit binaries, tut es das?

Sonst muss ich busy box in eine shared-lib packen, und einen main()-wrapper rundherumbauen...

Danke schonmal

derguteweka
24.11.04, 20:33
Moin,


Grüssi!

Wir entwickeln in der Schule gerade ein embedded-board, zielvorgabe ist 4mb-ram und 8-mbrom mit grafischer oberfläche. Naja, was solls...
Na, das kann ja heiter werden :D


Problem was ich bei Einsatz von Busybox habe ist, dass ich nicht weiß, ob Linux die code-segmente von executables standardmäßig shared.
Also so wie bei shared libraries nur halt mit binaries, tut es das?

Sowie mehrere busyboxen laufen (passiert ja sowieso, z.b. wenn init auch von busybox gestellt wird), beeinflussen die sich nicht gegenseitig, d.h. da brauchts keinen wrapper oder irgendwas drum. Code-segmente koennen doch auch prima geshared werden, die veraendern sich doch nicht zur Laufzeit - oder hast du in busybox schonmal selbstmodifizierenden Code ausgemacht?

Gruss
WK

Lin728
25.11.04, 06:26
1.) Naja, das mit den 4mb-ram ist gar nicht so utopisch.
Kernel 2.2.26 mit framebuffer und ein grafisches SDL-Programm als Oberfläche.
Wird zwar eng aber sollte schon gehen....

2.) Jo, aber werden die code-segmente automatisch geshared oder muss man die als not-writeable kennzeichnen, wie das bei shared-libs automatisch der fall ist?

Danke schonmal

derguteweka
25.11.04, 18:52
Moin,

Also nix genaues weiss ich auch nicht - aber mir ist aufgefallen, dass fuer jede shell (busybox) die ich aufmach', der Speicher (Anzeige mittels free) um fast die Groesse des busybox binaries kleiner wird -also vermut' ich mal, dass der code nicht geshared wird, aber ich hab nicht den blassesten Schimmer, wo man solche Sauereien uebehaupt einstellen koennte, wenn man unbedingt wollte. War zum Glueck auch noch nie in der Verlegenheit sowas mal machen zu muessen :)

Gruss
WK

Lin728
25.11.04, 19:30
Hmm, denk ich mir fast, so gesehen könnte ja jedes binary seinen code selbst verändern....

Ich werd das ganze einfach in ne shared-lib stecken, dann wirds schon funtzen ;-)

Danke für eure hilfe

Hirogen2
26.11.04, 21:07
Grüssi!
Problem was ich bei Einsatz von Busybox habe ist, dass ich nicht weiß, ob Linux die code-segmente von executables standardmäßig shared.
Also so wie bei shared libraries nur halt mit binaries, tut es das?
Ich hoffe mal, dass aus Dateien *jeder* Sorte, die die gleiche Inode-Nummer haben, auch alle nur einmal geladen wird. Ein Beweis kann ich z.Zt. leider nicht vorlegen (jetzt keine Lust im Kernelcode nachzugucken), aber zumindest ist das mit mmap() auf die gleiche Datei der Fall -- bzw. muss es bei mmap sogar.


Sonst muss ich busy box in eine shared-lib packen, und einen main()-wrapper rundherumbauen...
Probier's doch aus... mach 'ne test.c:


#include <stdio.h>
#include <unistd.h>
int main(void) {
printf("hallo\n"); // diese zeile ca. 10000 wiederholen, aber nicht in for()!
while(1) { sleep(1); }
}

Dann mit 'free' mal nachgucken, Werte notieren, das Testprog 1000x starten "for((i=0;i<1000;++i)); do ./tprog >/dev/null; done" (sh), dann nochmal mit 'free' nachgucken *wieviel Swap belegt ist*. (Merkt man spätestens wenn der Rechner in die Knie gegangen ist.)