2013-12-11 2 views
5

저는 리눅스 어셈블리 언어를 가르쳐 왔으며 BSD와 리눅스의 흥미로운 차이점을 발견했습니다. 유닉스에서는 80h 인터럽트를 호출하기 전에 syscall 매개 변수를 스택에 넣는다. 반대로, 리눅스에서는 매개 변수를 레지스터에 전달합니다.Linux가 Unix syscall 협약을 따르지 않는 이유는 무엇입니까?

누가 리눅스 개발자가 스택 대신 레지스터를 사용하게되었는지 이론적으로 알고 있습니까?

참고 : 차이점을 설명하는 좋은 페이지는 FreeBSD Developer's Handbook:System Calls이며 이유는 설명하지 않습니다.

+0

명확한 아이디어는 아니지만 실행 속도와 위치의 접근 가능성과 관련이 있을지 모릅니다. 누군가가 명확히하기를 기다릴 것입니다. –

+3

BSD가 "유닉스"를하는 이유는 무엇입니까? – unwind

+0

@unwind - 필자의 질문에 포함 된 하이퍼 링크는 BSD가 syscalls에 대한 유닉스 협약을 따르고 Linux는 그렇지 않음을 암시합니다. 그렇지 않습니까? – clay

답변

1

표준 함수 호출 순서가 다르기 때문에 syscall 규약이 다릅니다. 여러분이 x86-32 호출 규칙과 AMD64 호출 규칙의 차이점에 대해 이야기하고 있다고 가정합니다. AMD64 ABI here을 확인하십시오.

하지만 지점에 빨리 도착하려면 this 게시물을 확인하십시오. 기본적으로 속도에 관한 것입니다. 호출 규칙을 변경하고 스택 대신 레지스터를 사용하면 프롤로그 및 통화 에필로그의 지침을 면도 할 수 있습니다.

1

32 비트 코드가있는 일부 레지스터도 사용할 수 있습니다. cdecl, stdcall, pascal 및 fastcall과 같은 32 비트 코드에 대한 몇 가지 호출 규약이 있습니다. Windows 및 Linux는 32 비트 코드에 대해 동일한 호출 규칙을 사용합니다. fastcall (GCC에서 __attribute((fastcall))을 사용하면 처음 두 정수 매개 변수 (일부 컴파일러에서 3 개)가 레지스터가 될 수 있습니다. 다른 호출 규칙은 스택을 사용합니다.

64 비트 코드의 경우 Windows 및 Linux는 다른 호출 규칙을 사용합니다. Linux는 호출 및 Windows 용으로 최대 14 개의 레지스터를 사용할 수 있습니다. 레지스터를 사용하면 코드가 더 빨라질 수 있습니다. 이는 많은 함수 호출을 포함하는 일부 64 비트 코드가 동일한 32 비트 코드보다 빠르게 (10 %) 실행되는 이유 중 일부일 수 있습니다.

관련 문제