![커널의 결과가 어떤 프로세스로 반환되었습니까?](https://rvso.com/image/52097/%EC%BB%A4%EB%84%90%EC%9D%98%20%EA%B2%B0%EA%B3%BC%EA%B0%80%20%EC%96%B4%EB%96%A4%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%A1%9C%20%EB%B0%98%ED%99%98%EB%90%98%EC%97%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
프로세스에 커널 모드가 필요한 작업이 필요한 경우 시스템 호출을 사용합니다. 그렇다면 결과는 어떻게 프로세스에 반환됩니까?
답변1
메모:아래의 모든 정보는 참조 사이트에서 가져온 것입니다.
에서이것링크를 타고 아래 정보를 찾았습니다.
ㅏ시스템 호출사용자 공간 애플리케이션과 커널이 제공하는 서비스 간의 인터페이스입니다. 커널에서 서비스를 제공하기 때문에 직접 호출이 불가능하다. 대신 사용자 공간/커널 경계를 넘는 프로세스를 사용해야 합니다.
시스템 호출 사용
사용자 공간 애플리케이션에서 이를 사용하는 데 필요한 것이 무엇인지 살펴보겠습니다. 새로운 커널 시스템 호출을 사용할 수 있는 방법에는 두 가지가 있습니다. 첫 번째는 편리한 방법(프로덕션 코드에서는 수행하고 싶지 않은 작업)이고, 두 번째는 좀 더 많은 작업이 필요한 전통적인 방법입니다. 첫 번째 방법을 사용하면 syscall 함수를 통해 인덱스로 식별된 새 함수를 호출합니다. 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;
}
보시다시피, syscall 함수는 사용할 시스템 호출 테이블의 인덱스를 첫 번째 인수로 포함합니다. 전달할 인수가 있는 경우 호출 인덱스 뒤에 제공됩니다. 대부분의 시스템 호출에는 _에 대한 매핑을 지정하는 SYS_ 기호 상수가 포함되어 있습니다.NR인덱스. 예를 들어, 다음과 같이 syscall을 사용하여 인덱스 __NR_getpid를 호출합니다.
syscall( SYS_getpid )
syscall 함수는 아키텍처에 따라 다르지만 제어를 커널로 전송하는 메커니즘을 사용합니다. 인수는 _ 매핑을 기반으로 합니다.SYS에 대한 NR 인덱스제공되는 기호 /usr/include/bits/syscall.h
(libc가 빌드될 때 정의됨) 이 파일을 직접 참조하지 마십시오. 대신 /usr/include/sys/syscall.h
.