( micsa | 2024. 08. 12., h – 14:17 )

az eredeti kijelentés így hangzott: 

eltérő a stack frame, szóval még gatyába is kell rázni a vermet egy esetleges C függvény hívása és az IRET utasítás kiadása előtt, ami csak Assembly nyelven lehetséges

amiben Első Utolsó Nagy BZT kijelentette, hogy IRET-et csak assembly nyelven lehet...

erre írtam én be, hogy pl. a gcc tud ilyet, olyan kódot generálni, ami használható megszakítás kiszolgálásra (kijavítom: ez egy gcc specifikus extenzió a C-hez, de pl. a clang is tudja... bár ezt sem tudtad felfogni, ugye), nem KELL föltétlenül assemblyben írni. 

A stack-kel sem kell csinálni semmit, mert általában user módban szakad meg a task, a processzor megcsinálja a privilege level váltást, kiszedi a TSS-ből a kernel stack pointert (amit az OS beállított), abba ügyesen elmenti a visszatérési címet, flageket, aztán lefut az ISR és vissza lehet térni. Hardver interruptból általában nincs szükség a stack frame-et matatni és ha nem lesz pl. taszkváltás, akkor NEM KELL CSINÁLNI semmit, simán vissza lehet térni... az iretq meg fogja csinálni a privilege level váltást, ha kell (na jó, van 1-2 dolog, interrupt vezérlő meg babámfüle). Csak szemléltetni akartam, hogy Mr. BZT-nek ez a kijelentése sem állja a helyét: nem kell a "gatyába zárni a vermet".

Ha interrupt handler közben page fault lesz, akkor azt nagy valószínűséggel elcseszted... ez egyszerűen nem történhet meg, gyakorlatilag lekezelhetetlen: nem fogsz tudni egy IO műveletet végrehajtani, amikor egy ISR handlerben vagy. Csak ehhez át kellene látni az egészet, ugye.

 

Nem, amit micsa összerakott, az nem is generált IRETQ-t (mert csak egy prototípus, implementáció nélkül). Annak is hibás (gcc mondja: "error: attributes should be specified before the declarator in a function definition").

Ha megadod a gcc-nek a "-mgeneral-regs-only", akkor szépen lefordítja. Ha beleteszel a függvénybe egy "alma++;"-t akkor kb. ilyen kódot generál:

        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register %rbp
        pushq   %rax
        .cfi_offset %rax, -24
        cld
        leaq    8(%rbp), %rax
        movq    %rax, -16(%rbp)
        movl    alma(%rip), %eax
        incl    %eax
        movl    %eax, alma(%rip)
        popq    %rax
        popq    %rbp
        .cfi_def_cfa %rsp, 8
        iretq

 

szépen látszik az iretq és, hogy az összes regiszter, amit használt (rbp, rax), azokat szépen elmenti... ami elég is lenne, elvileg, gyakorlatilag nem, már mondtam, hogy kell matatni az apic-ot...

 

@pentike: bzt-nek egész konkrétan az a baja, hogy mi itt, páran, nem tetszettünk összeszarni magunkat őfelsége arroganciájától és ego-jától, esetleg meg mertünk kérdőjelezni pár kijelentését, emiatt meg lettünk büntetve, "seggarcnak", "tanulatlan tuskónak", "okoskodó balfasznak", "szar alaknak", "senkiházi hazudozó alaknak", "dilettáns idiótának" lettünk kinevezve, tudniillik ő fedezte fel a spanyolviaszt. Ja nem. Bár, az alátámasztott felvetéseinkre sosem tudott érdemszerűen válaszolni (sőt, szerintem maga a topiknyitás is rengeteg hülyeséget tartalmaz), mi mégis kiűzettünk a birodalomból az ő topikjából. Ja nem, ez egy közösségé, nem bzt-é, bocsánat.

Szóval, mi mind hazudunk és nem értünk hozzá... nincs hozzáfűznivalóm...