Kiedy czytam kod źródłowy xv6, jestem mylić o składni poniższej deklaracji. Czy ktoś może mi to wyjaśnić?Co robi deklarację „extern struct cpu cpu * asm («% GS: 0»);” oznaczają
Odpowiedz
Zakładam, że rozumiesz, co oznacza extern struct cpu *cpu
. Pytanie, które masz, brzmi: Co oznacza część asm("%gs:0")
?
Ten kod używa rozszerzenia gcc o nazwie asm labels, aby powiedzieć, że zmienna cpu
jest zdefiniowana przez łańcuch asemblera %gs:0
.
nie jest to w jaki sposób to rozszerzenie ma być używany i jest uważana za hack.
Istnieje doskonała dyskusja na temat gs (i fs) here, ale w skrócie gs wskazuje na lokalną pamięć bieżącego wątku. Format danych na gs zależy od twojego systemu operacyjnego (Windows jest bardzo inny niż Linux). Ten konkretny kod mówi, że po przesunięciu 0
z gs, znajduje się wskaźnik do struct cpu
.
[Zobacz dyskusję na temat ostatnich dwóch egzemplarzach] (https://stackoverflow.com/questions/47917027/what-does-asm-suffix-mean-in-given-code/47917087?noredirect=1#comment82802441_47917087) w przypadkach, w których hack albo nie kompiluje się + montuje (32-bitowy kod PIC, albo jakikolwiek kompilator próbuje "przemieścić" adres do rejestru jako bezpośredni), albo gorzej, gdy kompiluje, ale używa złego adresu (64-bitowy kod przy użyciu adresowania względnego RIP) –
Jest to szczególny przypadek asm label. Instruuje kompilator do emisji %gs:0
zamiast zwykłej nazwy symbolu, jeśli odwołujesz się do zmiennej cpu
. Najprawdopodobniej %gs
został wcześniej skonfigurowany jako obszar przechowywania dla procesora, z wskaźnikiem struct cpu
w punkcie zerowym. Celem jest umożliwienie każdemu procesorowi dostępu do własnych danych.
, więc to tylko wywołuje pamięć, która jest przesunięta o 0 bajtów w segmencie, do którego odnosi się gs 'cpu'? –
Tak, to w zasadzie słuszne. – Jester
Spojrzałem na to pytanie zbyt szybko, aby zauważyć, jak został użyty. –
'asm' po deklaracja zmiennej zwykle pozwala określić nazwę zmiennej w celach sprzężeń, ale w tym przypadku, nie jesteś podając nazwę w ogóle, ale raczej odniesienie rejestr rodzaju. –
Następnym razem - najpierw skorzystaj z Google! –