X
X
X
X

Memprogram kernel

BerandaArtikelTeknologiMemprogram kernel

Penting untuk dicatat bahwa pemrograman kernel berbeda secara signifikan dari pemrograman ruang pengguna. Kernel adalah entitas mandiri, yang tidak dapat menggunakan pustaka ruang pengguna, bahkan libc pada Linux atau kernel32.dll pada Windows. Akibatnya, fungsi yang biasa digunakan di ruang pengguna (printf, malloc, free, open, read, write, memcpy, strcpy, dll.) tidak dapat digunakan lagi.

Kesimpulannya, pemrograman kernel didasarkan pada API yang benar-benar baru dan independen yang tidak terkait dengan API di ruang pengguna, baik kita merujuk ke POSIX , Win32 atau ANSI C. Perbedaan penting dalam pemrograman kernel adalah cara mengaksesnya. dan alokasi memori. Karena kenyataan bahwa pemrograman kernel dilakukan pada tingkat yang sangat dekat dengan mesin fisik, ada aturan penting mengenai manajemen memori.

Pertama, ia bekerja dengan beberapa jenis memori:
– memori fisik
– memori virtual di ruang alamat kernel
– memori virtual dari ruang alamat suatu proses
– memori tetap – kita tahu pasti bahwa halaman yang diakses ada di memori fisik

The memori virtual di ruang alamat dari suatu proses tidak dapat dianggap sebagai penduduk karena mekanisme memori virtual yang diterapkan oleh sistem operasi: halaman mungkin di swap, atau mungkin tidak ada dalam memori fisik sebagai hasil dari mekanisme paging permintaan.

Memori di ruang alamat kernel mungkin ada atau tidak. Baik segmen data dan kode dari sebuah modul dan tumpukan kernel dari suatu proses adalah penduduk.

Memori dinamis mungkin ada atau tidak, tergantung pada bagaimana itu dialokasikan. Saat bekerja dengan memori tetap, semuanya sederhana: memori dapat diakses kapan saja. Namun, jika bekerja dengan memori non-residen, maka hanya dapat diakses dari konteks tertentu.

Memori non-residen hanya dapat diakses dari konteks proses. Mengakses memori non-residen dari konteks interupsi memiliki hasil yang tidak terduga dan, oleh karena itu, ketika sistem operasi mendeteksi akses tersebut, ia akan mengambil tindakan drastis: memblokir atau menyetel ulang sistem, untuk mencegah kerusakan serius.

The memori virtual dari suatu proses tidak dapat diakses langsung dari kernel. Umumnya, sangat tidak disarankan untuk mengakses ruang alamat suatu proses, tetapi ada situasi di mana driver perangkat harus melakukannya. Kasus tipikal adalah di mana driver perangkat harus mengakses buffer dari ruang pengguna. Dalam hal ini, driver perangkat harus menggunakan fungsi khusus dan tidak mengakses buffer secara langsung. Ini diperlukan untuk mencegah akses ke area memori yang tidak valid.

Perbedaan lain dari pemrograman di ruang pengguna, relatif terhadap bekerja dengan memori, adalah karena tumpukan, tumpukan yang ukurannya tetap dan terbatas. Di kernel Linux, tumpukan 4K digunakan secara default, dan di Windows, tumpukan 12K digunakan. Untuk alasan ini, alokasi struktur besar pada tumpukan atau penggunaan panggilan rekursif harus dihindari.

Mengenai mode eksekusi di kernel, kami membedakan dua konteks: konteks proses dan konteks interupsi. Kami berada dalam konteks proses ketika kami menjalankan kode setelah panggilan sistem atau ketika kami menjalankan dalam konteks utas kernel. Saat kita berlari dalam rutinitas berurusan dengan jeda atau tindakan yang ditangguhkan, kita berlari dalam konteks jeda.

Salah satu fitur terpenting dari pemrograman kernel adalah paralelisme. Baik Linux dan Windows mendukung sistem SMP dengan banyak prosesor, tetapi juga kernel secara preemptif mendukung banyak prosesor. Hal ini membuat pemrograman kernel lebih sulit karena akses ke variabel global harus disinkronkan dengan spinlock atau primitif pemblokiran.

Baik Linux dan Windows menggunakan kernel preemptive. Gagasan multitasking preemptive tidak boleh disamakan dengan gagasan kernel preemptive. Gagasan preemptive multitasking mengacu pada fakta bahwa sistem operasi menginterupsi jalannya suatu proses secara paksa, ketika telah kedaluwarsa jumlah waktu dan berjalan di ruang pengguna, untuk menjalankan proses lain.
Untuk pemrograman di Kernel Linux, konvensi yang digunakan untuk memanggil fungsi untuk menunjukkan keberhasilan identik dengan pemrograman UNIX: 0 untuk keberhasilan, atau nilai selain 0 untuk kegagalan.


Top