Tổ chức nhân Linux


8

Trong khi tôi đang thực hiện một số đọc trên các cuộc gọi hệ thống, tôi đã tìm kiếm "syscalls.h" để tìm tệp tiêu đề trong LXR. Kết quả tìm kiếm làm tôi hoang mang. Có một tá các tập tin "syscalls.h" đến từ các thư mục trong "arch / _arch_name_ / include / asm". Đây là ok, chúng là định nghĩa cụ thể kiến ​​trúc hoặc một cái gì đó cần thiết. Câu hỏi đặt ra là tại sao chúng ta có hai tiêu đề "syscalls.h" khác nhau trong cả hai / include / linux và / include / asm-generic?

Ngoài ra, tôi muốn tìm hiểu rằng các tiêu đề / include / linux dùng để làm gì và các tiêu đề / include / asm-generic dùng để làm gì. Làm thế nào để họ phân biệt giữa nhau? Logic đằng sau việc có hai thư mục tiêu đề riêng biệt là gì? Làm thế nào để họ liên quan với nhau?

Cảm ơn

Câu trả lời:


1

Phần mềm phải là xách tay. Nếu bạn biên dịch các nguồn C / C ++ của mình, thì bạn không cần biết liệu bạn có chạy i386 / x86_64 / arm / mips hay không. Các tiêu đề được liên kết theo cách mà phần mềm biên dịch.

Tất cả các tệp tiêu đề khác tồn tại bởi vì chúng được triển khai rất nhiều tiêu chuẩn khác nhau, có các cổng từ BSD, v.v. Vì vậy, nhiều người trong số họ là dựa trên lịch sử. Mỗi người đến từ đâu và tại sao họ lại có nhiều lý do khác nhau và chắc chắn sẽ thổi câu trả lời.

Và một câu trả lời cho asm-generic: stackoverflow


1

Các tiêu đề bên dưới asm/genericchủ yếu là các biện pháp ngăn chặn, các phiên bản di động trong C cho đến khi một phiên bản dành riêng cho kiến ​​trúc được viết. Bạn cũng sẽ thấy rằng trong một số trường hợp /usr/include/foobar.hbao gồm một loạt các tiêu đề "triển khai nội bộ" và cuối cùng rơi vào một phần xuất phát từ kernel, thường được gọi là tương tự. Ví dụ là math.hvà (phụ thuộc nhiều hơn vào Linux) syscall.h.


0

arch/x86/entry/ có hai tập tin tòa nhà đặc biệt:

syscalls/syscall_32.tbl và dito "64"

Các tòa nhà cao tầng rất đặc biệt vì hạt nhân phải mang ABI và API lại với nhau.

Nói chung, các thư mục bao gồm và các tệp tiêu đề khác (các tệp độc lập như kernel / calendar / calendar.h) tuân theo logic phân cấp. Tôi nghĩ rằng cả make và gcc đều đóng một vai trò.

Có sử dụng có hệ thống các ký hiệu này để đảm bảo mọi "đơn vị" tiêu đề chỉ được đọc một lần. ("giấy gói bảo vệ" vì có thể có quá nhiều chéo chéo). Đây từ include/linux/mm.h:

    #ifndef _LINUX_MM_H
    #define _LINUX_MM_H

    #include <linux/errno.h>

    #ifdef __KERNEL__

    ...  (#includes)
    ...  (ext. decl. etc., the whole mm.h)

    #endif /* __KERNEL__ */
    #endif /* _LINUX_MM_H */

Các tập tin tbl có:

# 32-bit system call numbers and entry vectors

Danh sách bắt đầu bằng:

0    i386    restart_syscall    sys_restart_syscall       __ia32_sys_restart_syscall
1    i386    exit               sys_exit                  __ia32_sys_exit
2    i386    fork               sys_fork                  __ia32_sys_fork
3    i386    read               sys_read                  __ia32_sys_read




#
# 64-bit system call numbers and entry vectors
#
# The format is:
# <number> <abi> <name> <entry point>
#
# The __x64_sys_*() stubs are created on-the-fly for sys_*() system calls
#
# The abi is "common", "64" or "x32" for this file.

Tôi sẽ làm bố trí sau ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.