Analisis Eksperimental: https://www.zhihu.com/column/c_142990858
Linux adalah sistem operasi open source. Pengguna dapat menyesuaikan dan memodifikasi kernel sesuai dengan kebutuhan sistem mereka sendiri untuk menyesuaikan sistem dengan fungsi yang lebih tepat dan efisiensi operasi yang lebih tinggi. Oleh karena itu, menyusun kernel Linux adalah keterampilan dasar yang diperlukan untuk pengembangan kernel.
Menambahkan panggilan sistem baru sesuai kebutuhan dalam sistem adalah metode umum untuk memodifikasi kernel. Melalui percobaan ini, pembaca harus memahami proses panggilan sistem pemrosesan sistem Linux dan metode penambahan panggilan sistem.
(1) Tambahkan panggilan sistem untuk mengimplementasikan fungsi modifikasi atau bacaan dari nilai bagus dari proses yang ditentukan, dan mengembalikan nilai bagus dan prioritas prioritas terbaru dari proses tersebut. Disarankan untuk menyebut prototipe sebagai:
int mysetnice (pid_t pid, int bendera, int nicevalue, void __user * prio, void __user * bagus);
Arti parameter: PID: ID proses.
Bendera: Jika nilainya 0, itu berarti membaca nilai yang bagus; Jika nilainya 1, itu berarti memodifikasi nilai yang bagus.
Prio, Nice: Prioritas saat ini dan nilai proses yang bagus. Nilai Pengembalian: Pengembalian 0 Saat panggilan sistem berhasil, dan mengembalikan kode kesalahan ketika panggilan sistem gagal.
(2) Tulis tes aplikasi sederhana yang ditambahkan dalam (1).
(3) Jika fungsi kernel Linux dipanggil dalam program, diperlukan untuk membaca kode sumber fungsi yang relevan secara mendalam.
Mekanisme modul yang disediakan oleh Linux secara dinamis dapat memperluas fungsi Linux tanpa mengkompilasi ulang kernel, dan telah banyak digunakan dalam implementasi banyak fungsi kernel Linux. Dalam percobaan ini, kami akan mempelajari konsep dasar, prinsip -prinsip, dan teknik implementasi modul, dan kemudian menggunakan modul kernel untuk memprogram dan mengakses informasi dasar dari proses tersebut, sehingga memperdalam pemahaman kami tentang konsep proses dan penguasaan teknik pemrograman modul.
(1) Desain modul yang mengharuskan daftar nama program, nomor PID, status proses dan prioritas proses semua utas kernel dalam sistem.
(2) Rancang modul dengan parameter, yang parameternya adalah nomor PID dari suatu proses. Fungsi modul ini adalah untuk mencantumkan informasi keluarga dari proses, termasuk nama program dan jumlah PID dari proses induk, proses saudara dan proses anak.
(3) Harap baca lebih lanjut implementasi kode sumber dari fungsi kernel yang relevan yang digunakan dalam program berdasarkan situasi Anda sendiri.
(1) Akrab dengan antarmuka perintah Linux.
(2) Melalui aplikasi pemrograman dari panggilan sistem terkait untuk kontrol proses Linux, kami akan semakin memperdalam pemahaman kami tentang konsep proses, mengklarifikasi koneksi dan perbedaan antara proses dan program, dan memahami makna spesifik dari pelaksanaan proses yang bersamaan.
(3) Melalui penggunaan mekanisme komunikasi pipa Linux, mekanisme komunikasi antrian pesan, dan mekanisme komunikasi memori bersama, memperdalam pemahaman berbagai jenis metode komunikasi proses.
(4) memperdalam pemahaman mekanisme sinkronisasi semaphore melalui penerapan semafor POSIX di Linux. (5) Harap baca lebih lanjut dan analisis implementasi kode sumber kernel dari panggilan sistem terkait berdasarkan situasi Anda sendiri.
(1) Akrab dengan perintah Linux umum: PWD, UserAdd, Passwd, WHO, PS, PStree, Kill, Top, LS, CD, MKDIR, RMDIR, CP, RM, MV, Cat, More, Grep, dll.
(2) Menerapkan shell simulasi:
Tulis tiga program berbeda CMD1.C, CMD2.C, dan CMD3.C. Fungsi masing -masing program disesuaikan dan dikompilasi ke dalam file yang dapat dieksekusi CMD1, CMD2, dan CMD3 masing -masing. Kemudian tulis program untuk mensimulasikan fungsi program shell. Ini dapat membuat proses anak untuk perintah yang sesuai berdasarkan string yang dimasukkan oleh pengguna (mewakili nama perintah yang sesuai) dan diizinkan menjalankan program yang sesuai. Proses induk menunggu proses anak berakhir, dan kemudian menunggu perintah berikutnya untuk diterima. Jika perintah yang diterima keluar, proses induk berakhir; Jika perintah yang diterima adalah perintah yang tidak valid, "perintah tidak ditemukan" ditampilkan dan Anda terus menunggu.
(3) Menerapkan program komunikasi pipa:
Pipa dibuat oleh proses induk, dan kemudian 3 proses anak dibuat, dan ketiga proses anak ini menggunakan pipa untuk berkomunikasi dengan proses induk: proses anak mengirimkan informasi, dan proses induk dan tiga proses anak lainnya menerima informasi setelah semua pesan pengiriman. Konten komunikasi spesifik dapat dirancang sesuka hati sesuai dengan kebutuhan Anda sendiri, dan diperlukan untuk menguji berbagai situasi dalam proses pemblokiran pemblokiran dan penulisan, menguji ukuran default pipa, dan menggunakan mekanisme semaphore POSIX untuk mencapai akses yang saling eksklusif ke pipa di antara proses. Jalankan program untuk mengamati jumlah aktual byte yang dibaca dan ditulis berdasarkan proses dan proses pemblokiran dan bangun dalam berbagai keadaan.
(4) Gunakan mekanisme komunikasi antrian pesan Linux untuk mewujudkan komunikasi antara dua utas:
Tulis program untuk membuat dua utas: utas pengirim dan menerima utas, di mana utas pengirim menjalankan fungsi pengirim (), yang membuat antrian pesan, dan kemudian loop untuk menunggu pengguna memasukkan serangkaian karakter melalui terminal, mengirim serangkaian karakter ke utas penerima melalui antrian pesan sampai pengguna masuk "keluar"; Akhirnya, ia mengirim pesan "Akhiri" ke utas penerima, dan menunggu balasan penerima. Setelah pesan balasan, ini menampilkan informasi balasan yang diterima di layar terminal, menghapus antrian pesan yang relevan, dan mengakhiri program berjalan. Utas penerima berjalan menerima (), yang menerima pesan dari pengirim melalui antrian pesan dan menampilkan pesan di layar terminal sampai menerima pesan dengan "end". Pada saat ini, ia mengirim pesan jawaban "lebih" ke pengirim, mengakhiri menjalankan program. Gunakan semafor tanpa nama untuk mencapai sinkronisasi dan pengecualian timbal balik antara dua utas.
(5) Gunakan mekanisme komunikasi memori bersama Linux untuk mewujudkan komunikasi antara dua proses:
Tulis pengirim program, yang menciptakan memori bersama, dan kemudian menunggu pengguna untuk memasukkan serangkaian karakter melalui terminal, dan mengirimkan string karakter ke penerima melalui memori bersama; Akhirnya, menunggu balasan penerima. Setelah menerima pesan balasan, itu menampilkan informasi balasan yang diterima di layar terminal, menghapus memori bersama, dan mengakhiri program berjalan. Tulis program penerima, yang menerima pesan dari pengirim melalui memori bersama, menampilkan pesan di layar terminal, dan kemudian mengirim pesan jawaban "lebih" ke pengirim melalui memori bersama, mengakhiri berjalan program. Gunakan semaphore atau sistem vhaphore v untuk mencapai penggunaan memori bersama yang saling eksklusif dan sinkron oleh dua proses.
Melalui pengelolaan ruang penyimpanan file tertentu, struktur fisik file, struktur direktori dan operasi file, kami akan memperdalam pemahaman kami tentang struktur data internal, fungsi dan proses implementasi sistem file.
(1) Buka ruang disk virtual dalam memori sebagai partisi penyimpanan file, dan terapkan sistem file sederhana dalam satu pengguna sistem tugas tunggal berdasarkan direktori multi-level. Saat keluar dari sistem file, sistem file virtual harus disimpan ke disk sebagai file sehingga dapat dikembalikan ke ruang disk virtual dalam memori berikutnya.
(2) Alokasi ruang penyimpanan file dapat dilakukan dengan alokasi tautan eksplisit atau metode lainnya.
(3) Anda dapat memilih diagram bit atau metode lain untuk mengelola ruang disk gratis. Jika bitmap digunakan untuk mengelola ruang penyimpanan file dan menggunakan alokasi tautan eksplisit, maka bitmap dapat digabungkan menjadi lemak.
(4) Struktur direktori file mengadopsi struktur direktori multi-level. Untuk kesederhanaan, node indeks dapat digunakan, setiap item direktori harus berisi informasi seperti nama file, alamat fisik, panjang, dll., Dan file baca dan tulis juga dapat dilindungi melalui item direktori.
(5) Perintah operasi berikut diperlukan: