2014-11-03 18 views
9

Tôi đang cố gắng thêm helloworld gọi hệ thống đơn giản vào kernel 3.13.0-37-generic trên hệ thống 64 bit.Thêm hệ thống gọi mới vào hạt nhân Linux 3.13 trên hệ thống 64 bit

tôi sẽ cố gắng thể hiện những gì tôi đã làm cho đến nay bước bước:

1- Tôi đã tải về mã nguồn kernel bởi:

sudo apt-get source linux-image-3.13.0-37-generic 

Sau đó, các file mã nguồn kernel được trích xuất thành /usr/src/

2- Xác định cuộc gọi hệ thống mới sys_hello():

tôi đã tạo ra một thư mục với hello tên trong thư mục mã nguồn kernel trong /usr/src/linux-3.13/

Và tôi đã tạo ra một tập tin hello.c trong hello thư mục với bên dưới nội dung:

#include <linux/kernel.h> 

asmlinkage long sys_hello(void) 
{ 
     printk(“Hello world\n”); 
     return 0; 
} 

Sau đó, tôi đã tạo ra một Makefile trong thư mục hello có nội dung sau:

obj-y := hello.o 

3 Thêm thư mục chào Makefile của kernel

tôi đã thay đổi dòng sau trong /usr/src/linux-3.13/Makefile:

core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ 

tới:

core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ hello/ 

4- Thêm hệ thống gọi mới sys_hello() vào bảng gọi hệ thống (syscall_64.tập tin tbl)

Bởi vì tôi đang sử dụng hệ thống 64 bit, tôi cần phải thay đổi các tập tin syscall_64.tbl trong:

/usr/src/linux-3.13/arch/x86/syscalls/syscall_64.tbl 

gia tăng dòng sau vào cuối file:

-Last số dòng là 313

314  common hello sys_hello 

5- Thêm cuộc gọi hệ thống mới sys_hello() trong file header hệ thống gọi

vim /usr/src/linux-3.13/include/linux/syscalls.h 

Tôi đã thêm các dòng sau vào cuối của tập tin ngay trước khi tuyên bố #endif ở dưới cùng rất:

asmlinkage long sys_hello(void); 

6- Biên soạn này kernel trên hệ thống của tôi

Để cấu hình kernel tôi đã thử các lệnh sau:

sudo make menuconfig 

Sau lệnh trên, cửa sổ bật lên xuất hiện và tôi đảm bảo rằng ext4 đã được chọn và sau đó là save.

Sau đó:

# cd /usr/src/linux-3.13/ 
# make 

Nó tooks 2 ~ 3 giờ.

Sau đó:

# make modules_install install 

Sau đó, tôi khởi động lại hệ thống của tôi.

7- Kiểm tra các cuộc gọi hệ thống (Vấn đề là ở đây)

Sau khi khởi động lại, tôi đã tạo ra một tập tin với tên hello.c trong thư mục nhà với nội dung sau:

#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; 
} 

Sau đó:

# gcc hello.c 
# ./a.out 

Đầu ra là:

System call sys_hello returned -1 

Vấn đề chính xác là -1. Phải trả lại 0 không -1.

Có vẻ như sys_hello không được thêm vào Kernel System Call.

Tôi đang làm gì sai?

+0

Tìm nhật ký hạt nhân hoặc kiểm tra chưa xác định để đảm bảo bạn đang chạy bản dựng mới của mình. Có thể kiểm tra system.map để xem liệu phần bổ sung của bạn có được bao gồm trong hạt nhân hay không. –

+0

Tôi không thể tìm ra bằng nguyên nhân 'uname' trước/sau khi kernel giống nhau (Cả hai đều là' kernel 3.13.0-37-generic'). –

+0

Không có đăng nhập 'dmesg' liên quan đến cuộc gọi hệ thống' sys_hello'! –

Trả lời

6

Sự cố là từ bước 6 đến bước cuối cùng (Biên dịch hạt nhân).

Sau bước 5, chúng ta phải làm bước sau:

6- Biên dịch kernel này trên hệ thống của tôi

Để cấu hình kernel Tôi đã thử các lệnh sau:

# make menuconfig 

Sau lệnh trên, một cửa sổ bật lên xuất hiện và tôi chắc chắn rằng ext4 đã được chọn và sau đó lưu lại.

Sau đó, để tạo DEB tập tin từ kernel mới chúng ta phải:

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

Nó sẽ tạo ra một số deb file trong /usr/src/.

Sau đó chúng ta cần phải cài đặt chúng:

# dpkg -i linux*.deb 

Nó sẽ cài đặt hạt nhân mới trên hệ thống của bạn.

Bây giờ, hãy khởi động lại hệ thống của bạn. Sau khi hệ thống khởi động lại, bạn có thể tìm hiểu xem kernel mới được cài đặt hay không:

$ uname -r 

Và nếu bạn muốn biết hệ thống Gọi mới của bạn thêm vào hạt nhân hay không chỉ cần gõ:

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

Trong trường hợp của tôi :

$ cat /proc/kallsyms | grep hello 

đầu ra sau chỉ ra rằng hệ thống của bạn Gọi thêm thành công với Kernel:

0000000000000000 T sys_hello 
Các vấn đề liên quan