2014-11-03 23 views
9

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

ben adım şimdiye kadar adım ne yaptığını göstermeye çalışacağım

: 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?

+0

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. –

+0

"Uname" ile bunu anlayamıyorum çünkü çekirdekten önce/sonra aynı (her ikisi de “çekirdek 3.13.0-37-generic”). –

+0

'sys_hello' sistem çağrısı ile ilgili' dmesg'de kayıt yok! –

cevap

6

Sorun, 6. adımdan son adıma (Derleme Çekirdeği) idi.

5. adımda sonra, aşağıdaki adımları yapmak zorunda: sistemimde bu Çekirdeğin derlenmesi

6-

Ben aşağıdaki komutu çalıştı çekirdek yapılandırmak için:

# make menuconfig 

Yukarıdaki komuttan sonra bir pencere açıldı ve ext4'ün seçildiğinden emin olduktan sonra kaydettim. Bu /usr/src/ bazı deb dosyaları yaratacak

# make -j 5 KDEB_PKGVERSION=1.arbitrary-name deb-pkg 

:

Sonra zorundayız yeni çekirdeğinden DEB dosya oluşturmak için.

Bundan sonra bunları yüklemeniz gerekir:

# dpkg -i linux*.deb 

O sisteminize yeni kernel kuracaktır.

Şimdi sisteminizi yeniden başlatın.

$ uname -r 

Ve yeni sistem Çağrı çekirdek ya da değil eklendi bilmek istiyorum sadece yazın:: Sistem yeniden başlatılması sonra yeni çekirdek yüklü olup olmadığını öğrenebilirsiniz

$ cat /proc/kallsyms | grep <system call name> 

Benim durumumda :

$ cat /proc/kallsyms | grep hello 

ardından çıkış Sistem Çağrı başarıyla Çekirdeği'ne eklendi belirtir:

0000000000000000 T sys_hello