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?
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. –
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'). –
Không có đăng nhập 'dmesg' liên quan đến cuộc gọi hệ thống' sys_hello'! –