GNU/Linux >> Belajar Linux >  >> Linux

Di mana saya dapat menemukan kode sumber panggilan sistem?

Anda memerlukan sumber kernel Linux untuk melihat sumber sebenarnya dari panggilan sistem. Halaman manual, jika dipasang di sistem lokal Anda, hanya berisi dokumentasi panggilan dan bukan sumbernya sendiri.

Sayangnya untuk Anda, panggilan sistem tidak disimpan hanya di satu lokasi tertentu di seluruh pohon kernel. Ini karena berbagai panggilan sistem dapat merujuk ke berbagai bagian sistem (manajemen proses, manajemen sistem file, dll.) dan oleh karena itu tidak mungkin untuk menyimpannya terpisah dari bagian pohon yang terkait dengan bagian tertentu dari sistem tersebut.

Hal terbaik yang dapat Anda lakukan adalah mencari SYSCALL_DEFINE[0-6] makro. Ini digunakan (jelas) untuk mendefinisikan blok kode yang diberikan sebagai panggilan sistem. Misalnya, fs/ioctl.c memiliki kode berikut :

SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
{
/* do freaky ioctl stuff */
}

Definisi seperti itu berarti ioctl syscall dideklarasikan dan mengambil tiga argumen. Angka di sebelah SYSCALL_DEFINE berarti jumlah argumen. Misalnya, dalam kasus getpid(void) , dideklarasikan dalam kernel/timer.c , kami memiliki kode berikut :

SYSCALL_DEFINE0(getpid)
{
        return task_tgid_vnr(current);
}

Semoga itu bisa sedikit beres.


Dari sudut pandang aplikasi, system call adalah operasi dasar dan atomik yang dilakukan oleh kernel.

The Assembly Howto menjelaskan apa yang terjadi, dalam hal instruksi mesin.

Tentu saja, kernel melakukan banyak hal saat menangani syscall.

Sebenarnya, Anda hampir percaya bahwa seluruh kode kernel dikhususkan untuk menangani semua panggilan sistem (ini tidak sepenuhnya benar, tetapi hampir; dari sudut pandang aplikasi, kernel hanya terlihat melalui panggilan sistem). Jawaban lain oleh Daniel Kamil Kozar menjelaskan fungsi kernel apa yang memulai penanganan beberapa panggilan sistem (tetapi sangat sering, banyak bagian lain dari kernel secara tidak langsung berpartisipasi dalam panggilan sistem; misalnya, penjadwal berpartisipasi secara tidak langsung dalam mengimplementasikan fork karena mengelola proses anak yang dibuat oleh fork yang berhasil syscall).


Linux
  1. Di mana saya dapat menemukan file buildinfo.sh?

  2. Di mana saya dapat menemukan php.ini?

  3. Di mana saya menemukan versi pohon sumber kernel Linux?

  1. Di mana Kode Penjadwal CFS Linux?

  2. Nomor baris sumber dalam grafik panggilan perf?

  3. Bagaimana saya bisa mengetahui apakah sistem Linux menggunakan Wayland atau X11?

  1. Panggilan sistem Linux tercepat

  2. Di mana saya dapat mengetahui di mana sebuah paket telah diinstal?

  3. Di mana saya dapat menemukan Amazon Linux AMI Image untuk VirtualBox?