시스템 호출 실행 방법 [닫힘]


2

응용 프로그램 프로그래머의 관점에서 시스템 호출은 랩퍼 라이브러리에서 프로 시저를 호출하는 것입니다. 내가 조립에 대해 잘 알지 못했기 때문에 어떻게 그것이 가장 낮은 수준에서 행해지는지 궁금해하고있었습니다. 라이브러리를 사용하지 않고 응용 프로그램이 시스템 호출을 어떻게 호출 할 수 있습니까?


1
시스템 호출은 라이브러리에서 프로 시저를 호출하는 것이 아닙니다.
Maria Ines Parnisari

답변:


3

시스템 호출은 아키텍처에 따라 다르지만 모두 유사한 특성을 공유합니다.

x86에서 시스템 호출은 소프트웨어 인터럽트 나 특별한 "systenter"명령을 통해 수행됩니다. Linux는 둘 중 하나를 사용할 수 있지만 소프트웨어 인터럽트가 가장 일반적입니다. 부팅시 커널은 인터럽트 핸들러를 설정합니다. 인터럽트는 하드웨어에서 생성 된 인터럽트와 소프트웨어에서 생성 된 인터럽트를 모두 설정합니다. x86에는 소프트웨어 인터럽트를 생성하는 특수 어셈블리 명령어 'int'가 있습니다. 커널은 소프트웨어 인터럽트 0x80이 시스템 호출 인터럽트가되도록 처리기를 설정했습니다.

이 테이블 가능한 각 시스템 호출과 매개 변수 및 전달 방법을 보여줍니다. 보시다시피, eax 레지스터의 숫자는 시스템 호출을 나타냅니다. 다른 레지스터는 시스템 호출에 대한 일부 매개 변수를 가리 킵니다.

따라서 유저 랜드 소프트웨어는 레지스터에 정확한 파라미터를 설정하고 인터럽트 0x80을 발생시킵니다. 커널은 시스템 호출을 해석하고, 함수를 수행하고, 가능한 모든 반환 값으로 레지스터를 수정 한 리턴 값으로 설정되는 핸들러를 가지고있다.

래퍼 함수는 일반적으로 이식성있는 방식으로 모든 작업을 수행하지만 C / C ++ 코드에 인라인 어셈블리를 작성하여 직접 시스템 호출을 수행 할 수는 없습니다. 어셈블리의 기본 지식 만 필요합니다. 올바른 데이터를 올바른 레지스터로 이동 한 다음 'int 0x80'을 실행하십시오.


1
리눅스에서는 sysenter 대신 명령을 사용할 수 있습니다. trilithium.com/johan/2005/08/linux-gate
LawrenceC

@ultrasawblade 나는 그것을 언급 해 주셔서 감사합니다.
Dougvj
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.