시스템 호출이 필요할 때 Linux 커널이 어셈블리 언어로 부분적으로 작성되는 이유는 무엇입니까? [폐쇄]

시스템 호출이 필요할 때 Linux 커널이 어셈블리 언어로 부분적으로 작성되는 이유는 무엇입니까? [폐쇄]

커널이 시스템 호출을 사용하지 않습니까, 아니면 이전에 새 시스템에서 어셈블리가 어셈블되었습니까? 아마도 어셈블러에 대한 추가 정보가 필요할 것 같지만 mov[register]와 같은 명령이 시스템 호출인 경우 OS 종속 커널을 참조하지 않고 어떻게 사용할 수 있는지 혼란스럽습니다.

예를 들어, 어셈블러를 만들고 시스템 호출을 사용하기 위해 GNU/Linux 배포판을 사용하고 있다고 가정해 보겠습니다. Linux에 시스템 호출용 커널이 없다면 어셈블리 자체를 어떻게 사용할 수 있습니까?

답변1

mov [register]비슷한 것은 시스템 호출이 아니라 어셈블리 명령입니다.

시스템 호출은 기본적으로 프로세서에 내장되고 호출된 서브루틴이 일반 사용자 공간 프로그램 코드보다 더 높은 권한 수준을 가질 수 있도록 커널에 의해 설정된 메커니즘을 사용하여 커널에서 특정 서브루틴을 호출하는 사용자 공간 프로그램입니다.

조립 지침은 기본적으로 기계어 코드의 실제 바이트를 인간 친화적으로 표현한 것입니다. 기계어 코드는 해석되거나 컴파일되지 않지만 프로세서 마이크로코드를 사용하여 프로세서 내부에서 구현되거나 수많은 논리 게이트를 사용하여 하드웨어 수준에서 직접 구현됩니다.

어셈블리 언어의 단일 시스템 호출은 일반적으로 여러 줄의 코드입니다. 먼저 시스템 호출의 매개변수가 적절한 프로세서 레지스터 및/또는 스택에 로드된 다음 int 0x80또는 같은 특수 명령어가 syscall실제로 시스템 호출을 만드는 데 사용됩니다.

32비트 x86 아키텍처에서 int 0x80시스템 호출 명령어로 사용됩니다. 커널은 프로세서에 대한 소프트웨어 인터럽트 처리 루틴 테이블을 준비합니다. 이 테이블은 일반 사용자 공간 코드로 직접 액세스할 수 없지만 int테이블이 가리키는 루틴 중 하나는 사용자 공간 코드를 사용하여 트리거될 수 있습니다. int 0x80프로세서에게 커널 모드로 전환하고 테이블의 슬롯 #128에 있는 주소가 있는 루틴으로 점프하도록 지시하기만 하면 됩니다. 이 루틴은 Linux 32비트 x86 아키텍처용 시스템 호출 인터페이스입니다. 지정된 인수를 확인하고 호출한 프로세스를 식별한 후 적절한 서브루틴으로 점프합니다.

syscall64비트 버전의 x86 아키텍처에는 동일한 목적을 위한 전용 명령어가 있습니다 . 사실 32비트 x86 아키텍처에도 지금은 있지만 리누스 토발즈가 32비트 리눅스 시스템 호출 규칙을 설계할 당시에는 존재하지 않았거나 일부 프로세서 모델에서 명령어에 하드웨어 버그가 있어서 사용하지 않고 있다. 그것에. 그러나 모든 64비트 x86 프로세서에는 이 syscall명령어가 있고 작동하므로 이를 사용하십시오.

관련 정보