2010-05-03 54 views
10

Tôi chỉ muốn hỏi, tôi biết rằng các cuộc gọi hệ thống standart trong Linux được thực hiện bằng cách trỏ chỉ lệnh int vào Bảng ngắt Vector. Tôi cho rằng đây là tương tự trên Windows. Nhưng, làm thế nào để bạn gọi một số quy trình hệ thống cụ thể cấp cao hơn? Chẳng hạn như làm thế nào để bạn bảo Windows tạo một cửa sổ? Tôi biết điều này được xử lý bởi mã trong dll, nhưng những gì thực sự happend ở cấp độ trình hướng dẫn lắp ráp? Liệu các thói quen trong dll gọi phần mềm gián đoạn bởi int hướng dẫn, hoặc là có cách tiếp cận khác nhau để xử lý này? Cảm ơn.Cuộc gọi hệ thống trên Windows

Trả lời

5

Thực hiện cuộc gọi Win32 để tạo cửa sổ không thực sự liên quan đến gián đoạn. Ứng dụng máy khách đã được liên kết với .dll cung cấp cuộc gọi để hiển thị địa chỉ cho trình liên kết sử dụng. Vì bạn đang hỏi về sự khác biệt trong cơ chế gọi, tôi giới hạn cuộc thảo luận ở đây với các cuộc gọi Win32 có sẵn cho bất kỳ ứng dụng nào như trái ngược với các cuộc gọi cấp hạt nhân hoặc trình điều khiển thiết bị. Ở cấp độ ngôn ngữ lắp ráp, nó sẽ giống như bất kỳ cuộc gọi chức năng nào khác vì hầu hết các cuộc gọi Win32 là các cuộc gọi cấp người dùng trong đó thực hiện các cuộc gọi hạt nhân cần thiết. Trình liên kết cung cấp địa chỉ của hàm Win32 làm đích cho một số hướng dẫn phân nhánh, các chi tiết cụ thể sẽ phụ thuộc vào trình biên dịch.

[Chỉnh sửa] Dường như bạn đúng về ngắt và int. bảng vectơ. CodeGuru có một bài viết tốt với các chi tiết hệ điều hành về cách gọi hạt nhân NT làm việc. Liên kết:
http://www.codeguru.com/cpp/w-p/system/devicedriverdevelopment/article.php/c8035

+1

Vâng, tôi biết rằng dll có các cuộc gọi cần thiết bên trong, tôi đã viết điều đó. Nhưng cơ bản tất cả mọi thứ tôi yêu cầu là: Có thói quen dll để vẽ một cửa sổ syscalls dưới dạng phần mềm gián đoạn, hoặc, nếu không, làm thế nào để nó nói với cửa sổ hạt nhân để làm cho một cửa sổ? Được như xa như tôi biết bạn không thể chuyển đổi từ không gian chương trình của bạn đang chạy một cách khác hơn int hướng dẫn bởi vì liml evel limitaion. –

+0

b-gen-jack-o-neill: AFAIK hạt nhân không chịu trách nhiệm quản lý cửa sổ. –

+2

Trên các bộ vi xử lý mới hơn, các lệnh sysenter/sysexit được sử dụng thay vì phát hành một phần mềm gián đoạn với lệnh INT. Khái niệm là như nhau, đó là một cách để chuyển sang chế độ hạt nhân. Một cửa sổ không được quản lý trong kernel mặc dù bạn sẽ không tìm thấy một cuộc gọi hệ thống CreateWindow, thay vào đó nó được xây dựng trên nhiều cuộc gọi hệ thống khác, bao gồm giao tiếp với các quá trình khác - chẳng hạn như trình quản lý cửa sổ – nos

3

API Win32 là lớp chạy trong chế độ người dùng (vòng 3). Windows được sử dụng để hỗ trợ một lớp OS/2 và POSIX API nhưng chúng đã bị loại bỏ và bị loại bỏ. Trình quản lý cửa sổ là mã chế độ người dùng thuần túy, không có cuộc gọi hạt nhân nào được tham gia. Chỉ các cuộc gọi API sử dụng tài nguyên hạt nhân (CreateThread, VirtualAlloc, v.v.) sẽ gọi vào hệ điều hành "thực" (ntdll.dll) và bẫy vào vòng 0 với phần mềm gián đoạn (int 0x2e).

+2

Đây không phải là toàn bộ câu chuyện. Vì NT4 trình quản lý cửa sổ đã ở trong mô hình hạt nhân (win32k.sys) và nó có một bó toàn bộ các syscalls để gọi nó. Ngay cả trước đó, nó đã sống trong CSRSS, và bạn phải gọi qua hạt nhân để có được nó (sử dụng LPC) vì vậy vẫn còn có một cuộc gọi hạt nhân có liên quan. Ngoài ra, Windows đã không sử dụng int 0x2e để vào chế độ hạt nhân trong một thời gian. Nó phụ thuộc vào kiến ​​trúc mà bạn đang sử dụng nhưng thông thường bây giờ nó sử dụng sysenter để vào chế độ hạt nhân trên x86. – Stewart

Các vấn đề liên quan