64 bit sistemde Sistem Çağrısı'nı kernel 3.13.0-37-generic
'a eklemeye çalışıyorum.64 bit sistemde Linux Kernel 3.13'e yeni Sistem Çağrısı ekleme
: Bundan sonra
sudo apt-get source linux-image-3.13.0-37-generic
, çekirdek kaynak dosyaları: Ben tarafından çekirdek kaynağını indirdiğiniz
1-: /usr/src/
2- ayıklanır yeni bir sistem çağrıyı sys_hello()
tanımlama Ben /usr/src/linux-3.13/
çekirdek kaynak dizininde hello
ad altında bir dizin oluşturduk Ve aşağıda içerikle hello
dizininde bir hello.c
dosyası oluşturduktan
:
#include <linux/kernel.h>
asmlinkage long sys_hello(void)
{
printk(“Hello world\n”);
return 0;
}
Sonra bir Makefile
yarattı Aşağıdaki içerikle merhaba dizini: obj-y := hello.o
3- /usr/src/linux-3.13/Makefile
I aşağıdaki satırı değişti
çekirdeğin Makefile'dan merhaba dizin ekleyin:
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
için:
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ hello/
4- içine yeni sistem çağrısı sys_hello()
ekle sistem çağrı tablosu (syscall_64.
/usr/src/linux-3.13/arch/x86/syscalls/syscall_64.tbl
Eklendi dosyanın sonuna aşağıdaki satırı:
-Geçen tbl dosyası)
Ben 64 bit sistemi kullanıyorum çünkü ben de syscall_64.tbl
dosyasını değiştirmek gerekir satır numarası 313
314 common hello sys_hello
5- yeni sistem çağrı ekle oldu sys_hello()
asmlinkage long sys_hello(void);
6- Bu Derleme: sistem çağrı başlık dosyasına
vim /usr/src/linux-3.13/include/linux/syscalls.h
Sadece çok altındaki #endif deyimi önce dosyanın sonuna aşağıdaki satırı ekledim sistemimde çekirdek
Ben aşağıdaki komutu çalıştı çekirdek yapılandırmak için:
sudo make menuconfig
Yukarıdaki komuttan sonra bir pencere açıldı ve ext4
'un seçildiğinden ve save
olduğundan emin oldum. Daha sonra
:
durum, 2 ~ 3 saat tooks# cd /usr/src/linux-3.13/
# make
. Bundan sonra
:
# make modules_install install
Bundan sonra benim sistemini yeniden.
7- Test sistemi çağrısı (Sorun Is Here)
, yeniden başlatıldıktan sonra aşağıdaki içerikle ev klasöründe adıyla hello.c
sahip bir dosya oluşturuldu: Sonra
#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
long int amma = syscall(314); // 314 is the number of sys_hello line in `syscall_64.tbl`
printf(“System call sys_hello returned %ld\n”, amma);
return 0;
}
:
Çıktı:Sorun şu anda -1
'dir.değil 0
döndürülmelidir.
Kernel System Call'e sys_hello
gibi değil.
Neyi yanlış yapıyorum?
Yeni yapınızı çalıştırdığınızdan emin olmak için çekirdek günlüğüne bakın veya uname kontrol edin. Belki de eklemenin çekirdeğe dahil olup olmadığını görmek için system.map dosyasını kontrol edin. –
"Uname" ile bunu anlayamıyorum çünkü çekirdekten önce/sonra aynı (her ikisi de “çekirdek 3.13.0-37-generic”). –
'sys_hello' sistem çağrısı ile ilgili' dmesg'de kayıt yok! –