2012-02-08 3 views
4

C 표준 라이브러리의 함수 중 시스템 호출을 찾는 방법이 있습니까? 그들 중 일부는 open, closemalloc과 같이 분명하지만 어떤 종류의 목록을 볼 수 있습니까? 예를 들어 strcpy과 같이 시스템 호출을하거나 time.h의 함수를 사용합니까?C 표준 라이브러리 및 시스템 호출

+2

이것은 구현에 따라 다를 수 있습니다. 관심있는 특정 시스템이 있습니까? – templatetypedef

+0

우 ... 그게 내가 두려워하는 것 같아. : – theshadow322

+0

malloc()이 항상 시스템 호출을하는 것은 아닙니다. – tristan

답변

7

많은 경우 실행 시간이 시스템 호출에 의해 좌우되기 때문에 성능 측면에서 묻는다고 가정합니다.

이제는 구현에 종속적인데 ("시스템 호출"이 있는지 여부에 관계없이 구현에 따라 다름), 추론을하고 추측을 내리는 좋은 방법은 "시스템 호출"을 "사용자 정의" to-kernel-to-user "권한 전환이 필요합니다.

예를 들어 strcpy을 고려하십시오. 한 배열 (프로세스의 메모리 공간)에서 다른 배열 (또한 메모리 공간)까지 문자열을 복사합니다. 이 작업은 문자열을 제외한 모든 데이터와 관련이 없으므로이 작업의 일부로 커널 공간에 들어가는 것은 상당히 병적입니다.

한편, time 기능을 time.h에서 생각해보십시오. 현재 시스템 시간을 반환합니다. 이것은 공유 시스템 자원이므로 현재 시간에 대한 커널의 레코드를 읽으려면 커널 공간을 입력해야한다고 예상 할 수 있습니다. 그리고 전통적으로, 당신은 옳을 것입니다. 그러나 최신 버전의 Linux는 최소한 커널 메모리 페이지를 모든 사용자 프로세스에 읽기 전용으로 매핑합니다.이 정보는 시스템 시간과 같이 커널 만 업데이트 할 수있는 특정 정보가 포함 된 페이지입니다. 프로세스는 비밀 데이터 유출없이 사용자 공간에서 자유롭게 읽을 수 있습니다. 그래서 이것은 더 모호합니다.

마지막으로, 당신은 그들이 권한이 적용되어야하는 공유 자원 (파일 시스템)를 처리하기 때문에 는 반드시 사용자 - 커널로 사용자 전환을 포함해야한다 open 또는 unlink 등의 작업을합니다.

질문에 대한 경험적 접근 방식을 원할 경우 간단한 프로그램을 작성하여 관심있는 각 기능을 호출하고 strace 아래에서 실행할 수 있습니다.

+0

심지어'open'은 반드시 커널 전환을 포함하지 않습니다. 이전 버전의 Windows에서는 콘솔 파일 핸들 (예 : "CONIN $")을 열면 사용자 모드 스텁에서 반환되는 상수 핸들 ("현재 콘솔의 입력 스트림"을 의미)을 얻을 수 있습니다. 이것이 아직도 사실인지 나는 모른다. – arx

+0

나는 POSIX에 부합하는'open' 버전을 추측하고있었습니다. 이미 열려있는 것과 일치하는 파일 설명자를 반환하는 것은 아무데도 적합하지 않습니다. –

1

프로그램이 커널과 통신해야 할 때 시스템 호출이 이루어집니다. strcpy은 인터 럽트가 필요하기 때문에 시스템 호출을하는 것은 매우 비효율적입니다. 코드가 실행을 멈추고, 컨텍스트 스위치가 있고, CPU의 실행 모드가 변경되어 (더 많은 권한을 갖기 위해) 인터럽트 처리기가 실행되고 코드가 계속 실행됩니다. 이것은 OS가 인터럽트 이후에 다른 프로세스를 실행하기로 결정하지 않았거나 (예 : 읽기를 기다리는 동안과 같이) 코드를 모두 잊어 버렸다고 가정합니다.

당신은이 질문에 스스로 답할 수 있습니다.이 기능을 쓸 수 있습니까? (실제로는 가능한가?) 독자는 strcpy를 작성할 수는 있지만 열거 나 읽을 수는 없습니다. 자신 만의 fopen을 작성할 수는 있지만 open을 호출해야합니다.

위키 피 디아에는 좋은 list of catagories for system calls이 있습니다. 시스템 호출이 필요한 시점을 알려줍니다.

This은 어셈블리에서 인터 럽트를 호출하는 방법을 보여줍니다 (유일한 방법은 이렇게하는 코드에 연결할 수 있음).

+0

+1 "이 함수를 작성할 수 있습니까?" 접근 방식을 교육 도구로 사용합니다. 'time' 예제를 통해 완전히 작동하지 않는 경우를 주목하십시오. (커널이 사용자 공간 메모리에 필요한 데이터를 매핑하고 형식을 알고 있다면'time'을 쓸 수 있지만 커널 정보가 변경 될 수 있기 때문에 깨지기 쉽습니다. 따라서 커널 제공 코드를 사용해야합니다 시스템 콜을 피하려면 –