Itu tidak mungkin karena tabel panggilan sistem (dipanggil sys_call_table) adalah array ukuran statis. Dan ukurannya ditentukan pada waktu kompilasi dengan jumlah syscalls terdaftar. Ini berarti tidak ada ruang untuk yang lain.
Anda dapat memeriksa implementasi misalnya untuk arsitektur x86 dalam arch/x86/kernel/syscall_64.cfile, di mana sys_call_tabledidefinisikan. Ukurannya persis __NR_syscall_max+1. __NR_syscall_maxdidefinisikan arch/x86/kernel/asm-offsets_64.csebagai sizeof(syscalls) - 1(ini adalah jumlah syscall terakhir), di mana syscalladalah tabel dengan semua syscalls.
Salah satu solusi yang mungkin adalah dengan menggunakan kembali beberapa yang sudah ada (atau sudah usang jika arsitektur Anda memiliki satu, lihat sys_setaltrootmisalnya) nomor panggilan dengan Anda karena ini tidak akan memerlukan lebih banyak ruang dalam memori. Beberapa arsitektur mungkin juga memiliki lubang di tabel syscall (seperti versi 64 bit x86) sehingga Anda dapat menggunakannya juga.
Anda dapat menggunakan teknik ini jika Anda mengembangkan syscall baru dan hanya ingin menghindari reboot saat bereksperimen. Anda harus menentukan panggilan sistem baru Anda, menemukan entri yang ada di tabel syscall dan kemudian menggantinya dari modul Anda.
Melakukan hal ini dari modul kernel tidak sepele karena kernel tidak mengekspor sys_call_tableke modul pada versi 2.6 (versi kernel terakhir yang mengekspor simbol ini 2.5.41).
Salah satu cara untuk mengatasi ini adalah mengubah kernel Anda untuk mengekspor sys_call_tablesimbol ke modul. Untuk melakukan ini, Anda harus menambahkan dua baris berikut ke kernel/kallsyms.c( jangan lakukan ini pada mesin produksi ):
extern void *sys_call_table;
EXPORT_SYMBOL(sys_call_table);
Teknik lain adalah menemukan tabel syscall secara dinamis. Anda mengulangi lebih dari memori kernel, membandingkan setiap kata dengan pointer ke fungsi panggilan sistem yang dikenal. Karena Anda tahu offset syscall pengetahuan ini dalam tabel, Anda bisa menghitung alamat awal tabel.