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. –
- 1. nanosleep użycia wysokiego cpu?
- 2. węzeł js cpu 100%
- 3. 99% CPU, 3.51MB bez typedef
- 4. Yesod devel cpu overhead
- 5. Powinowactwo OpenMP i CPU
- 6. MySQL high CPU usage
- 7. Jak sen zjada CPU php
- 8. Algorytm pomiaru częstotliwości zespołu CPU
- 9. jak ustawić powinowactwo CPU programu?
- 10. trampolina pobiera za dużo CPU
- 11. Badanie procesu Pythona, aby zobaczyć, co się jedzenia CPU
- 12. Unikać konwersja strona CPU z texImage2D Firefox
- 13. Zrozumienie Linux top CPU wyjście wykorzystanie
- 14. profiler gperftools cpu nie obsługuje wielu procesów?
- 15. . Kod spowolniony w procesorze AMD Opteron CPU
- 16. CPU Wykorzystanie wysokiej do spania przetwarza
- 17. Jak interpretować czasu procesora CPU vs procentach
- 18. Linux utknął w soft lockup CPU?
- 19. Co oznacza protokół gs?
- 20. Kolejki Artisan Laravel - użycie wysokiego cpu
- 21. C Pętla główna bez 100% cpu
- 22. Pin procesor CPU Izolacja na Windows
- 23. AWS EC2 Wysokie alarmy CPU wychodzące
- 24. Polecenie znalezienia procesu wykorzystującego zbyt dużo CPU
- 25. cpu vs gpu - kiedy procesor jest lepszy
- 26. Java: Matcher.find przy użyciu wysokiego cpu
- 27. Jak skorzystać z multi-cpu w C++?
- 28. Co robi asm ("pauza") i dlaczego go używać?
- 29. Co robi ((nazwa struktury *) 0) -> członek) w C?
- 30. Co robi x >>> 0?
'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! –