2013-07-15 47 views
6

Tôi đang đọc Phát triển hạt nhân Linux của Robert Love và một trong những bài tập anh ấy làm là tạo cuộc gọi hệ thống (trang 106). Vấn đề là tôi không thể tìm thấy tập tin bảng gọi hệ thống trong v3.9 cho kiến ​​trúc x86_32. Tôi biết rằng anh ấy đang sử dụng phiên bản 2.6.xx nhưng tôi không biết liệu phiên bản đó có hoạt động với bản phân phối mà tôi đang sử dụng vì nó khá cũ nên tôi thà thích v3.9 hơn.Bảng gọi hệ thống trong hạt nhân Linux ở đâu?

Thông tin thêm: Việc thực hiện mà tôi đang nói là: Thêm mục vào cuối bảng gọi hệ thống.Điều này cần được thực hiện cho mỗi kiến ​​trúc hỗ trợ cuộc gọi hệ thống (mà, đối với hầu hết cuộc gọi, là tất cả các kiến ​​trúc). Vị trí của syscall trong bảng, bắt đầu từ số không, là số gọi hệ thống của nó. Ví dụ, mục thứ mười trong danh sách được gán syscall số chín.

Giải quyết bằng cách sử dụng phương pháp sau: Bảng gọi hệ thống nằm trong kiến ​​trúc x86/syscalls/syscall_32.tbl cho kiến ​​trúc x86. Nhờ Sudip Mukherjee vì sự giúp đỡ của anh ấy.

Một cách khác là như sau: http://lists.kernelnewbies.org/pipermail/kernelnewbies/2013-July/008598.html Nhờ Srinivas Ganji sự giúp đỡ của ông quá.

+0

nơi mà bạn đã tìm kiếm nó? – mnagel

+0

Trong cuốn sách nó nói rằng nó nằm ở mục nhập. Nhưng theo như tôi biết điều này đã được thay đổi trong các phiên bản mới nhất.Vì vậy, tôi đã tìm kiếm trong arch/x86/kernel, nơi tôi đã tìm thấy các entry_32.S tập tin nhưng tôi đã không tìm thấy bảng đó không có – Iker

+0

Nó sẽ xuất hiện để được [ở đây] (http://lxr.linux.no /#linux+v3.9/arch/x86/ia32/syscall_ia32.c#L18) – levengli

Trả lời

6

Tạo một thư mục kiểm tra trong thư mục gốc src: src/linux-3.4/testing/, sau đó đặt bên trong thư mục này:
- một tập tin có chứa mã syscall: strcpy.c

#include <linux/linkage.h> 
#include <linux/kernel.h> 
asmlinkage long sys_strcpy(char *dest, char *src) 
{ 
    int i=0; 
    while(src[i]!='\0') { 
     dest[i]=src[i++]; 
    } 
    dest[i]='\0'; 
    printk(" Done it "); 
    return 0; 
} 

và Makefile có chứa chỉ các dòng sau:

obj-y:=strcpy.o 

Thêm mục nhập vào bảng syscall và nguyên mẫu của hàm:
- chỉnh sửa tệp src/linux-3.4/arch/x86/syscalls/syscall_32.tbl b y thêm dòng này với entry 223 đó là miễn phí

223  i386 strcpy   sys_strcpy 

Chỉnh sửa các tập tin src/linux-3.4/include/linux/syscalls.h bằng cách thêm các nguyên mẫu của hàm

asmlinkage long sys_strcpy(char *dest, char *src); 

Sửa Makefile chính trong thư mục gốc src (src/linux-3.4/Makefile) bằng cách thêm kiểm tra thư mục đã tạo trước đó, như sau:

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

từ linux kernel 4.2, bảng hệ thống gọi đã được chuyển từ arch/x86/syscalls/syscall_64.tbl t o arch/x86/entry/syscalls/syscall_64.tbl

Đây là tương ứng commit:

commit 1f57d5d85ba7f1f467173ff33f51d01a91f9aaf1 
Author: Ingo Molnar <[email protected]> 
Date: Wed Jun 3 18:36:41 2015 +0200 

    x86/asm/entry: Move the arch/x86/syscalls/ definitions to arch/x86/entry/syscalls/ 

    The build time generated syscall definitions are entry code related, move 
    them into the arch/x86/entry/ directory. 
Các vấn đề liên quan