Dalam Linux, panggilan sistem merujuk kepada satu set antara muka khas yang disediakan oleh sistem pengendalian untuk program pengguna untuk dipanggil proses pengguna terperangkap dalam kernel Lokasi tertentu, atau laluan yang dirancang untuk pengguna mengakses kernel, hanya boleh dimasukkan dari lokasi tetap.
Persekitaran pengendalian tutorial ini: sistem linux7.3, komputer Dell G3.
1 Apakah itu panggilan sistem
Panggilan sistem merujuk kepada panggilan yang disediakan oleh sistem pengendalian kepada. atur cara pengguna Satu set antara muka khas yang melaluinya atur cara pengguna boleh mendapatkan perkhidmatan daripada kernel sistem pengendalian. Ia menetapkan lokasi tertentu di mana proses pengguna jatuh ke dalam kernel, atau merancang laluan untuk pengguna mengakses kernel, dan hanya boleh memasuki kernel dari lokasi tetap.
2. Panggilan sistem Linux
Untuk sistem pengendalian moden, panggilan sistem ialah cara komunikasi yang biasa antara ruang pengguna dan kernel, dan Linux tidak terkecuali. Mengikut kawasan fungsian, panggilan sistem Linux secara kasar dibahagikan kepada kawalan proses, capaian fail, kawalan sistem, pengurusan storan, pengurusan rangkaian, komunikasi proses, dll. Untuk penerangan terperinci, anda boleh melihat penerangan halaman manual melalui arahan man 2 syscalls.
Panggilan sistem hanya menghantar permintaan kepada kernel melalui mekanisme gangguan lembut dan memasuki perkhidmatan panggilan sistem yang sepadan. Antara muka pengaturcaraan pengguna yang disediakan oleh Linux mengikut piawaian POSIX Selain mentakrifkan beberapa fungsi C standard, set piawaian ini juga menyediakan satu set rutin enkapsulasi untuk merangkum panggilan sistem untuk pengaturcaraan pengguna. Walau bagaimanapun, enkapsulasi tidak diperlukan Jika anda bersedia untuk membuat panggilan terus, kernel Linux juga menyediakan fungsi syscall() untuk melaksanakan panggilan. Ketahui perbezaan antara panggilan perpustakaan C dan panggilan langsung melalui contoh berikut.
/* ** file: demo.c ** author: eric.xu ** date: 2016-02-25 */ #include <syscall.h> #include <unistd.h> #include <sys/types.h> #include <stdio.h> int main(void) { long id1, id2; /* system call no 20, __NR_getpid equal to SYS_getpid */ id1 = syscall(__NR_getpid); printf("sys_call getpid %ldn", id1); /* libc getpid */ id2 = getpid(); printf("libc getpid %ldn", id2); return 0; }
Kompil dan jalankan, anda boleh lihat hasilnya konsisten.
sys_call getpid 2899 libc getpid 2899
3. Pelaksanaan panggilan sistem Linux
Apabila proses mod pengguna memanggil panggilan sistem, CPU bertukar kepada mod kernel dan mula melaksanakan fungsi kernel. Oleh kerana setiap panggilan sistem dalam kernel mempunyai label unik, panggilan mod pengguna mesti melepasi parameter nombor panggilan sistem untuk menentukan fungsi panggilan sistem tertentu. Semua fungsi panggilan sistem adalah integer Dalam kernel, integer dan 0 menunjukkan bahawa panggilan sistem berakhir dengan jayanya, dan nombor negatif menunjukkan keadaan ralat ini akan disimpan dalam pembolehubah errno dan dikembalikan kepada aplikasi sebagai kod ralat.
Panggilan sistem Linux dilaksanakan menggunakan gangguan lembut Dalam seni bina x86, arahan pemasangan int $0x80 dipanggil ini akan menghasilkan pengecualian dengan vektor 128. Dalam seni bina lengan, arahan SWI digunakan untuk memasuki ruang kernel Mari kita lihat format arahan ini:
SWI {cond} immed24;其中immed24表示24位立即数
Pengendali gangguan pengecualian SWI perlu mendapatkan 24-bit serta-merta dengan membaca Arahan SWI yang menyebabkan nombor gangguan. Langkah asas adalah untuk mengakses daftar SPSR untuk menentukan sama ada arahan itu adalah arahan ARM atau arahan Thumb selepas pengecualian SWI dijana, dan kemudian dapatkan keseluruhan alamat arahan dengan mengakses daftar LR, dan kemudian dapatkan arahan dan dapatkan data segera 24-bit terendah.
Cadangan berkaitan: "Tutorial Video Linux"
Atas ialah kandungan terperinci Apakah panggilan sistem dalam linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!