Linux và các khái niệm cơ bản Tổng quan khóa huấn luyện và đào tạo trình làng hệ quản lý điều hành Linux System call C Library cùng C Compiler cách xử lý lỗi hotline System điện thoại tư vấn hoặc hàm tủ sách tệp tin Input/Output trình làng về tệp tin I/O thao tác file vào Linux file I/O Buffering con trỏ file I/O Multiplexing - select() I/O Multiplex - poll() quản lý tiến trình khái quát về quy trình thao tác làm việc với các bước làm chủ tiến trình nhỏ Process Scheduling Thread vào Linux Thread cùng Posix Thread làm chủ Posix thread Thread Synchronization-Mutex Thread Synchronization-Biến điều kiện Thread Cancellation cai quản lý bộ nhớ lưu trữ bộ nhớ lưu trữ ảo (Virtual Memory) cấp phát bộ nhớ Memory Mapping Memory Mapping (continue)
Previous lesson Next lesson

Le Minh
showroom to channel Follow

System Call


Trong phong cách thiết kế Linux, không khí bộnhớ được tạo thành hai phần là user space với kernel space. Theo đó, cũng sẽ có hai chế độ (mode) là user mode cùng kernel mode. Những chỉlệnh được điện thoại tư vấn từ chương trìnhnhư đóng góp mở tệp tin (fopen, fclose), hoặc in một thông tin (printf) chỉ hoàn toàn có thể thực thi và truy cập vùng nhớở tầng usermà ko được truy cập vùng lưu giữ của kernel.

Bạn đang xem: System call là gì

Cơ chế phân tách user space vớikernel space và không cho phép người dùngtự ý truy vấn tài nguyên của kernel giúp cai quản và đảm bảo kernel cũng như tổng thể hệ thống. Thiệt vậy, khi bạn truy cập vùng nhớ phi pháp trên user space thì chỉ ứng dụng của chúng ta crash, còn khi bạn truy cập bất hợp pháp vùng nhớcủa kernel thì toàn bộ thiết bị của các bạn sẽ bị crash.

Vấn đề đưa ra là làm bí quyết nào nhằm user call xuốngkernel haythao tácđiều khiểncác device driver?Để thỏa mãn nhu cầu yêu mong này, kernel cung ứng cho user space những API (còn call làcácdịch vụ) là system call.

System call là một trong những cửa ngõ vào kernel, cho phép tiến trình trên tầng user yêu mong kernel triển khai một vài tác vụ cho mình. Những dịch vụ thương mại này rất có thể là chế tạo ra một tiến trình mới (fork), xúc tiến I/O (read, write), hoặc tạo thành một pipe cho giao tiếp liên các bước (IPC).

Có một số điều cần để ý về system hotline như sau:

Khi một các bước gọi một system call, CPU sẽ đưa từ chính sách user mode thanh lịch kernel mode, điều này cho phép CPU truy cập các vùng nhớ và tiến hành các chỉ lệnh của kernel.

Mỗi system điện thoại tư vấn được kernelđịnh danh bằng một số trong những duy nhất. Tiến trình trên tầng user ngần ngừ đến các số này, nỗ lực vào đó, nó gọimột system call bằng tên hàm(ví dụ như open(), read()...).

Mỗi system call hoàn toàn có thể có một số tham số truyền để cung cấp tin từ user truyền xuống kernel và ngược lại.

Quá trình thực thisystem call

Đứng trên ánh mắt của xây dựng viên, bài toán gọi một system điện thoại tư vấn trông có vẻ như như là chỉ hotline một hàm C bình thường. Mặc dù nhiên, ẩn dưới việcđó là không ít bước được thực hiệntừ user space xuống kernel space.

Cụ thể, bọn họ thử xét việc gọi một hàm thư viện được sử dụng rất thường xuyên sau đây:

Hàm gọi:

#includeFILE *fopen(const char *filename, const char *mode)Hàm fopen()là một hàm thư viện (wrapper function) được dùng để làm thực thi vấn đề chuyển xuống kernel mode và yêu cầu kernel mở một file dưới kernel có đường dẫn là “filename” với chế độ"mode", cụ thể về hàm nàycác các bạn xem trên đây. Hàm fopen() được triển khai bằng phương pháp gọi system điện thoại tư vấn open(), vắt thể các bước như sau:

Hàm wrapper copy những đối số ( vào trường hòa hợp này là "filename" và "mode") vào các thanh ghi, nơi mà các lệnh của luồng tiến hành system gọi sẽ gọi và sử dụng được.

Hàm wrapper xào nấu số system call vào một trong những thanh ghi của CPU (%eax). Lấy ví dụ như system gọi number củaopen() là 5, hàm này sẽ coppy giá trị 5 vào thanh ghi %eax.

Hàm wrapper triển khai một chỉ lệnh máy call là trap machine instruction nhằm chuyển chính sách CPU từ user mode lịch sự kernel mode. Chỉ lệnh này có thể là một ngắt mềm (software interrupt) cùng với số ngắt (interrupt number) là 0x80 (int 0x80) hoặc chỉ lệnh SYSENTER (trong các kiến trúc Intel ngay gần đây) hoặc chỉ lệnh SYSCALL (trong AMD)

Kernel call đến luồng system_call (nằm trong tệp tin arch/x86/entry_32.S), tại đây nó đang làm những công việc: copy giá bán trị những đối số trong số thanh ghi mà lại đã copy vàotrong cách 1 vào kernel stack; soát sổ tính hợp lệ của những đối số; điện thoại tư vấn đến system call service routine ưng ý hợp bằng phương pháp tra cứu vớt số system call được sao chép ở cách 2 trong bảng system call routine (sys_call_table); gửi công dụng trả về lên mang lại hàm wrapper và ở đầu cuối là chuyển chế độ của CPU từ kernel mode sang trọng user mode.

Hàm wrapper trả về quý giá là một trong những nguyên mang đến hàm hotline nó để thông tin lời hotline system gọi có thành công không. Ví như system call trả về quý giá lỗi, hàm wrapper đang set giá bán trị cho 1 biến toàn bộ “errno” từ quý hiếm lỗi này.

Lưu ý rằng công việc trên chỉ ra mắt tinh thần phổ biến của việc mừng đón xử lý một system call, các kiến trúc không giống nhau sẽ có các cách triển khai niềm tin chung đó khác biệt ít nhiều.

Để làm rõ hơn về bức tranh tổng thể và toàn diện của system call, họ sẽ đi vào cụ thể cách system call open(). Trong Linux x86_32, open() gồm số system hotline là 5, bởi vậy trong system call vector (arch/x86/entry/syscall/syscall_32.tbl), mở cửa system gọi sẽ là entry đồ vật 5, khớp ứng với system hotline routine là sys_open.

Xem thêm: Phần Mềm Iobit Malware Fighter Là Gì, Download Iobit Malware Fighter

*

Từ đây, kernel sẽ call đến hàm sys_open() trong /fs/open.c để tiến hành việc mở một file trong hệ thông file system cùng trả về một trình bày file fd mang đến user. Cầm thể, bọn họ xem hình vẽchi ngày tiết như hình bên dưới đây:

*

Kết luận

System call là 1 trong cơ chế quan trọng mà ngẫu nhiên lập trình viênLinux nào cũng phải ráng được. Thực hiện system call để yêu thương cầu thương mại & dịch vụ hoặc khoáng sản của kernelkhông hầu như giúp đảm bảo được hệ thống mà còn hỗ trợ cho quá trình lập trình viên trở nên dễ ợt hơn. Theo đó, bạn chỉ việc sử dụng các API thân thiết với người tiêu dùng hơn là phải quan tâm đến các thanh ghi và luồng của hệ thống.Bạn cũng cần xem xét rằng các kiến trúc CPU khác nhau thì cách xúc tiến xử lý system điện thoại tư vấn cũng có thể khác nhau. Vày vậy, bạn cũng ko cần cố gắng chọc ngoáysâu xuống code của kernel về vấn đề xử lý system call (trừ khi chúng ta cần sản xuất một system điện thoại tư vấn của riêng biệt mình), mà chỉ việc dùng các hàm wrapper của thư viện C là đủ.