Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 19 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
19
Dung lượng
142,22 KB
Nội dung
Các đối tượng Kernel Dispatcher (Kernel Dispatcher Objects ) Các đối tượng Kernel Dispatcher (Kernel Dispatcher Objects ) Bởi: Khoa CNTT ĐHSP KT Hưng Yên Kernel cung cấp năm kiểu đối tượng đồng hóa mà bạn sử dụng để kiểm soát luồng luồng không chuyên quyền Nhìn thấy Bảng 4-1 cho tóm lược kiểu đối tượng thu phát nhân sử dụng họ Vào vài khoảnh khắc, số đối tượng hai trạng thái: báo hiệu hay - báo hiệu Tại lần thừa nhận cho bạn để ngăn chặn luồng văn cảnh bạn chạy, bạn đợi nhiều đối tượng để đạt đến báo hiệu trạng thái việc gọi KeWaitForSingleObject hay KeWaitForMultipleObjects Kernel cung cấp thủ tục cho kKhởi tạo kiểm soát tình trạng đối trượng Bảng 4-1 Những đối tượng thu phát Kernel Đối tượng Kiểu liệu Mô tả Event KEVENT Ngăn chặn luồng luồng khác phát kiện xuất Semaphore Được sử dụng thay kiện KSEMAPHORE gọi số lượng chờ đợi chuyên quyền thỏa mãn Mutex KMUTEX Loại trừ luồng khác từ việc thực mục đặc biệt mã Timer KTIMER Thực trì hoãn luồng thời gian cho 1/19 Các đối tượng Kernel Dispatcher (Kernel Dispatcher Objects ) Thread KTHREAD Ngăn chặn luồng luồng khác hoàn thành Trong vài mục tiếp theo, Tôi mô tả để sử dụng đối tượng thu phát kernel Tôi bắt đầu việc giải thích bạn ngăn chặn luồng việc gọi nguyên thủy chờ đợi, sau Tôi bàn luận thủ tục hỗ trợ mà bạn sử dụng với toàn kiểu đối tượng Tôi kết thúc mục việc bàn luận khái niệm liên quan báo động luồng giao hàng gọi thủ tục không đồng Để hiểu thừa nhận trình điều khiển WDM để ngăn chặn luồng đối tượng thu phát kernel Nói chung, dù luồng thực lúc phần mềm hay ngắt phần cứng tiếp tục luồng thời xử lý kernel ngắt Chúng nói việc thực mã kernel-mode văn cảnh luồng thời Trong đáp lại tới ngắt cách thức khác nhau, lập lịch biểu có lẽ định chuyển luồng, tất nhiên, trường hợp luồng trở nên " hành." Thông thường, trình điều khiển mức- cao biết cho chắn điều vận dụng văn cảnh luồng không chuyên quyền Giả sử cho phép bạn liên lạc thường lệ trình điều khiển mức- thấp hơn, bạn ngạc nhiên hay không bạn gọi luồng chuyên quyền Nếu trình điều khiển mức- cao trực tiếp gửi bạn IRP từ liên lạc thường lệ nó, bạn làm gốc, không chuyên quyền, luồng Nhưng giả thiết trình điều khiển có mang IRP vào hàng đợi sau trả lại tới ứng dụng Trình điều khiển loại bỏ IRP từ hàng đợi luồng chuyên quyền sau gửi hay IRP khác đến bạn Trừ phi bạn biết điều không xảy ra, bạn cần phải giả thiết bạn luồng chuyên quyền bạn trình điều khiển mức- cao Mặc dù điều mà Tôi nói, nhiều hoàn cảnh bạn chắn văn cảnh luồng Các thủ tục DriverEntry AddDevice bạn gọi luồng hệ thống mà bạn ngăn chặn bạn cần tới Bạn chiến không thắng thường cần tới khối rõ ràng bên thủ tục này, bạn bạn muốn tới Bạn nhận yêu cầu IRP_MJ_PNP luồng hệ thống Trong nhiều trường hợp, bạn phải ngăn chặn luồng để xử lý xác yêu cầu Cuối cùng, bạn nhận yêu cầu vào/ra trực tiếp từ ứng dụng, trường hợp bạn biết bạn luồng thuộc ứng dụng Đợi Đối tượng Thu phát Đơn Bạn gọi KeWaitForSingleObject minh họa ví dụ sau đây: 2/19 Các đối tượng Kernel Dispatcher (Kernel Dispatcher Objects ) ASSERT(KeGetCurrentIrql() lock, SynchronizationEvent, TRUE); Vào tiết diện tới hạn lightweight bạn việc đợi kiện Để lại thiết đặt kiện KeWaitForSingleObject(&pdx->lock, Executive, KernelMode, FALSE, NULL); KeSetEvent(&pdx->lock, EVENT_INCREMENT, FALSE); Chỉ sử dụng mánh khóe luồng hệ thống, Tuy nhiên, cản trở gọi user-mode tới NtSuspendThread tạo bế tắc (Sự bế tắc dễ dàng xảy trình gỡ rối user-mode chạy trình.) Nếu bạn chạy luồng người sử dụng, bạn cần phải thích sử dụng mutex nhanh thực Không sử dụng mánh khóe chút cho mã, điều thực đường dẫn 7/19 Các đối tượng Kernel Dispatcher (Kernel Dispatcher Objects ) phân trang, cách giải thích sau liên quan đến " không an toàn " việc thu nhận thực nhanh mutex Kernel đánh tín hiệu (Kernel Semaphores ) Một đèn hiệu kernel máy đếm số nguyên với ngữ nghĩa học đồng hóa có kết hợp Xem xét đèn báo hiệu máy đếm khẳng định - báo hiệu máy đếm Máy đếm đảm nhiệm giá trị tiêu cực Việc giải phóng đèn hiệu tăng máy đếm, mà cách thành công đợi giảm bớt đèn hiệu máy đếm Nếu giảm bớt làm cho đếm 0, đèn hiệu xem xét không phảibáo hiệu, với hệ đối tượng gọi KeWaitXxx khác mà nài nỉ tìm thấy báo hiệu khối bắt buộc Ghi mà nhiều luồng đợi đèn hiệu so với giá trị máy đếm, tất luồng đợi giải tỏa kernel cung cấp ba chức dịch vụ để kiểm soát trạng thái đối tượng đèn hiệu (Xem bảng 4-3.) Bạn khởi tạo đèn hiệu việc gọi chức PASSIVE_LEVEL sau đây: ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); KeInitializeSemaphore(semaphore, count, limit); Trong gọi này, đèn hiệu trỏ vào đối tượng KSEMAPHORE đánh số trang kí ức Biến đếm giá trị ban đầu máy đếm, giới hạn trị số cực đại mà máy đếm cho phép để đảm nhiệm, mà phải lớn đếm ban đầu Bảng 4-3 Những chức dịch vụ cho sử dụng với đối tượng đánh tín hiệu Kernel Service Function Mô tả KeInitializeSemaphore Khởi tạo đối tượng đèn hiệu KeReadStateSemaphore Xác định trạng thái thời đèn hiệu KeReleaseSemaphore Những đông cứng đánh tín hiệu đối tượng tới trạng thái báo hiệu Nếu bạn tạo đèn hiệu với giới hạn 1, đối tượng có phần tương tự mutex điều luồng thời điểm có khả để đòi hỏi Một kernel mutex có số đặc tính mà thiếu đèn hiệu, nhiên, để giúp đỡ ngăn ngừa bế tắc Tương ứng, gần điểm việc tạo đèn hiệu với giới hạn 8/19 Các đối tượng Kernel Dispatcher (Kernel Dispatcher Objects ) Nếu bạn tạo đèn hiệu với giới hạn lớn 1, bạn có đối tượng mà cho phép nhiều luồng truy nhập tài nguyên cho Một định lý quen thuộc mệnh lệnh lý thuyết hàng đợi mà cung cấp hàng đợi đơn cho nhiều người phục vụ rõ ràng ( điều đó, dẫn đến biến đổi thời gian đợi) so với việc cung cấp ngăn cách hàng đợi cho toàn máy chủ riêng Thời gian đợi trung bình giống hai trường hợp, biến đổi thời gian đợi nhỏ với hàng đợi đơn (Đây hàng đợi kho ngày tăng tổ chức cho khách hàng đợi dòng đơn cho thư ký sẵn có tiếp theo.) Loại đèn hiệu cho phép bạn tổ chức đông cứng phần mềm hay phần cứng máy chủ để tận dụng định lý Chủ nhân (hay chủ nhân) đèn hiệu giải phóng tuyên bố tới đèn hiệu việc gọi KeReleaseSemaphore: ASSERT(KeGetCurrentIrql() [...]... chặn trước tất cả các luồng .) Chúng tôi khởi tạo đối tượng thiết bị bấm giờ trong cùng cách Chúng tôi cũng đã khởi tạo một đối tượng KDPC mà cái đó chúng tôi cấp phát đánh số trang kí ức Chẳng hạn: 12/19 Các đối tượng Kernel Dispatcher (Kernel Dispatcher Objects ) PKDPC dpc; // ... luồng .) Chúng khởi tạo đối tượng thiết bị bấm cách Chúng khởi tạo đối tượng KDPC mà cấp phát đánh số trang kí ức Chẳng hạn: 12/19 Các đối tượng Kernel Dispatcher (Kernel Dispatcher Objects ) PKDPC... SynchronizationTimer); PVOID pollevents[] = { (PVOID) &pdx->evKill, (PVOID) &timer, 15/19 Các đối tượng Kernel Dispatcher (Kernel Dispatcher Objects ) }; C_ASSERT(arraysize(pollevents)