2010-12-17 6 views
2

Ich habe die folgende in sich geschlossene Funktion (d. H. Es ist zu verwenden bl CheckStackFunc verzweigt) und ich bin hinsichtlich seines Zwecks mystifiziert. Könnte jemand, der mit der PowerPC-Montage vertraut ist, etwas ausrichten?Was macht diese Stapelprüfung der PPC-Baugruppe?

_CheckStackFunc: 
    neg  %r11, %r12 
    addi %r0, %r11, 0xFFF 
    srawi. %r0, %r0, 0xC 
    blelr 
    mr  %r11, %sp 
    mtctr %r0 
loc_10176B0C:       
    lwzu %r0, -0x1000(%r11) 
    bdnz loc_10176B0C 
    blr 

Das heißt worden, ich bin mit this Dokument von IBM als Referenz meiner PPC Montag. Wird dies als die definitive Quelle angesehen oder gibt es andere, denen ich bewusst sein sollte?

Antwort

3

Ich bin überhaupt mit PPC nicht vertraut, aber hier ist meine Vermutung:

Es ist wie alloca_probe() mir aussieht. Der Code berührt den Stapel mit Schritten einer Seite, so dass es die PAGE_GUARD Ausnahmen auslösen würde. (Bitte entschuldigen Sie meine x86-Sprache :))

Es wird nach einer großen Stapelzuweisung verwendet (das kann auch durch alloca getan werden). Der Stapel hat normalerweise nicht den gesamten für den Stapel reservierten Speicher, die letzte tatsächlich geladene Seite hat ein spezielles Flag, PAGE_GUARD, das eine Hardware-Ausnahme auslöst, die vom Betriebssystem abgefangen wird, so dass es mehr Seiten an den Stapel binden kann. Wenn der Stapel normal verwendet wird (mit Push/Pop), kann diese Seite nicht umgangen werden. Bei größeren Zuteilungen ist jedoch ein Anruf an alloca_probe() erforderlich, bevor der Speicher sicher verwendet werden kann.

+0

Brilliant, das sieht aus, als ob es genau ist, was es ist. Vielen Dank für die schnelle Antwort - und die Ausarbeitung. Sehr geschätzt. –

+0

Gern geschehen. Ich habe einige Zeit mit 'alloca_probe' verbracht. – ruslik