Menulis sistem operasi multitasking untuk prosesor tanpa MMU

9

Saya sudah berpikir untuk menulis sistem operasi hobi untuk beberapa prosesor ARM. Ada banyak komputer papan tunggal populer dengan ARM MPU, jadi saya hanya ingin membeli salah satunya (memilih satu dengan lebih banyak dokumentasi terbuka). Saya terkejut ketika saya tahu, bahwa bahkan papan dengan memori yang sangat cukup tidak memiliki MPU dengan Memory Management Unit.

Karena saya selalu bekerja dengan prosesor i386 + dan tidak pernah melakukan hal lain (kecuali untuk beberapa Microchip PIC), saya sekarang bingung dan tidak yakin apakah orang dapat menulis sistem operasi yang berfungsi yang fungsinya tidak akan terbatas ketika membandingkan dengan OS yang ditulis untuk MPU dengan MMU.

Saya bisa memikirkan beberapa solusi untuk "mengganti" atau "mensimulasikan" MMU dan saya punya beberapa pertanyaan:

  • Pada prosesor Intel dalam mode 16 dan 32-bit ada cara menggunakan segmen dan pemilih segmen untuk menggunakan blok memori yang berbeda dengan tugas yang berbeda. Itu berarti bahwa saya bisa mengubah ruang memori dengan mengubah isi register segmen ketika melakukan pergantian tugas ketika pada x86. Apakah ada konsep umum untuk segmentasi memori yang dapat digunakan pada arsitektur ARM?
  • Dengan memuat file objek yang tertaut alih-alih yang dapat dieksekusi, saya dapat menggunakan relokasi (perbaikan) atau memposisikan kode independen untuk mengarahkan tugas pada potongan memori dengan cara yang sama seperti jika saya memetakan memori menggunakan struktur paging. Apakah ini cukup efektif?
  • Saya juga telah membaca sesuatu tentang Memory Protection Unit pada prosesor ARM. Bisakah ini bermanfaat?

Apakah ada cara "biasa" mengelola tugas pada sistem tanpa MMU?

pengguna35443
sumber

Jawaban:

16

Sebenarnya tidak terlalu sulit untuk merancang sistem operasi yang tidak memerlukan MMU. Ada beberapa kemudahan yang harus Anda lakukan tanpanya, tetapi tidak ada yang tidak dapat diatasi.

  • Karena tugas yang berbeda harus dimuat di alamat yang berbeda, semua kode Anda (kecuali untuk kernel, pustaka standar, dan kode lain apa pun yang merupakan bagian dari lingkungan runtime basis Anda) harus dikompilasi sebagai posisi-independen. Ini berarti lompatan relatif dan alamat dasar untuk akses tumpukan yang disimpan dalam register. Menghabiskan satu register sebagai alamat dasar mungkin tampak mahal jika Anda terbiasa dengan empat register umum x86-32, tetapi kebanyakan arsitektur modern memiliki lebih banyak, dan bahkan 8088 memiliki register segmen yang tepat untuk itu.
  • Arsitektur mirip Unix harus direvisi, karena Anda tidak dapat mengimplementasikan fork. Tidak apa-apa, sebagian besar sistem operasi tidak punya fork. (Anda dapat memilikinya vfork.)
  • Anda tidak dapat melakukan realokasi ruang besar tanpa mengalokasikan memori yang sesuai. Ini berarti tidak ada pertumbuhan tumpukan atau tumpukan dengan cepat dengan mengalokasikan satu halaman lagi sekaligus.

Jika Anda memiliki MPU, maka tugas Anda masih dapat dipisahkan satu sama lain seperti biasa dalam sistem operasi multitasking. Tanpa MPU, pemisahan memori hanya bisa kooperatif jika Anda mengizinkan tugas untuk mengeksekusi kode arbitrer. Salah satu cara untuk mencapai pemisahan memori tanpa MPU adalah dengan membatasi tugas untuk hanya menggunakan kode diverifikasi pada mesin virtual dan menerapkan perlindungan memori dalam perangkat lunak sebagai bagian dari mesin VM.

uClinux adalah proyek berbasis kernel Linux yang berjalan pada prosesor (termasuk ARM Cortex-M) tanpa MMU. Its pembatasan multitasking pada dasarnya apa yang saya dijelaskan di atas.

Gilles 'SANGAT berhenti menjadi jahat'
sumber