# Không gian người dùng

Một hệ điều hành máy tính hiện đại thường tách biệt bộ nhớ ảo thành **kernel space** và **user space**. Chủ yếu, sự tách biệt này nhằm cung cấp bảo vệ bộ nhớ và phần cứng khỏi các hành vi phần mềm độc hại hoặc sai lầm.

được dành riêng để chạy kernel hệ điều hành đặc quyền, phần mở rộng kernel và hầu hết các trình điều khiển thiết bị. Ngược lại, user space là vùng nhớ nơi phần mềm ứng dụng và một số trình điều khiển thực thi.

## Tổng quan

Thuật ngữ **userland** (hay **user space** hoặc **không gian người dùng**)đề cập đến tất cả các mã chạy bên ngoài kernel của hệ điều hành. Userland thường đề cập đến các chương trình và thư viện khác nhau mà hệ điều hành sử dụng để tương tác với kernel: phần mềm thực hiện đầu vào/đầu ra, thao tác với các đối tượng hệ thống file, phần mềm ứng dụng, v.v.

Mỗi tiến trình user space thường chạy trong không gian bộ nhớ ảo của riêng mình và, trừ khi được cho phép rõ ràng, không thể truy cập vào bộ nhớ của các tiến trình khác. Đây là cơ sở để bảo vệ bộ nhớ trong các hệ điều hành chính hiện nay và một block được xây dựng để phân tách đặc quyền. Một chế độ người dùng riêng biệt cũng có thể được sử dụng để xây dựng các máy ảo hiệu quả - xem các yêu cầu ảo hóa Popek và Goldberg. Với đủ đặc quyền, các quy trình có thể yêu cầu kernel ánh xạ một phần không gian bộ nhớ của quy trình khác sang chính nó, như trường hợp của trình gỡ lỗi. Các chương trình cũng có thể yêu cầu các vùng bộ nhớ dùng chung với các quy trình khác, mặc dù các kỹ thuật khác cũng có sẵn để cho phép giao tiếp giữa các tiến trình.

Các lớp khác nhau trong Linux, cũng như sự tách biệt giữa userland và kernel space| User mode | **Ứng dụng người dùng** | Ví dụ, bash, LibreOffice, GIMP, Blender, 0 A.D., Mozilla Firefox, v.v. |
| **Các thành phần hệ thống** | **Các daemons hệ thống**: *systemd, runit, logind, networkd, PulseAudio, ...* | **Hệ thống cửa sổ**: *X11, Wayland, SurfaceFlinger (Android)* | **Đồ hoạ**: *Mesa*, *AMD Catalyst*, ... | **Thư viện khác:GTK+, Qt, EFL, SDL, SFML, FLTK, GNUstep*, v.v. |
| **Thư viện chuẩn C** | `open()`, `exec()`, `sbrk()`, `socket()`, `fopen()`, `calloc()`, ... (lên đến 2000 chương trình con) *glibc* nhắm tới tốc độ, *musl* và *uClibc* nhắm đến hệ thống nhúng, *bionic* được viết cho Android, v.v. Tất cả đều hướng đến việc tương thích với POSIX/SUS. |
| Kernel mode | **Nhân Linux** | `stat`, `splice`, `dup`, `read`, `open`, `ioctl`, `write`, `mmap`, `close`, `exit`, v.v. (có khoảng 380 lời gọi hệ thống) Nhân Linux System Call Interface (SCI, nhắm đến việc tương thích với POSIX/SUS) |
| Hệ thống con Lập lịch cho các tiến trình | Hệ thống con Giao tiếp giữa các tiến trình | Hệ thống con Quản lý bộ nhớ | Hệ thống con Hệ thống file ảo | Hệ thống con Mạng |
| Các thành phần khác: ALSA, DRI, evdev, LVM, device mapper, Linux Network Scheduler, Netfilter Các môdun bảo mật: *SELinux*, *TOMOYO*, *AppArmor*, *Smack* |
| Phần cứng (CPU, bộ nhớ chính, thiết bị lưu trữ dữ liệu, v.v) |

## Thể hiện

Cách phổ biến nhất để thực hiện chế độ người dùng tách biệt với chế độ kernel liên quan đến các vòng bảo vệ hệ điều hành.

Một cách tiếp cận khác được thực hiện trong các hệ điều hành thử nghiệm là có một không gian địa chỉ duy nhất cho tất cả phần mềm và dựa vào ngữ nghĩa của ngôn ngữ lập trình để đảm bảo rằng bộ nhớ tùy ý không thể được truy cập – các ứng dụng đơn giản không thể có được bất kỳ tham chiếu nào đến các đối tượng mà chúng không được phép truy cập. Cách tiếp cận này đã được triển khai trong JXOS, Unununium cũng như dự án nghiên cứu Singularity của Microsoft.

## Xem thêm

* BIOS

## Ghi chú

## Chú thích

## Liên kết ngoài

* Linux Kernel Space Definition
* Entering User Mode tại Wayback Machine (lưu trữ ngày 26 tháng 3 năm 2016)