Mari kita lihat gambar dahulu untuk mendapatkan pemahaman yang kasar.
Pertama sekali, apa yang boleh dipanggil terus oleh aplikasi ialah API yang disediakan oleh sistem, yang boleh dilakukan dalam mod pengguna (Ring3).
Kemudian API yang sepadan akan menyimpan nombor panggilan sistem yang sepadan ke daftar eax (langkah ini dilaksanakan melalui pemasangan sebaris), dan kemudian gunakan int 0x80 untuk mencetuskan gangguan (pemasangan sebaris) dan masukkan fungsi pemprosesan gangguan (fungsi ini sepenuhnya ditulis dalam kod pemasangan), kali ini ia memasuki keadaan kernel (Ring0).
Dalam fungsi pengendalian gangguan, panggilan sistem yang sepadan dengan nombor panggilan sistem akan dipanggil. Dalam fungsi ini, dua daftar ds dan es akan ditetapkan untuk menunjuk ke ruang kernel. Dengan cara ini, kami tidak boleh memindahkan data daripada mod pengguna ke mod kernel (seperti dalam open(const char * nama fail, bendera int, ...), alamat rentetan yang ditunjukkan oleh penunjuk nama fail adalah dalam ruang pengguna, Jika anda mendapatkannya dari tempat yang sepadan dalam ruang kernel, rentetan itu tidak akan wujud sama sekali), apakah yang perlu anda lakukan? Daftar fs dalam pengendali gangguan ditetapkan untuk menunjuk ke ruang pengguna, jadi masalah itu diselesaikan.
Dalam panggilan sistem, operasi yang sepadan dilakukan, seperti membuka fail, menulis fail, dsb.
Selepas diproses, ia akan kembali kepada fungsi pemprosesan gangguan, dan nilai pulangan disimpan dalam daftar eax.
Apabila kembali ke API daripada fungsi pengendalian gangguan, nilai pulangan masih disimpan dalam daftar eax. Pada masa ini, ia dipulihkan daripada mod kernel kepada mod pengguna.
Dapatkan nilai daripada eax dalam API, buat pertimbangan yang sepadan dan kembalikan nilai yang berbeza untuk menunjukkan selesainya operasi.
Dalam mod dilindungi, terdapat pelbagai gangguan, dan panggilan sistem terikat untuk mengganggu nombor 0x80. Apabila panggilan sistem akan dipanggil, int 0x80 dicetuskan, dan fungsi pengendalian gangguan menggunakan eax untuk mengetahui panggilan sistem yang ingin dipanggil. Sebabnya ialah terdapat terlalu banyak panggilan sistem dan nombor gangguan tidak akan mencukupi, jadi satu digunakan untuk pengurusan berpusat.
Terdapat jadual dalam sistem pengendalian yang digunakan untuk menyimpan alamat pelbagai fungsi panggilan sistem. Jadual ini ialah tatasusunan, jadi alamat fungsi yang berbeza boleh diakses melalui subskrip. Oleh itu, satu nombor gangguan + pelbagai nombor panggilan sistem boleh digunakan untuk mengurus berbilang panggilan sistem.
Atas ialah kandungan terperinci Memperkenalkan proses panggilan sistem di bawah Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!