시스템 콜

커널에서 제공하는 저수준의 API를 사용하는걸 시스템 콜이라고 하는데, 이 호출이 어떤 식으로 이뤄지는지 생각해본적이 있는가?

시스템 콜은 커널의 코드를 실행하겠다는 뜻인데, 사용자 영역의 앱이 직접적으로 커널의 코드를 실행할 수 있을까? 물론 그럴 수 없다.

 

그럼 어떻게 ?

사용자 영역의 앱이 시스템 콜을 사용하려한다는 시그널을 커널로 보낼 수 있다.

( 아키텍처마다 약간씩 메커니즘이 다를 수는 있는데 기본 원리는 같음 )

 

i386 아키텍처에서는 인터럽트 명령에 0x80 값을 넣어 주면 시스템 콜을 사용한다는 뜻.

MOV EAX, 5
INT 0x80

 

위에서 인터럽트 명령 전에 EAX 레지스터5를 담았는데, 5는 open() 시스템 콜을 의미한다.

( 각각의 시스템 콜마다 정해진 숫자값이 있음 )

 

위에서는 생략했는데, 시스템 콜의 매개변수는 각각 EBX, ECX, EDX, ESI, EDI 레지스터에 담는다.