Viết hệ điều hành đa nhiệm cho bộ xử lý không có MMU


9

Tôi đã nghĩ đến việc viết một hệ điều hành sở thích cho một số bộ xử lý ARM. Có nhiều máy tính bảng đơn phổ biến với ARM MPU, vì vậy tôi chỉ muốn mua một trong số đó (chọn một máy tính có tài liệu mở hơn). Tôi đã rất ngạc nhiên khi phát hiện ra rằng, ngay cả những bo mạch có bộ nhớ thực sự đủ cũng không có MPU với Bộ quản lý bộ nhớ.

Vì tôi luôn làm việc với các bộ xử lý i386 + và không bao giờ làm gì khác (ngoại trừ một số PIC Microchip), bây giờ tôi bối rối và không biết liệu người ta có thể viết một hệ điều hành hoạt động có chức năng không bị giới hạn khi so sánh với các HĐH được viết không cho MPU với MMU.

Tôi có thể nghĩ ra một vài giải pháp để "thay thế" hoặc "mô phỏng" MMU và tôi đã có một vài câu hỏi:

  • Trên bộ xử lý Intel ở chế độ 16 và 32 bit, có một cách sử dụng các phân đoạn và bộ chọn phân đoạn để sử dụng các khối bộ nhớ khác nhau theo các tác vụ khác nhau. Điều đó có nghĩa là tôi có thể thay đổi không gian bộ nhớ bằng cách thay đổi nội dung của các thanh ghi phân đoạn khi thực hiện chuyển đổi tác vụ khi ở x86. Có bất kỳ khái niệm chung nào cho phân đoạn bộ nhớ có thể được sử dụng trên kiến ​​trúc ARM không?
  • Bằng cách tải một tệp đối tượng được liên kết thay vì thực thi, tôi có thể sử dụng định vị lại (sửa lỗi) hoặc định vị mã độc lập để trỏ các tác vụ lên các phần của bộ nhớ theo cách giống như khi tôi ánh xạ bộ nhớ bằng các cấu trúc phân trang. Điều này sẽ đủ hiệu quả?
  • Tôi cũng đã đọc một cái gì đó về Bộ bảo vệ bộ nhớ trên bộ xử lý ARM. Những điều này có thể hữu ích?

Có cách "quản lý" thông thường nào trên các hệ thống không có MMU không?

Câu trả lời:


16

Thật ra không khó để thiết kế một hệ điều hành không yêu cầu MMU. Có một vài tiện ích bạn sẽ phải làm mà không có gì, nhưng không gì có thể vượt qua.

  • Vì các tác vụ khác nhau sẽ phải được tải tại các địa chỉ khác nhau, tất cả mã của bạn (ngoại trừ kernel, thư viện chuẩn và bất kỳ mã nào khác là một phần của môi trường thời gian chạy cơ sở của bạn) phải được biên dịch thành độc lập với vị trí. Điều này có nghĩa là các bước nhảy tương đối và một địa chỉ cơ sở để truy cập heap được lưu trữ trong một thanh ghi. Chi tiêu một đăng ký làm địa chỉ cơ sở có vẻ tốn kém nếu bạn đã sử dụng bốn đăng ký chung của x86-32, nhưng hầu hết các kiến ​​trúc hiện đại có nhiều hơn và thậm chí 8088 có đăng ký phân khúc chính xác cho điều đó.
  • Một kiến ​​trúc giống như Unix phải được sửa đổi, bởi vì bạn không thể thực hiện fork . Điều đó ổn, hầu hết các hệ điều hành đều không có fork. (Bạn có thể có vfork.)
  • Bạn không thể phân bổ số lượng lớn không gian mà không phân bổ bộ nhớ tương ứng. Điều này có nghĩa là không có sự tăng trưởng của ngăn xếp hoặc đống khi đang bay bằng cách phân bổ thêm một trang mỗi lần.

Nếu bạn có MPU, thì các tác vụ của bạn vẫn có thể được tách biệt với nhau như bình thường trong các hệ điều hành đa nhiệm. Nếu không có MPU, việc tách bộ nhớ chỉ có thể hợp tác nếu bạn cho phép các tác vụ thực thi mã tùy ý. Một cách để đạt được sự phân tách bộ nhớ mà không cần MPU là hạn chế các tác vụ chỉ sử dụng mã được xác minh trên máy ảo và thực hiện bảo vệ bộ nhớ trong phần mềm như một phần của công cụ VM.

uClinux là một dự án dựa trên nhân Linux chạy trên các bộ xử lý (bao gồm ARM Cortex-M) mà không cần MMU. Những hạn chế của nó đối với đa nhiệm về cơ bản là những gì tôi đã nêu ở trên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.