In der Montage,wie gehen Sie mit C struct?
Beispielsweise,wie bereiten Parameter für diese syscall sys_wait4
:
asmlinkage long sys_wait4(pid_t pid,unsigned int __user *stat_addr, int options, struct rusage __user *ru)
1120 {
Umgang mit struct rusage
in der Montage?
Hello world " - Beispiel zum Umgang mit struct
in der Montage ist genug für mich:)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Mitglieder einer
struct
angelegt werden sequenziell im Speicher, gegebenenfalls mit Auffüllung und die Adresse der Struktur struct ist in der Regel die Adresse des ersten Elements.Lassen Sie uns sagen, dass
&f
ist0x10
. Dann&f.b.x
(das erste Element das erste ElementFoo
) ist auch0x10
.&f.b.y
ist0x14
, daf.b.x
ist vier bytes (unter der Annahme einer 32-bit Maschine).&f.d
ist0x18
, und&f.i
ist0x20
. Die erste Adresse, ist nicht belegt vonf
(in anderen Worten,&f + 1
) ist0x24
.So alle Sie tun müssen, um in der Montage ist sicherzustellen, dass Sie haben (stack oder heap) Raum für die Mitglieder des Struktur-und füllen den Raum mit entsprechenden Daten, und geben die Adresse des ersten Elements an die Funktion.
Als ein Beispiel, tatsächlich beinhaltet die Montage, können Sie leicht zu produzieren, dass Sie sich durch das schreiben ein kleines test-Programm und kompiliere es mit
gcc -S -O0 -g
, das Assembler-code für Ihren C-code. Zum Beispiel:In der Versammlung Ausgabe werden Sie unter anderem sehen (Hinweis: dies ist die 64-bit ASM):
Wie Sie sehen können, werden die Werte 42, 9, (integer, deren bit-Muster ist, dass die 3,14), und 8, geladen in die Adressen -32, -28, -24 und -16 (relativ zum base pointer). Ich habe nur eine Solaris-Kiste griffbereit, so konnte ich nicht verwenden
asmlinkage
(die gibt an, dass die Funktion Argumente übergeben werden müssen, die auf dem stack statt in den Registern), so unmittelbar vor dem Aufruf der Funktion sehen wir die effektive Adresse der struct wird in ein register geladen:Mit
asmlinkage
Sie lieber sehen, diese effektive Adresse wird auf dem Stapel abgelegt.struct sockaddr_in*
zustruct sockaddr*
). Gibt es eine ähnliche Garantie, die bedeutet, dass Sie verwenden könnenoffsetof()
.