Frage

Ich bin mit Ubuntu 9.10 (Karmic Koala), und ich habe einen Blick auf die jmp_buf Struktur, die einfach ein Array von 12 ints ist. Als ich setjmp verwenden, und übergeben Sie in einer jmp_buf Struktur-4 von 12 Einträge gespeichert werden ausgeschaltet. Diese Einträge sind 4 der Stapelzeiger, Rahmenzeiger, Programmzähler und Rücksendeadresse. Was sind die anderen 8 Einträge für? Sind sie maschinenabhängig? Ist ein weiterer Eintrag der Segmenttabellenbasisregister? Was sonst noch benötigt wird, um ein Thread / Prozess Umgebung richtig wiederherzustellen? Ich sah durch die man-Seite, andere Quellen, aber ich konnte nicht den Assembler-Code für setjmp finden.

War es hilfreich?

Lösung

Auf MacOS X 10.6.2, der Header <setjmp.h> endet mit <i386/setjmp.h>, und dort heißt es:

#if defined(__x86_64__)
/*
 * _JBLEN is number of ints required to save the following:
 * rflags, rip, rbp, rsp, rbx, r12, r13, r14, r15... these are 8 bytes each
 * mxcsr, fp control word, sigmask... these are 4 bytes each
 * add 16 ints for future expansion needs...
 */
#define _JBLEN ((9 * 2) + 3 + 16)
typedef int jmp_buf[_JBLEN];
typedef int sigjmp_buf[_JBLEN + 1];

#else

/*
 * _JBLEN is number of ints required to save the following:
 * eax, ebx, ecx, edx, edi, esi, ebp, esp, ss, eflags, eip,
 * cs, de, es, fs, gs == 16 ints
 * onstack, mask = 2 ints
 */

#define _JBLEN (18)
typedef int jmp_buf[_JBLEN];
typedef int sigjmp_buf[_JBLEN + 1];

#endif

Sie haben wahrscheinlich ähnliche Anforderungen auf Linux finden würden - die jmp_buf enthält genügend Informationen, um den erforderlichen Zustand zu speichern. Und, es zu benutzen, die Sie wirklich brauchen nicht zu wissen, was es enthält; Vertrauen ist alles, was Sie tun müssen, dass die Implementierer es richtig bekam. Wenn Sie die Implementierung verändern wollen, dann brauchen Sie, es zu verstehen, natürlich.

Beachten Sie, dass setjmp und longjmp sind sehr maschinenspezifisch. Lesen Sie Plauger des „ Die Standard-C-Bibliothek “ für eine Diskussion über einige der aufgeworfenen Fragen in deren Umsetzung. Modernere Chips machen es schwieriger, wirklich gut zu implementieren.

Andere Tipps

setjmp / longjmp / sigsetjmp sind stark abhängig von der CPU-Architektur, Betriebssystem und Threading-Modell. Die ersten beiden Funktionen berühmt (oder berüchtigt-je nach POV) erschien in dem ursprünglichen Unix-Kernel als „strukturiert“ Ausweg aus einem ausgefallenen Systemaufruf zum Entspannen, wie aus einem I / O-Fehlern oder anderen unangenehmen Situationen.

Die Bemerkungen der Struktur in /usr/include/setjmp.h (Linux Fedora) sagen Aufrufumgebung, sowie möglicherweise eine gespeicherte Signalmaske. Es enthält /usr/include/bits/setjmp.h zu erklären jmp_buf auf eine Anordnung von sechs 32-Bit ints haben, offenbar spezifisch für die x86-Familie.

Während ich nicht andere Quelle als ein

scroll top