2014-12-29 13 views
8

Obecnie jestem w trakcie sprawdzania, co należy zrobić, aby jądro Linuksa zostało uruchomione. Przeglądałem drzewo źródłowe jądra Linux, w szczególności architektury ARM, dopóki nie natknąłem się na tę instrukcję montażu retne lr w arch/arm/kernel/hyp-stub.S Jest zrozumiałe, że instrukcja powinna powrócić do adresu zapisanego w łączu zarejestruj się, jeśli flaga Z to 0. To, czego szukam, to miejsce, w którym instrukcja montażu ARM jest faktycznie udokumentowana.Instrukcja "retne" instrukcji ARM

Szukałem w sekcji A8.8 ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition i nie mogłem znaleźć opisu instrukcji.

Pomijanie źródeł i sprawdzanie, czy było to ARM specific GNU AS extension, nie spowodowało niczego szczególnego.

Wyszukiwanie w wyszukiwarce Google z zapytaniami "instrukcja wycofania zespołu ramienia", "instrukcja powrotu ramienia" i wszystko, co jest podobne, nie okazało się przydatne. Z pewnością muszę szukać w niewłaściwych miejscach, albo czegoś brakuje.

Wszelkie wyjaśnienia będą mile widziane.

Odpowiedz

11

Język asemblacji architektonicznej to jedno, a kod świata to kolejna. Gdy w grę wchodzą pseudooperacje i makra asemblera, znajomość zarówno toolchaina, jak i bazy kodu, bardzo pomaga. Linux jest szczególnie nieprzyjemny, ponieważ wiele źródeł zespołu zawiera wiele warstw makr asemblera i makr CPP. Jeśli wiesz, czego szukać, a śladem nagłówek arch/arm/include/asm/assembler.h, w końcu znaleźć ten skomplikowany bestia

.irp c,,eq,ne,cs,cc,mi,pl,vs,vc,hi,ls,ge,lt,gt,le,hs,lo 
.macro ret\c, reg 
#if __LINUX_ARM_ARCH__ < 6 
     mov\c pc, \reg 
#else 
     .ifeqs "\reg", "lr" 
     bx\c \reg 
     .else 
     mov\c pc, \reg 
     .endif 
#endif 
     .endm 
     .endr 

Celem tego jest emit the architecturally-preferred return instruction na rzecz microarchitectures with a return stack, pozwalając jednocześnie ten sam kod, aby nadal kompilacja dla starszych architektur.

+3

Zobacz także odpowiednią wiadomość o zatwierdzeniu (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/arch/arm/kernel/hyp-stub.S? id = 6ebbf2ce437b33022d30badd49dc94d33ecfa498). – Jester

+0

Po prostu szukałem tego, dziękuję;) – Notlikethat

+0

Nic dziwnego, że pomijanie źródeł i sprawdzanie, czy jest to specyficzne dla ARM rozszerzenie GNU AS, również się nie pojawiało. Dziękuję, to doskonale to wyjaśnia. – jrcatbagan

Powiązane problemy