GNU/Linux >> Belajar Linux >  >> Linux

Porting Linux ke persyaratan platform lain

Meskipun sebagian besar kode di kernel Linux ditulis dalam C, masih banyak bagian dari kode tersebut yang sangat spesifik untuk platform tempatnya berjalan dan perlu diperhitungkan.

Salah satu contohnya adalah memori virtual, yang bekerja dengan cara yang sama pada sebagian besar arsitektur (hierarki tabel halaman) tetapi memiliki detail spesifik untuk setiap arsitektur (seperti jumlah level di setiap arsitektur, dan ini telah meningkat bahkan pada x86 dengan pengenalan chip baru yang lebih besar.) Kode kernel Linux memperkenalkan makro untuk menangani melintasi hierarki ini yang dapat dihilangkan oleh kompiler pada arsitektur yang memiliki tingkat tabel halaman lebih sedikit (sehingga kode ditulis dalam C, tetapi mengambil detail arsitektur ke dalam pertimbangan.)

Banyak area lain yang sangat spesifik untuk setiap arsitektur dan perlu ditangani dengan kode khusus arch. Sebagian besar melibatkan kode dalam bahasa assembly. Contohnya adalah:

  • Pengalihan Konteks :Pengalihan konteks melibatkan penyimpanan nilai semua register untuk proses yang dialihkan dan memulihkan register dari rangkaian proses yang disimpan yang dijadwalkan ke dalam CPU. Bahkan jumlah dan set register sangat spesifik untuk setiap arsitektur. Kode ini biasanya diimplementasikan dalam rakitan, untuk memungkinkan akses penuh ke register dan juga untuk memastikannya berjalan secepat mungkin, karena kinerja pengalihan konteks dapat menjadi sangat penting bagi sistem.

  • Panggilan Sistem :Mekanisme di mana kode userspace dapat memicu panggilan sistem biasanya khusus untuk arsitektur (dan kadang-kadang bahkan untuk model CPU tertentu, misalnya Intel dan AMD memperkenalkan instruksi yang berbeda untuk itu, CPU yang lebih tua mungkin tidak memiliki instruksi tersebut, jadi detail untuk itu akan tetap unik.)

  • Penangan Interupsi :Detail tentang cara menangani interupsi (interupsi perangkat keras) biasanya khusus platform dan biasanya memerlukan lem tingkat perakitan untuk menangani konvensi pemanggilan khusus yang digunakan untuk platform. Selain itu, primitif untuk mengaktifkan/menonaktifkan interupsi biasanya khusus platform dan memerlukan kode rakitan juga.

  • Inisialisasi :Perincian tentang bagaimana inisialisasi seharusnya terjadi juga biasanya menyertakan perincian yang khusus untuk platform dan seringkali memerlukan beberapa kode rakitan untuk menangani titik masuk ke kernel. Pada platform yang memiliki beberapa CPU (SMP), detail tentang cara menghadirkan CPU lain secara online biasanya juga khusus untuk platform.

  • Mengunci Primitif :Implementasi primitif penguncian (seperti spinlocks) biasanya juga melibatkan detail khusus platform, karena beberapa arsitektur menyediakan (atau lebih memilih) instruksi CPU yang berbeda untuk mengimplementasikannya secara efisien. Beberapa akan mengimplementasikan operasi atom, beberapa akan memberikan cmpxchg yang secara atom dapat menguji/memperbarui (tetapi gagal jika penulis lain masuk lebih dulu), yang lain akan menyertakan pengubah "kunci" ke instruksi CPU. Ini sering melibatkan penulisan kode rakitan juga.

Mungkin ada area lain di mana kode khusus platform atau arsitektur diperlukan di kernel (atau, khususnya, di kernel Linux.) Melihat pohon sumber kernel, ada subpohon khusus arsitektur di bawah arch/ dan di bawah include/arch/ di mana Anda dapat menemukan lebih banyak contoh tentang ini.

Beberapa benar-benar mengejutkan, misalnya Anda akan melihat bahwa jumlah panggilan sistem yang tersedia pada setiap arsitektur berbeda dan beberapa panggilan sistem akan ada di beberapa arsitektur dan bukan yang lain. (Bahkan di x86, daftar syscall berbeda antara kernel 32-bit dan 64-bit.)

Singkatnya, ada banyak kasus yang perlu diperhatikan kernel yang khusus untuk platform. Kernel Linux mencoba mengabstraksi sebagian besar dari itu, jadi algoritme tingkat tinggi (seperti cara kerja manajemen memori dan penjadwalan) dapat diimplementasikan dalam C dan berfungsi sama (atau sebagian besar sama) di semua arsitektur.


Selain mem-porting kernel Linux, Anda perlu menentukan antarmuka biner aplikasi (ABI) untuk program "ruang pengguna" dan port lapisan terendah tumpukan perangkat lunak ruang pengguna. Linux biasanya digunakan dengan komponen ruang pengguna tingkat rendah dari proyek GNU, yang paling penting adalah:

  • Kompiler, assembler, dan penghubung C:GCC dan GNU Binutils. Untuk arsitektur CPU yang sama sekali baru, Anda perlu mem-port perangkat lunak ini bahkan sebelum Anda mulai mem-porting kernel, karena kernel itu sendiri adalah program C dan harus dikompilasi. Jika sudah ada dukungan "back end" untuk CPU platform Anda, tidak hanya dengan Linux sebagai kernel OS, Anda memiliki lebih sedikit pekerjaan yang harus dilakukan dan Anda mungkin dapat menunda sebagian besar pekerjaan sampai kernel habis dan berjalan.
  • Perpustakaan runtime C:"GNU libc". Pustaka ini menyertakan kode yang membuat panggilan sistem dan berinteraksi langsung dengan kernel.
  • Pustaka "antarmuka fungsi asing", libffi, yang merupakan komponen penting dari banyak penafsir bahasa tingkat tinggi, dan melakukan salah satu dari beberapa tugas tersisa yang membutuhkan sejumlah kecil bahasa rakitan tulisan tangan.

Banyak perangkat lunak lainnya memiliki komponen opsional yang bergantung pada platform; misalnya, penjelajahan Web akan jauh lebih cepat jika Anda menulis primitif kriptografi yang dioptimalkan dengan tangan untuk NSS dan OpenSSL untuk arsitektur CPU baru Anda, dan back-end kompilasi tepat waktu untuk IonMonkey dan V8. Tapi ini tidak penting untuk menghadirkan platform baru.


Linux
  1. Linux – Kernel Tercemar Di Linux?

  2. Apa artinya mengatakan kernel linux bersifat preemptive?

  3. Bagaimana cara memuat modul kernel Linux dari kode C?

  1. Apa arti EXPORT_SYMBOL dalam kode kernel Linux?

  2. Pembaruan kernel tanpa me-reboot

  3. Mengkompilasi GNU/Linux dengan optimasi -O3

  1. Linux – Kernel:Dukungan Namespaces?

  2. Linux – Penerusan Ip Kernel?

  3. Linux – Di Mana Untuk Mengunduh Kode Sumber Kernel Linux Dari Versi Tertentu?