2012-01-16 42 views
5

Tôi chỉ đọc lên trên linux làm việc như thế nào trong OS-book của tôi khi tôi đi qua này ..Cuộc gọi hệ thống mà không cần chuyển ngữ cảnh?

[...] hạt nhân được tạo ra dưới dạng đĩa đơn, nhị phân monolitic. Lý do chính là cải thiện hiệu suất. Bởi vì tất cả mã kernel và cấu trúc dữ liệu được lưu giữ trong một không gian địa chỉ đơn lẻ, nên không cần chuyển mạch bối cảnh khi một tiến trình gọi một hàm hệ điều hành hoặc khi một ngắt phần cứng được gửi đi.

Điều đó nghe khá tuyệt vời với tôi, chắc chắn nó phải lưu trữ bối cảnh của quá trình trước khi chạy vào chế độ hạt nhân để xử lý gián đoạn .. Nhưng ok, tôi sẽ mua nó ngay bây giờ. Một vài trang trên, trong khi mô tả bối cảnh lập lịch trình của quy trình, nó cho biết:

Cả hai cuộc gọi và gián đoạn xảy ra trong quá trình thực thi sẽ sử dụng chồng này.

"ngăn xếp này" là nơi hạt nhân lưu trữ sổ đăng ký của quy trình và như vậy.

Đây không phải là mâu thuẫn trực tiếp với báo giá đầu tiên? Tôi có hiểu nhầm nó bằng cách nào đó không?

Trả lời

3

Tôi nghĩ rằng báo giá đầu tiên đề cập đến sự khác biệt giữa hạt nhân nguyên khối và microkernel.

Linux là nguyên khối, tất cả các thành phần hạt nhân (trình điều khiển thiết bị, trình lên lịch, trình quản lý VM) chạy tại ring 0. Do đó, không cần chuyển ngữ cảnh khi thực hiện các cuộc gọi hệ thống và xử lý ngắt.

Microkernels tương phản, nơi các thành phần như trình điều khiển thiết bị và nhà cung cấp IPC chạy trong user space, bên ngoài vòng 0. Do đó, kiến ​​trúc này yêu cầu thêm công tắc ngữ cảnh khi thực hiện cuộc gọi hệ thống (vì mô đun thực hiện có thể nằm trong không gian người dùng) và xử lý ngắt (để chuyển tiếp ngắt sang trình điều khiển thiết bị).

+0

Cảm ơn bạn. Đã lâu rồi tôi mới nghiên cứu điều này, nhưng tôi đã bị ấn tượng rằng phần cứng ngắt thực sự _interrupts_ việc thực hiện và nhảy ngay lập tức đến thủ tục xử lý hơn là bỏ phiếu cho các ngắt sau này. Tôi nghĩ rằng nếu quá trình này đang thực hiện ở chế độ hạt nhân thì nó vẫn cần lưu trữ ngữ cảnh của nó trước khi nhảy, nhưng có lẽ đó là lỗi của tôi? Tôi cho rằng bây giờ điều đó sẽ không khác với bất kỳ cuộc gọi phương thức nào khác nếu phương thức được gọi xử lý các thanh ghi đã sử dụng một cách chính xác .. tôi đã hiểu đúng chưa? – user1130005

+0

Sự hiểu biết của tôi là quá trình đang chạy ở chế độ người dùng và thực sự có một chuyển ngữ cảnh sang chế độ hạt nhân trước khi ngắt được xử lý. Tuy nhiên, * xử lý * ngắt không đòi hỏi một công tắc ngữ cảnh bổ sung trong hạt nhân nguyên khối, nhưng trong các vi mạch (vì trình điều khiển thiết bị nằm trong không gian người dùng). –

2

"Chuyển ngữ cảnh" có thể là một trong hai điều, cả hai đều có liên quan: (1) chuyển từ người dùng sang chế độ hạt nhân để xử lý cuộc gọi hệ thống hoặc chuyển đổi không tự nguyện sang chế độ hạt nhân để xử lý ngắt hoặc (2) chuyển sang chạy một quy trình người dùng khác trong không gian người dùng, với một bước nhảy tới không gian hạt nhân ở giữa hai.

Bất kỳ chuyển động nào từ không gian người dùng đến không gian hạt nhân đều ngụ ý tiết kiệm đủ không gian người dùng để trả về một cách đáng tin cậy. Nếu mã không gian hạt nhân quyết định rằng - trong khi bạn không còn chạy mã người dùng cho quá trình đó nữa - đã đến lúc để cho phép một quy trình người dùng khác chạy, nó sẽ tham gia.

Vì vậy, ít nhất, bạn nói 2-3 ngăn xếp hoặc những nơi để lưu trữ một "bối cảnh": phần cứng ngắt cần một mức hạt nhân ngăn xếp để nói những gì để trở về; các phương thức người dùng/các cuộc gọi chương trình con sử dụng một chồng tiêu chuẩn để thực hiện điều đó. Ví dụ:

Hạt nhân gốc Unix - và mô hình hiện không khác với phần này - chạy hệ thống gọi như đơn đặt hàng bữa sáng chế biến món ăn ngắn: di chuyển trên bếp để nhường chỗ cho đơn đặt hàng thịt xông khói vừa mới đến, bắt đầu thịt xông khói, quay trở lại thứ tự đầu tiên. Tất cả trong bối cảnh chuyển đổi hạt nhân. Không phải là một ứng dụng giám sát lớn, có thể khiến các phần mềm của IBM và DEC phát điên.

0

Khi thực hiện cuộc gọi hệ thống trong Linux, công tắc ngữ cảnh được thực hiện từ không gian người dùng đến không gian hạt nhân (ring3 đến ring0). Mỗi tiến trình có một ngăn xếp chế độ hạt nhân liên quan, được sử dụng bởi cuộc gọi hệ thống.Trước khi cuộc gọi hệ thống được thực hiện, thanh ghi CPU của tiến trình được lưu trữ trên ngăn xếp chế độ người dùng của nó, ngăn xếp này khác với ngăn xếp chế độ hạt nhân và là quá trình sử dụng cho thực thi không gian người dùng.

Khi quá trình ở chế độ hạt nhân (hoặc chế độ người dùng), các chức năng gọi của cùng một chế độ sẽ không yêu cầu chuyển ngữ cảnh. Đây là những gì được trích dẫn bởi báo giá đầu tiên.

Trích dẫn thứ hai đề cập đến ngăn xếp chế độ hạt nhân chứ không phải ngăn xếp chế độ người dùng. Sau khi nói điều này, tôi phải đề cập đến tối ưu hóa Linux, nơi không cần chuyển đổi sang không gian hạt nhân để thực hiện cuộc gọi hệ thống, tức là tất cả quá trình xử lý liên quan đến cuộc gọi hệ thống được thực hiện trong chính không gian người dùng (do đó no context switch). vsyscallVDSO là các kỹ thuật như vậy. Ý tưởng đằng sau chúng khá đơn giản. Nó là để gửi đến không gian người dùng, dữ liệu được yêu cầu để thực hiện các cuộc gọi hệ thống tương ứng. Bạn có thể tìm thêm thông tin trong this LWN article.

Ngoài ra, đã có một số dự án nghiên cứu trong đó tất cả việc thực hiện xảy ra trong cùng một vòng. Các chương trình không gian người dùng và mã hệ điều hành, cả hai đều nằm trong same ring. Ý tưởng là để loại bỏ các chi phí của công tắc vòng. Microsoft's [singularity][2] OS là một dự án như vậy.

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