답변:
시스템 호출은 아키텍처에 따라 다르지만 모두 유사한 특성을 공유합니다.
x86에서 시스템 호출은 소프트웨어 인터럽트 나 특별한 "systenter"명령을 통해 수행됩니다. Linux는 둘 중 하나를 사용할 수 있지만 소프트웨어 인터럽트가 가장 일반적입니다. 부팅시 커널은 인터럽트 핸들러를 설정합니다. 인터럽트는 하드웨어에서 생성 된 인터럽트와 소프트웨어에서 생성 된 인터럽트를 모두 설정합니다. x86에는 소프트웨어 인터럽트를 생성하는 특수 어셈블리 명령어 'int'가 있습니다. 커널은 소프트웨어 인터럽트 0x80이 시스템 호출 인터럽트가되도록 처리기를 설정했습니다.
이 테이블 가능한 각 시스템 호출과 매개 변수 및 전달 방법을 보여줍니다. 보시다시피, eax 레지스터의 숫자는 시스템 호출을 나타냅니다. 다른 레지스터는 시스템 호출에 대한 일부 매개 변수를 가리 킵니다.
따라서 유저 랜드 소프트웨어는 레지스터에 정확한 파라미터를 설정하고 인터럽트 0x80을 발생시킵니다. 커널은 시스템 호출을 해석하고, 함수를 수행하고, 가능한 모든 반환 값으로 레지스터를 수정 한 리턴 값으로 설정되는 핸들러를 가지고있다.
래퍼 함수는 일반적으로 이식성있는 방식으로 모든 작업을 수행하지만 C / C ++ 코드에 인라인 어셈블리를 작성하여 직접 시스템 호출을 수행 할 수는 없습니다. 어셈블리의 기본 지식 만 필요합니다. 올바른 데이터를 올바른 레지스터로 이동 한 다음 'int 0x80'을 실행하십시오.
sysenter
대신 명령을 사용할 수 있습니다. trilithium.com/johan/2005/08/linux-gate