프로세스에 커널 모드 작업이 필요한 경우 시스템 호출을 사용합니다. 그렇다면 결과는 어떻게 프로세스에 반환됩니까?
답변1
노트:아래의 모든 정보는 참고 웹사이트에서 가져온 것입니다.
~에서이것링크를 통해 다음 정보를 찾았습니다.
ㅏ시스템 호출커널이 제공하는 사용자 공간 애플리케이션과 서비스 간의 인터페이스입니다. 이 서비스는 커널에서 제공되므로 직접 호출할 수 없으며 대신 사용자 공간/커널 경계에 걸쳐 있는 프로세스를 사용해야 합니다.
시스템 호출 사용
사용자 공간 애플리케이션에서 이를 사용하는 데 필요한 것이 무엇인지 살펴보겠습니다. 새로운 커널 시스템 호출을 사용하는 방법에는 두 가지가 있습니다. 첫 번째는 편리한 방법(프로덕션 코드에서는 이 작업을 수행하고 싶지 않을 것임)이고, 두 번째는 더 많은 작업이 필요한 전통적인 방법입니다. 첫 번째 방법을 사용하면 시스템 호출 함수를 통해 인덱스로 식별된 새 함수를 호출합니다. syscall 함수를 사용하면 시스템 호출의 호출 인덱스와 매개변수 세트를 지정하여 시스템 호출을 호출할 수 있습니다. 예를 들어 아래에 표시된 짧은 애플리케이션은 sys_getjiffies
해당 인덱스를 사용하여 애플리케이션을 호출합니다.
#include <linux/unistd.h>
#include <sys/syscall.h>
#define __NR_getjiffies 320
int main()
{
long jiffies;
jiffies = syscall( __NR_getjiffies );
printf( "Current jiffies is %lx\n", jiffies );
return 0;
}
보시다시피, 시스템 호출 함수는 사용할 시스템 호출 테이블에 대한 인덱스를 첫 번째 인수로 사용합니다. 매개변수를 전달해야 하는 경우 index를 호출한 후 매개변수가 제공됩니다. 대부분의 시스템 호출에는 _에 대한 매핑을 지정하기 위한 SYS_ 기호 상수가 포함되어 있습니다.NR색인. 예를 들어, syscall을 사용하여 인덱스 __NR_getpid를 호출할 수 있습니다.
syscall( SYS_getpid )
시스템 호출 기능은 아키텍처에 따라 다르지만 제어를 커널로 전송하는 메커니즘을 사용합니다. 이 매개변수는 _의 매핑을 기반으로 합니다.SYS에 대한 NR 인덱스제공되는 기호 /usr/include/bits/syscall.h
(libc를 빌드할 때 정의됨) 이 파일을 직접 참조하지 말고 대신 /usr/include/sys/syscall.h
.