2010-05-03 4 views
10

그냥 물어보고 싶은데, 리눅스에서 standart 시스템 호출이 인터럽트 벡터 테이블을 가리키는 int 명령어로 수행된다는 것을 알고 있습니다. 나는 이것이 Windows에서 비슷하다고 가정합니다. 그러나 좀 더 높은 수준의 특정 시스템 루틴을 어떻게 호출합니까? 당신은 창문을 창문에 어떻게 만들라고 말합니까? 이 DLL에서 코드에 의해 처리되는 알아,하지만 실제로 어셈블러 - 지시 수준에서 happend? DLL의 루틴은 int 명령어로 소프트웨어 인터럽트를 호출합니까, 아니면이를 처리 할 수있는 다른 접근법이 있습니까? 감사.Windows에서 시스템 호출

답변

5

창을 만들기 위해 Win32 호출을 만드는 것은 실제로 인터럽트와 관련이 없습니다. 클라이언트 응용 프로그램은 이미 링커에서 사용할 주소를 제공하는 호출을 제공하는 .dll과 연결되어 있습니다. 호출 메 커니 즘의 차이점에 대해 묻기 때문에 여기에서는 커널 레벨 호출이나 장치 드라이버와는 달리 모든 응용 프로그램에서 사용할 수있는 Win32 호출에 대해 설명합니다. 어셈블리 언어 수준에서는 대부분의 Win32 호출이 내부적으로 필요한 커널 호출을 수행하는 사용자 수준 호출이기 때문에 다른 함수 호출과 동일합니다. 링커는 일종의 분기 명령의 대상으로 Win32 함수의 주소를 제공합니다. 구체적인 사항은 컴파일러에 따라 다릅니다.

[편집] 당신이 인터럽트와 int에 대해 옳은 것처럼 보입니다. 벡터 테이블. CodeGuru에는 NT 커널 호출 작동 방식에 대한 OS 세부 정보가있는 좋은 기사가 있습니다. 링크 :
http://www.codeguru.com/cpp/w-p/system/devicedriverdevelopment/article.php/c8035

+1

네, dll에 필요한 호출이 있음을 알고 있습니다. 하지만 기본적으로 내가 원하는 모든 것입니다 : 소프트웨어 인터럽트의 형태로 Windows syscalls을 그리는 dll 루틴을 가지고 있습니까? 그렇지 않은 경우 Windows 커널에 창을 표시하는 방법은 무엇입니까? 내가 아는 한, 당신의 프로그램이 링벨 레벨 제한 때문에 int 명령어보다 다른 방법으로 움직일 수는 없다는 것을 알 수 있습니다. –

+0

b-gen-jack-o-neill : AFAIK 커널은 창 관리를 담당하지 않습니다. –

+2

최신 프로세서에서는 INT 명령어로 소프트웨어 인터럽트를 실행하는 대신 sysenter/sysexit 명령어가 사용됩니다. 개념은 동일합니다. 커널 모드로 전환하는 방법입니다. 윈도우는 커널에서 관리되지 않지만 CreateWindow 시스템 호출을 찾지 못합니다. 대신 윈도우 관리자와 같은 다른 프로세스와의 통신을 포함하여 수많은 다른 시스템 호출을 기반으로 빌드됩니다. – nos

3

Win32 API는 사용자 모드 (링 3)로 실행되는 레이어입니다. Windows는 또한 OS/2 및 POSIX API 계층을 지원하는 데 사용되었지만 사용되지 않아 제거되었습니다. 창 관리자는 순수 사용자 모드 코드이며 커널 호출이 필요하지 않습니다. 커널 리소스 (CreateThread, VirtualAlloc 등)를 사용하는 API 호출 만이 "실제"운영 체제 (ntdll.dll)를 호출하고 소프트웨어 인터럽트 (int 0x2e)로 링 0에 트랩합니다.

+2

이것은 전체적인 이야기는 아닙니다. NT4 이후 윈도우 매니저는 커널 모델 (win32k.sys)에 있었고, 그것을 호출하기위한 전체 시스템 콜을 가지고있다. 그 전에도 CSRSS에 살았으므로 커널을 통해 호출하여 (LPC를 사용하여) 커널 호출을 수행해야했습니다. 또한 Windows는 int 0x2e를 사용하여 잠시 동안 커널 모드에 들어 가지 않습니다. 어떤 아키텍처를 사용하는지에 따라 다르지만 일반적으로 현재는 x86을 사용하여 x86에서 커널 모드로 전환됩니다. – Stewart