Giao diện nhân Linux

Nhân Linux cung cấp một số giao diện cho các ứng dụng ở không gian người dùng sử dụng cho các mục đích khác nhau và có các thuộc tính khác nhau tùy theo thiết kế. Có hai loại giao diện lập trình ứng dụng (API) trong nhân Linux, không nên nhầm lẫn giữa: API "hạt nhân – không gian người dùng" và API "nội bộ hạt nhân".

API Linux 

API Linux là API hạt nhân – người sử dụng không gian, cho phép các chương trình trong không gian người dùng có thể truy cập hệ thống tài nguyên và các dịch vụ của hạt nhân Linux. Nó được cấu thành từ Giao diện cuộc gọi hệ thống của nhân Linux và các chương trình con trong Thư viện GNU C (glibc). Trọng tâm của sự phát triển API Linux là cung cấp các tính năng có thể sử dụng của các thông số kỹ thuật được xác định trong POSIX theo cách tương thích hợp lý, mạnh mẽ và hiệu quả và cung cấp các tính năng hữu ích bổ sung không có trong POSIX, giống như các API hạt nhân– không gian người dùng của các hệ thống khác đang triển khai trên API POSIX cũng cung cấp các tính năng bổ sung không có trong POSIX.

API Linux, theo lựa chọn, đã được giữ ổn định trong nhiều thập kỷ và không bao giờ bị phá vỡ;   sự ổn định này đảm bảo tính di động của mã nguồn. Đồng thời, các nhà phát triển nhân Linux trong lịch sử đã bảo thủ và tỉ mỉ trong việc giới thiệu các cuộc gọi hệ thống mới.    
Nhiều phần mềm nguồn mở và miễn phí có sẵn được viết cho API POSIX. Do có quá nhiều dòng phát triển vào nhân Linux so với các nhân tương thích với POSIX khác và thư viện chuẩn của C,nhân Linux và API của nó đã được tăng cường với các tính năng bổ sung. Theo như các tính năng bổ sung này cung cấp lợi thế kỹ thuật, lập trình cho API Linux được ưu tiên hơn API-POSIX. Các ví dụ nổi tiếng hiện nay là udev, systemd và Weston. Những người như Lennart Poettering công khai ủng hộ API Linux hơn API POSIX, nơi điều này mang lại lợi thế.

Tại FOSDEM 2016, Michael Kerrisk đã giải thích một số vấn đề được nhận thấy với API không gian người dùng của hạt nhân Linux, mô tả rằng nó chứa nhiều lỗi thiết kế do không thể mở rộng, không thể hiểu được, quá phức tạp, vi phạm các tiêu chuẩn và không nhất quán. Hầu hết các lỗi đó không thể sửa được vì làm như vậy sẽ phá vỡ ABI mà kernel thể hiện cho không gian người dùng.

Giao diện cuộc gọi hệ thống của nhân Linux 
Giao diện cuộc gọi hệ thống là toàn bộ tất cả các cuộc gọi hệ thống được triển khai và có sẵn trong một hạt nhân. Các hệ thống con khác nhau, chẳng hạn như DRM xác định các cuộc gọi hệ thống của riêng chúng và toàn bộ được gọi là Giao diện cuộc gọi hệ thống.

Nhiều vấn đề khác nhau với việc tổ chức các cuộc gọi hệ thống nhân Linux đang được thảo luận công khai. Nhiều vấn đề đã được chỉ ra bởi Andy Lutomirski, Michael Kerrisk và những người khác.

Thư viện chuẩn C 

Thư viện GNU C là một trình bao bọc xung quanh các lệnh gọi hệ thống của nhân Linux; sự kết hợp giữa Giao diện cuộc gọi hệ thống nhân Linux và glibc là thứ xây dựng lên API Linux.

 Thư viện GNU C (glibc) 
 GLIBC nhúng 
 uClibc 
 klibc 
 Newlib 
 musl 
 dietlibc 
 libbionic và libhybris

Bổ sung vào POSIX 
Giống như trong các hệ thống tương tự Unix khác, các API bổ sung của nhân Linux không phải là một phần của POSIX:

 hệ thống con cgroups, hệ thống gọi nó là giới thiệu và libcgroup  
 Các cuộc gọi hệ thống của Trình quản lý kết xuất trực tiếp, đặc biệt là các ioctls riêng cho trình điều khiển để gửi lệnh không phải là một phần của thông số kỹ thuật POSIX. 
 Kiến trúc âm thanh Linux nâng cao có thể đặt các cuộc gọi hệ thống, không phải là một phần của thông số kỹ thuật POSIX 
 Hệ thống gọi futex (mutex không gian người dùng nhanh), epoll, splice, dnotify, fanotify và inotify đã được dành riêng cho kernel Linux tư trước đến nay. 
 Cuộc gọi hệ thống getrandom đã được giới thiệu trong phiên bản 3.17 của dòng chính Linux kernel  
 memfd được đề xuất bởi các nhà phát triển kdbus  
 memfd_create đã được hợp nhất vào dòng chính của nhân Linux trong phiên bản kernel 3.17 
 readahead khởi tạo một tập tin "đọc trước" vào bộ đệm trang

DRM là tối quan trọng cho việc phát triển và triển khai các trình điều khiển thiết bị đồ họa nguồn mở và miễn phí được xác định rõ ràng và hiệu năng mà không có khả năng tăng tốc kết xuất nào khả dụng, hoặc thậm chí tệ hơn, chỉ có các trình điều khiển 2D mới có sẵn trong X.Org Máy chủ. DRM được phát triển cho Linux và từ đó cũng đã được chuyển sang các hệ điều hành khác.

Thư viện khác 

 libdrm (dành cho Trình quản lý kết xuất trực tiếp) 
 libnl (Bộ libnl là một tập hợp các thư viện cung cấp API cho các giao diện kernel dựa trên giao thức netlink.) 
 libevdev (cho evdev) 
 libasound (Kiến trúc âm thanh Linux nâng cao) 
...

Linux ABI 

Thuật ngữ Linux ABI dùng để chỉ một ABI không gian người dùng của kernel. Giao diện nhị phân ứng dụng đề cập đến các thư viện được biên dịch, trong mã máy. Bất kỳ ABI như vậy do đó bị ràng buộc với tập lệnh. Xác định ABI hữu ích và giữ ổn định là trách nhiệm của các nhà phát triển nhân Linux hoặc của các nhà phát triển Thư viện GNU C và nhiệm vụ cho các nhà phân phối Linux và nhà cung cấp phần mềm độc lập (ISV) muốn bán và cung cấp hỗ trợ cho họ phần mềm độc quyền dưới dạng nhị phân chỉ dành cho một ABI Linux duy nhất, trái ngược với việc hỗ trợ nhiều ABI Linux.

Một ABI phải được xác định cho mỗi tập lệnh, chẳng hạn như x86, x86-64, MIPS, ARMv7-A (32-Bit), ARMv8-A (64-Bit), vv với endianness, nếu cả hai được hỗ trợ.

Nó có thể biên dịch phần mềm với các trình biên dịch khác nhau theo các định nghĩa được chỉ định trong ABI và đạt được khả năng tương thích nhị phân đầy đủ. Trình biên dịch là phần mềm miễn phí và nguồn mở, vd Bộ sưu tập trình biên dịch GNU, LLVM / Clang.

Trên thực tế, người dùng cuối không phải tất cả đều quan tâm đến API Linux (hoặc API Windows), mà là ABI.

API nội bộ hạt nhân 
Có rất nhiều API bên trong nhân cho tất cả các hệ thống con để có thể giao tiếp với nhau. Chúng đang được giữ khá ổn định, nhưng không có gì đảm bảo cho sự ổn định. Trong trường hợp nghiên cứu mới hoặc thông tin chi tiết làm cho thay đổi có vẻ thuận lợi, API sẽ được thay đổi, tất cả việc viết lại và kiểm tra cần thiết phải được thực hiện bởi tác giả.

Nhân Linux là một hạt nhân nguyên khối, do đó trình điều khiển thiết bị là các thành phần hạt nhân. Để giảm bớt gánh nặng của các công ty duy trì các trình điều khiển thiết bị (độc quyền) ngoài luồng, các API ổn định cho trình điều khiển thiết bị đã được yêu cầu nhiều lần. Các nhà phát triển nhân Linux đã liên tục phủ nhận việc đảm bảo các API trong kernel ổn định cho trình điều khiển thiết bị. Việc đảm bảo như vậy sẽ cản trở sự phát triển của nhân Linux trong quá khứ và trong tương lai và, do bản chất của phần mềm miễn phí và nguồn mở, là không cần thiết. Ergo, theo lựa chọn, hạt nhân Linux không có API nội bộ hạt nhân ổn định.

ABI nội bộ hạt nhân 
Vì không có API nội bộ hạt nhân ổn định, nên không thể có ABI nội bộ hạt nhân ổn định.

API trừu tượng 

Đối với một số trường hợp sử dụng, API Linux được coi là API ở mức độ thấp và các API trừu tượng cao hơn được sử dụng. Tất nhiên như vậy vẫn cần phải hoạt động trên các API Linux cấp thấp. Ví dụ:

 triển khai các thông số kỹ thuật OpenGL và Vulkan trong trình điều khiển đồ họa Linux độc quyền và triển khai nguồn mở và miễn phí trong Mesa 
 triển khai đặc tả OpenAL 
 Lớp DirectMedia đơn giản: API trừu tượng cho đầu vào / âm thanh / vv. có sẵn cho nhiều hệ điều hành 
 Thư viện đa phương tiện đơn giản và nhanh chóng: như trên

Xem thêm 

 Giao diện lập trình Linux của Michael Kerrisk 
 Semaphore (lập trình) 
 cuộc gọi hệ thống   là một chức năng để tạo điều kiện cho các chương trình yêu cầu dịch vụ từ kernel 
 eventfd () 
 [./https://en.wikipedia.org/wiki/Netlink netlink]  họ ổ cắm được sử dụng cho IPC giữa các tiến trình không gian người dùng và nhân, được thiết kế như là sự kế thừa của ioctl; Netlink đã được Alan Cox thêm vào trong quá trình phát triển kernel 1.3 của Linux dưới dạng giao diện trình điều khiển nhân vật để cung cấp nhiều liên kết truyền thông hai chiều và không gian người dùng. Sau đó, Alexey Kuznetsov đã mở rộng nó trong quá trình phát triển nhân Linux 2.1 để cung cấp giao diện nhắn tin linh hoạt và có thể mở rộng cho cơ sở hạ tầng định tuyến tiên tiến mới. Kể từ đó, các ổ cắm Netlink đã trở thành một trong những giao diện chính mà các hệ thống con kernel cung cấp cho các ứng dụng không gian người dùng trong Linux. Trình điều khiển WNIC hiện đại sử dụng nó để giao tiếp với không gian người dùng. 
 API Windows   bài viết về API khác nhau có sẵn trên hệ điều hành Microsoft Windows 
 [./https://en.wikipedia.org/wiki/Windows.h windows.h]  tệp tiêu đề cho ngôn ngữ lập trình C chứa khai báo cho tất cả các chức năng trong API Windows 
 [./https://en.wikipedia.org/wiki/Wine_(software) Wine]  một lớp tương thích giữa Linux và các chương trình được viết cho Microsoft Windows 
 libhybris - lớp tương thích giữa Linux và các chương trình được viết cho Android

Tham khảo

Liên kết ngoài 

 API Linux Kernel 5.0, API quản lý bộ nhớ 5.0 (định dạng nhân sư mới) 
 API của Linux kernel 2.6.20 và 4.12 (ở định dạng htmldocs không dùng nữa) 
 Đánh giá thay đổi API / ABI cho Linux 
 Sách Giao diện lập trình Linux, Linux và API glibc thay đổi kể từ khi Giao diện lập trình Linux được phát hành năm 2010 
 Bản đồ nhân Linux tương tác với các cấu trúc và chức năng API chính, phiên bản PDF 
 Trình điều khiển thiết bị Linux của Jonathan Corbet, Greg Kroah-Hartman và Alessandro Rubini, ấn bản thứ 3 
 Danh sách liên kết hạt nhân Linux đã giải thích 

Linux kernel