2013-12-11 14 views
5

Uczę się języka asemblerowego Linuksa i natknąłem się na interesującą różnicę między BSD i Linuksem. W Uniksie, przed wywołaniem przerwania 80h, należy przesłać parametry syscall na stosie; w przeciwieństwie do tego, w Linuksie przekazujesz swoje parametry w rejestrach.Dlaczego Linux nie stosuje się do konwencji uniksowej?

Czy ktoś wie, jakie było uzasadnienie dla deweloperów Linuksa w rejestrach zamiast stosu?

Uwaga: oto dobra strona opisująca tę różnicę: FreeBSD Developer's Handbook:System Calls bez wyjaśnienia racjonalnego uzasadnienia.

+0

brak jasnego pomysłu, ale może jest to związane z szybkością wykonania i dostępności lokalizacji? poczeka, aż ktoś to wyjaśni. –

+3

Dlaczego nazywacie to, co BSD robi "Unixem"? – unwind

+0

@unwind - hiperłącze, które zawarłem w moim pytaniu sugeruje, że BSD podąża za konwencjami Unix dla syscalls, a Linux nie. Czy jest inaczej? – clay

Odpowiedz

1

Konwencja syscall jest inna, ponieważ standardowa sekwencja wywoływania funkcji jest inna. Zakładam, że mówisz o różnicy między konwencją wywołania x86-32 a konwencją wywołania AMD64. Możesz sprawdzić AMD64 ABI here.

Ale jeśli chcesz dostać się do sedna, szybko sprawdź wpis: this. Zasadniczo chodzi o szybkość. Zmieniając konwencję wywołującą i używając rejestrów zamiast stosu, można zgasić instrukcje w prologu i epilogu połączenia.

1

Możesz użyć niektórych rejestrów również z kodem 32-bitowym. Istnieje kilka konwencji wywoływania dla kodu 32-bitowego: cdecl, stdcall, pascal i fastcall. Systemy Windows i Linux używają tych samych konwencji wywoływania dla 32-bitowego kodu. Z fastcall (__attribute((fastcall) w GCC) pierwsze dwa parametry całkowite (3 z niektórymi kompilatorami) mogą być rejestrami. Inne konwencje wywoływania używają stosu.

Dla kodu 64-bitowego Systemy Windows i Linux używają różnych konwencji wywoływania. Linux może korzystać z maksymalnie 14 rejestrów dla połączeń i tylko z systemu Windows sześć. Korzystanie z rejestrów może przyspieszyć działanie kodu. Może to być częścią tego, że niektóre 64-bitowe kody z wieloma funkcjami wywołują O (10%) szybciej niż ten sam 32-bitowy kod.

Powiązane problemy