Saya tidak memiliki 286 dan saya juga tidak bermaksud menjalankan Linux. Namun karena 286 memiliki mode terproteksi, mengapa sering dinyatakan bahwa Linux membutuhkan CPU 386 atau lebih tinggi?
Dari http://tuxmobil.org/286_mobile.html tampaknya versi Linux ELKS dapat berjalan pada 286, apakah ini benar? Apa modifikasi (jika ada) yang telah dilakukan untuk memungkinkan kernel berjalan pada CPU 286?
Sekarang jelas saya mengerti bahwa kernel yang dikompilasi untuk 386 tidak dapat dijalankan pada CPU 286, yaitu 16-bit. Jadi pertanyaan saya adalah, mengapa kernel Linux standar tidak dapat dikompilasi untuk 286, dan kemudian dieksekusi pada 286? Apakah Linux memerlukan dukungan perangkat keras VM86?
linux-kernel
hardware-compatibility
ioctlvoid
sumber
sumber
Jawaban:
286 protected mode (PM) pada dasarnya berbeda dengan apa yang ditawarkan 386. Pikirkan 286 PM sebagai prototipe, yang memiliki banyak kekurangan sehingga hampir tidak ada yang pernah menggunakannya, dan semuanya benar-benar dirancang ulang dari bawah ke atas untuk 386.
Itu tidak menggunakan model memori datar, itu menggunakan model tersegmentasi seperti mode nyata, yang berarti Anda harus melompat melalui lingkaran untuk mengakses memori dalam blok yang lebih besar dari 64kB sekaligus.
Itu benar-benar tidak kompatibel dengan semua program (MS-DOS) yang tersedia pada saat itu, jadi setelah Anda berada di PM Anda tidak dapat menggunakan salah satu dari program yang Anda gunakan.
Anda juga tidak dapat meninggalkan mode terlindungi lagi kecuali Anda mem-boot ulang PC, sehingga pabrikan datang dengan solusi kreatif seperti meletakkan bendera di RAM, kemudian menulis nilai ajaib ke pengontrol keyboard, yang akan mengibaskan pin reset pada CPU untuk mem-boot ulang mesin. Hal pertama yang akan dilakukan BIOS adalah mendeteksi flag yang ditetapkan sebelumnya, di mana ia kemudian akan melompat kembali ke program asli alih-alih menjalankan rutin POST, memungkinkan program asli untuk terus berjalan setelah "keluar" dari PM.
Ini berarti bahwa menggunakan 286 PM mencegah Anda menjalankan program DOS normal tanpa banyak trik. Pada saat hanya ada program-program DOS, itu tidak sebanding dengan upaya menggunakan PM sama sekali.
Jadi akhirnya menjadi lebih rumit untuk bekerja dengan 286 PM daripada hanya hidup tanpa itu, dan mengandalkan EMS dan XMS untuk mengakses memori tambahan. Sejumlah 286 motherboard memiliki dukungan chipset untuk EMS sehingga Anda dapat menggunakan semua memori sistem tambahan tanpa memerlukan PM.
Intel mengenali kekurangan-kekurangan ini dan menghasilkan PM baru yang benar-benar berbeda di 386. Model memori datar membuat mengakses memori dalam potongan hingga 4GB sederhana. CPU dapat masuk dan keluar dari PM dengan beberapa instruksi sehingga tidak diperlukan protokol reboot yang canggung. VM86 berarti bahwa sebagian besar waktu Anda bahkan tidak perlu keluar dari PM, Anda dapat menjalankan program DOS saat masih dalam PM.
Semua peningkatan ini berarti bahwa 386 PM tidak hanya lebih fungsional, tetapi secara signifikan lebih kompatibel juga.
Dengan kata lain, satu-satunya kesamaan antara mode terproteksi 286 dan 386 adalah namanya. Inilah sebabnya mengapa sistem operasi PM biasanya 386 atau lebih baru. Menambahkan dukungan untuk 286 PM akan menjadi upaya yang sepenuhnya independen, dengan sedikit atau tidak ada kode yang dapat dibagikan dengan 386 PM yang sama sekali berbeda.
Sebaliknya, 386 PM bekerja dengan cara yang sama hingga CPU 32-bit terakhir, dan bahkan lebih dari itu jika Anda menjalankan perangkat lunak 32-bit pada CPU 64-bit.
sumber
Ada bagian-bagian dalam kernel yang ditulis dalam rakitan dan mereka harus ditulis ulang untuk mendukung 286.
Mengenai ELKS, dalam FAQ mereka mereka mengindikasikan itu adalah subset dari kernel Linux, jadi mungkin mereka hanya porting kebutuhan mutlak.
sumber
Saya pikir jawaban sebenarnya untuk pertanyaan saya adalah ini:
Setiap arsitektur CPU utama (atau revisi besar daripadanya) memerlukan beberapa kode dukungan perakitan selain kode C.
Bahkan jika Anda mendapat GCC untuk mengkompilasi kernel Linux ke dalam kode mesin 16-bit 286, masih akan ada kode assembly kompatibel 16-bit yang esensial.
Dengan kata lain, kernel hanya akan dibangun sebagian saja. Setiap kode rakitan khusus arsitektur akan gagal untuk dirakit karena tidak ditulis untuk arsitektur itu.
Berdasarkan hal ini saya mengasumsikan bahwa inilah yang dilakukan oleh ELANG dan proyek serupa ketika mengimplementasikan Linux pada 286 atau arsitektur lainnya - mereka mengimplementasikan kode dukungan perakitan yang hilang.
sumber
The 80386 mendukung paging selain segmentasi memori sementara 286 hanya mendukung segmentasi memori. Linux sangat tergantung pada dukungan paging yaitu, menggunakan skema memori datar yang pada dasarnya mengatur semua register segmen ke 0 dan menggunakan paging untuk mengelola aplikasi. Untuk mem-port Linux ke 286, manajer memori dasar membutuhkan desain ulang yang lengkap untuk bekerja dalam mode tersegmentasi tanpa paging yang mungkin banyak pekerjaan.
sumber
Saya bukan orang majelis, tetapi menurut ini :
386 mewakili set instruksi yang diperluas dari 286, jadi siapa yang tahu seberapa sulit port akan. Sudah cukup jelas bahwa hampir tidak ada yang mau repot-repot mencobanya ... Saya kira Anda dapat bertanya kepada orang-orang ELKS tentang hal itu.
sumber
Alasan terbesar adalah bahwa proyek GNU asli ditujukan pada mesin 32-bit (seperti pertengahan tahun 1980-an Unix workstatons) daripada repot-repot mendukung apa pun yang lebih kecil, sehingga seluruh rantai alat GNU tidak cocok untuk pembuatan kode 16-bit. Porting kernel Linux awal, perakitan-berat, segmen menggunakan 286 akan lebih mudah daripada target porting lainnya - jika GCC memiliki kemampuan untuk menghasilkan 286 kode mode dilindungi. Tetapi membidik GCC pada 286 mode terproteksi akan menjadi proyek besar untuk mendukung prosesor yang usang.
sumber
Baru-baru ini kernel linux telah meninggalkan 386 sebagai platform yang didukung dan kernel Linux TIDAK mendukung prosesor Intel 286..80286 bukan cpu 32bit, yang diperlukan untuk boot.
sumber
Linux x86 tidak dapat dengan mudah di-porting ke 80286 karena merupakan prosesor 16-bit dan Linux x86 memerlukan prosesor 32-bit.
Lebih khusus, register pada 286 masih hanya 16-bit. Tidak ada register EX yang tersedia. Segmen memori dan offset juga masih panjang 16-bit. Program masih harus berurusan dengan kode dekat / jauh dan data.
Ini berarti bahwa Linux / 286 akan membutuhkan kernel dan pengguna API yang secara radikal berbeda dari Linux / 386. Setiap file sumber rakitan dan banyak file sumber C perlu ditulis ulang. Ini akan seperti perbedaan antara pemrograman untuk Win16 versus Win32.
Singkatnya, Anda tidak bisa hanya memberitahu GCC untuk melakukan kompilasi untuk CPU yang berbeda. Setiap bit kode harus ditulis ulang untuk lingkungan 16-bit.
sumber
Dari apa yang saya baca cara kanonik untuk menjalankan Linux pada 80286 adalah dengan menjalankannya di dalam mesin virtual. Inilah yang dilakukan Fabrice Bellard di sini . Anda harus mengimplementasikan mesin virtual sendiri, atau port satu.
sumber