2016-09-19 45 views
5

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ą

+2

'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. –

+0

Następnym razem - najpierw skorzystaj z Google! –

Odpowiedz

7

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.

+0

[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) –

7

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.

+1

, 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'? –

+1

Tak, to w zasadzie słuszne. – Jester

+0

Spojrzałem na to pytanie zbyt szybko, aby zauważyć, jak został użyty. –