Hai câu trả lời khác (tại thời điểm viết) nói về các ngắt và IDT. Điều này là chính xác, tuy nhiên, trên CPU Intel-esque hiện đại, không có ít hơn ba cách để gọi vào kernel.
Phương pháp # 1: Ngắt.
Điều này được giải thích ở trên. Bạn thiết lập một mục trong bảng mô tả ngắt / vectơ ngắt, sau đó thực hiện ngắt phần mềm để nhập kernel.
Ưu điểm chính của phương pháp này là một hạt nhân điển hình cần có khả năng xử lý các ngắt dù thế nào và nó hoạt động trên phần cứng cổ xưa.
Phương pháp # 2: Cổng gọi.
Cổng gọi là một loại bộ chọn phân đoạn đặc biệt. Mục tiêu của cuộc gọi cần được tải trong bảng mô tả phân đoạn toàn cầu hoặc cục bộ (tương ứng GDT và LDT). Nếu sau đó bạn thực hiện một lệnh gọi xa bằng cách sử dụng cổng cuộc gọi làm phân đoạn (phần bù của cuộc gọi bị bỏ qua), điều này cho phép bạn gọi thêm mã đặc quyền. Cổng gọi cực kỳ linh hoạt; kiến trúc IA-32 có bốn cấp đặc quyền và cổng gọi cho phép bạn gọi bất kỳ cấp nào.
Tôi không tin rằng Linux đã từng sử dụng cổng gọi, nhưng Windows 95 thì có. Các dịch vụ kernel Win95 ( krnl386.exe
và kernel.dll
) thực sự chạy ở chế độ người dùng (vòng 3). Mức đặc quyền cao nhất (vòng 0) chỉ được sử dụng cho trình điều khiển và hạt nhân vi mô chỉ thực hiện chuyển đổi quy trình. Gọi vào trình điều khiển đã được thực hiện bằng cách sử dụng cổng gọi. Điều này cho phép mã 16 bit kế thừa (trong đó có rất nhiều!) Để sử dụng trình điều khiển Win95 chỉ bằng cách sử dụng một cuộc gọi xa tiêu chuẩn, giống như họ luôn làm.
Bảo vệ không đầy đủ của bảng mô tả toàn cầu là nguyên nhân của một số khai thác Windows 95, đã quản lý để cài đặt các cổng gọi của riêng họ bằng cách ghi vào bộ nhớ.
Phương pháp # 3: SYSCALL / SYSRET và SYSENTER / SYSEXIT
Đây là hai bộ hướng dẫn, được phát minh độc lập bởi AMD và Intel, nhưng về cơ bản chúng cũng làm điều tương tự. SYSCALL / SYSRET xuất hiện đầu tiên và chỉ dành cho AMD, SYSENTER / SYSEXIT là Intel, nhưng AMD triển khai ngay bây giờ. Vì vậy, tôi sẽ mô tả SYSENTER / SYSEXIT.
Không giống như cổng gọi, SYSENTER chỉ có thể được sử dụng để chuyển sang chuông 0 và chỉ có thể chuyển đến một vị trí. Tuy nhiên, nó có ưu điểm là độ trễ cực thấp vì không giống như một cuộc gọi hoặc ngắt, nó không chạm vào ngăn xếp.
Vị trí truyền được thiết lập bằng ba thanh ghi dành riêng cho mô hình: một thanh ghi cho thông tin phân đoạn và một thanh ghi cho con trỏ lệnh và con trỏ ngăn xếp của mã hạt nhân. Vì không có gì được "đẩy" vào ngăn xếp, mã chế độ người dùng có trách nhiệm báo cho kernel biết nơi quay lại bằng cách chuyển con trỏ lệnh trả về và con trỏ ngăn xếp trong các thanh ghi. Hạt nhân chịu trách nhiệm khôi phục con trỏ ngăn xếp và lệnh SYSEXIT khôi phục con trỏ lệnh.
Thông tin thêm về các hướng dẫn SYSENTER và SYSEXIT.