Rumah Tutorial sistem LINUX Pengesanan kernel Linux panggilan sistem Syscall

Pengesanan kernel Linux panggilan sistem Syscall

Feb 12, 2024 pm 09:21 PM
linux tutorial linux sistem linux arahan linux skrip shell embeddedlinux Bermula dengan linux pembelajaran linux

Dalam ruang pengguna Linux, kita selalunya perlu memanggil panggilan sistem. Mari kita ambil Linux versi 2.6.37 sebagai contoh untuk menjejaki pelaksanaan panggilan sistem baca. Pelaksanaan panggilan sistem mungkin berbeza antara versi Linux.

Pengesanan kernel Linux panggilan sistem Syscall

Dalam sesetengah aplikasi, kita boleh melihat definisi berikut:

scssCopy code
#define real_read(fd, buf, count ) (syscall(SYS_read, (fd), (buf), (count)))
Salin selepas log masuk

Sebenarnya, yang sebenarnya dipanggil ialah fungsi sistem syscall(SYS_read), iaitu fungsi sys_read(). Dalam versi Linux 2.6.37, fungsi ini dilaksanakan melalui beberapa definisi makro.

Panggilan sistem Linux (SCI, antara muka panggilan sistem) sebenarnya adalah proses pengagregatan dan penguraian berbilang saluran Titik pengagregatan ialah titik masuk gangguan 0x80 (struktur sistem X86). Maksudnya, semua panggilan sistem diagregatkan dari ruang pengguna ke titik gangguan 0x80, dan nombor panggilan sistem tertentu disimpan pada masa yang sama. Apabila pengendali gangguan 0x80 sedang berjalan, panggilan sistem yang berbeza akan diproses secara berasingan mengikut nombor panggilan sistem, iaitu, fungsi kernel yang berbeza akan dipanggil untuk diproses.

Terdapat dua cara untuk menyebabkan panggilan sistem:

(1) int $0×80, ini adalah satu-satunya cara untuk menyebabkan panggilan sistem dalam versi kernel Linux lama.

(2) arahan pemasangan sysenter

Dalam kernel Linux, kita boleh menggunakan takrifan makro berikut untuk membuat panggilan sistem.

SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
{
    struct file *file;
    ssize_t ret = -EBADF;
    int fput_needed;

    file = fget_light(fd, &fput_needed);
    if (file) {
        loff_t pos = file_pos_read(file);
        ret = vfs_read(file, buf, count, &pos);
        file_pos_write(file, pos);
        fput_light(file, fput_needed);
    }

    return ret;
}
Salin selepas log masuk

Takrifan makro SYSCALL_DEFINE3 adalah seperti berikut:

#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
Salin selepas log masuk

## bermaksud menggantikan terus aksara dalam makro,
Jika name = read, maka __NR_##name digantikan dengan __NR_read dalam makro. NR##nama ialah nombor panggilan sistem, ## merujuk kepada dua pengembangan makro. Iaitu, gantikan "nama" dengan nama panggilan sistem sebenar, dan kemudian kembangkan __NR.... Jika nama == ioctl, ia ialah __NR_ioctl.

#ifdef CONFIG_FTRACE_SYSCALLS
#define SYSCALL_DEFINEx(x, sname, ...)                \
    static const char *types_##sname[] = {            \
        __SC_STR_TDECL##x(__VA_ARGS__)            \
    };                            \
    static const char *args_##sname[] = {            \
        __SC_STR_ADECL##x(__VA_ARGS__)            \
    };                            \
    SYSCALL_METADATA(sname, x);                \
    __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
#else
#define SYSCALL_DEFINEx(x, sname, ...)                \
    __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
#endif
Salin selepas log masuk

Tidak kira sama ada makro CONFIG_FTRACE_SYSCALLS ditakrifkan atau tidak, takrif makro berikut akhirnya akan dilaksanakan:

__SYSCALL_DEFINEx(x, sname, VA_ARGS)

#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS

#define SYSCALL_DEFINE(name) static inline 
long SYSC_##name

#define __SYSCALL_DEFINEx(x, name, ...)                    \
    asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__));        \
    static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__));    \
    asmlinkage long SyS##name(__SC_LONG##x(__VA_ARGS__))        \
    {                                \
        __SC_TEST##x(__VA_ARGS__);                \
        return (long) SYSC##name(__SC_CAST##x(__VA_ARGS__));    \
    }                                \
    SYSCALL_ALIAS(sys##name, SyS##name);                \
    static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__))

#else /*
 CONFIG_HAVE_SYSCALL_WRAPPERS */

#define SYSCALL_DEFINE(name) asmlinkage 
long sys_##name
#define __SYSCALL_DEFINEx(x, name, ...)                    \
    asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))

#endif /*
 CONFIG_HAVE_SYSCALL_WRAPPERS */
Salin selepas log masuk

Jenis takrifan makro berikut akhirnya akan dipanggil:

asmlinkage sys panjang##nama(__SC_DECL##x(VA_ARGS))
Itulah fungsi sistem sys_read() yang kami nyatakan sebelum ini.
asmlinkage memberitahu pengkompil untuk mengekstrak hanya argumen fungsi dari timbunan. Semua panggilan sistem memerlukan kelayakan ini! Ini serupa dengan definisi makro yang disebutkan dalam artikel quagga kami sebelum ini.

Iaitu, kod berikut dalam definisi makro:

struct file *file;
    ssize_t ret = -EBADF;
    int fput_needed;

    file = fget_light(fd, &fput_needed);
    if (file) {
        loff_t pos = file_pos_read(file);
        ret = vfs_read(file, buf, count, &pos);
        file_pos_write(file, pos);
        fput_light(file, fput_needed);
    }

    return ret;
Salin selepas log masuk

Analisis kod:

  • fget_light(): Menurut indeks yang ditentukan oleh fd, dapatkan semula objek fail yang sepadan daripada deskriptor proses semasa (lihat Rajah 3).
  • Jika objek fail yang ditentukan tidak ditemui, ralat dikembalikan
  • Jika objek fail yang ditentukan ditemui:
  • Panggil fungsi file_pos_read() untuk mendapatkan kedudukan semasa fail dibaca dan ditulis kali ini.
  • Panggil vfs_read() untuk melakukan operasi membaca fail, dan fungsi ini akhirnya memanggil fungsi yang ditunjuk oleh file->f_op.read() Kodnya adalah seperti berikut:

jika (fail->f_op->baca)
ret = fail->f_op->baca(fail, buf, kiraan, pos);

  • Panggil file_pos_write() untuk mengemas kini kedudukan baca dan tulis semasa fail.
  • Panggil fput_light() untuk mengemas kini kiraan rujukan fail.
  • Akhirnya, bilangan bait data yang dibaca dikembalikan.

Pada ketika ini, pemprosesan yang dilakukan oleh lapisan sistem fail maya selesai, dan kawalan diserahkan kepada lapisan sistem fail ext2.

Atas ialah kandungan terperinci Pengesanan kernel Linux panggilan sistem Syscall. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial Java
1658
14
Tutorial PHP
1257
29
Tutorial C#
1231
24
Seni Bina Linux: Melancarkan 5 Komponen Asas Seni Bina Linux: Melancarkan 5 Komponen Asas Apr 20, 2025 am 12:04 AM

Lima komponen asas sistem Linux adalah: 1. Kernel, 2. Perpustakaan Sistem, 3. Utiliti Sistem, 4. Antara Muka Pengguna Grafik, 5. Aplikasi. Kernel menguruskan sumber perkakasan, Perpustakaan Sistem menyediakan fungsi yang telah dikompilasi, utiliti sistem digunakan untuk pengurusan sistem, GUI menyediakan interaksi visual, dan aplikasi menggunakan komponen ini untuk melaksanakan fungsi.

Tutorial Penggunaan Terminal VSCode Tutorial Penggunaan Terminal VSCode Apr 15, 2025 pm 10:09 PM

VSCODE Terminal terbina dalam adalah alat pembangunan yang membolehkan arahan dan skrip berjalan dalam editor untuk memudahkan proses pembangunan. Cara Menggunakan VSCode Terminal: Buka terminal dengan kekunci pintasan (Ctrl/Cmd). Masukkan arahan atau jalankan skrip. Gunakan hotkeys (seperti Ctrl L untuk membersihkan terminal). Tukar direktori kerja (seperti perintah CD). Ciri -ciri lanjutan termasuk mod debug, penyelesaian coretan kod automatik, dan sejarah arahan interaktif.

Cara memeriksa alamat gudang git Cara memeriksa alamat gudang git Apr 17, 2025 pm 01:54 PM

Untuk melihat alamat repositori Git, lakukan langkah -langkah berikut: 1. Buka baris arahan dan navigasi ke direktori repositori; 2. Jalankan perintah "Git Remote -V"; 3. Lihat nama repositori dalam output dan alamat yang sepadan.

VSCODE Kunci Pintasan Seterusnya Sebelumnya VSCODE Kunci Pintasan Seterusnya Sebelumnya Apr 15, 2025 pm 10:51 PM

VS kod satu langkah/langkah seterusnya langkah pintas: satu langkah (mundur): Windows/Linux: Ctrl ←; MacOS: CMD ← Langkah seterusnya (ke hadapan): Windows/Linux: Ctrl →; MACOS: CMD →

Cara menjalankan luhur setelah menulis kod Cara menjalankan luhur setelah menulis kod Apr 16, 2025 am 08:51 AM

Terdapat enam cara untuk menjalankan kod di Sublime: melalui hotkeys, menu, sistem membina, baris arahan, menetapkan sistem binaan lalai, dan arahan membina adat, dan menjalankan fail/projek individu dengan mengklik kanan pada projek/fail. Ketersediaan sistem membina bergantung kepada pemasangan teks luhur.

Apr 16, 2025 pm 07:39 PM

Walaupun Notepad tidak dapat menjalankan kod Java secara langsung, ia dapat dicapai dengan menggunakan alat lain: menggunakan pengkompil baris arahan (Javac) untuk menghasilkan fail bytecode (fileName.class). Gunakan Java Interpreter (Java) untuk mentafsir bytecode, laksanakan kod, dan output hasilnya.

Apakah tujuan utama Linux? Apakah tujuan utama Linux? Apr 16, 2025 am 12:19 AM

Penggunaan utama Linux termasuk: 1. Sistem Operasi Pelayan, 2. Sistem Terbenam, 3. Linux cemerlang dalam bidang ini, menyediakan kestabilan, keselamatan dan alat pembangunan yang cekap.

Kod pemasangan Laravel Kod pemasangan Laravel Apr 18, 2025 pm 12:30 PM

Untuk memasang Laravel, ikuti langkah -langkah berikut dalam urutan: Pasang komposer (untuk macOS/linux dan windows) Pasang pemasang Laravel Buat aplikasi akses perkhidmatan permulaan projek baru (URL: http://127.0.0.1:8000) Sediakan sambungan pangkalan data (jika diperlukan)

See all articles