Hiểu quản lý quy trình Linux [đã đóng]


0

Tôi cố gắng tìm hiểu các phần bên trong nhân Linux, quản lý quy trình và chuyển đổi ngữ cảnh xung quanh các quy trình. Theo như tôi hiểu các hướng dẫn (từ cộng đồng này, IBM, v.v.) thì kernel được nạp bởi bộ tải khởi động sau khi nhấn nút nguồn. Sau đó, nó khởi động bộ lập lịch và tạo quy trình init cuối cùng chịu trách nhiệm bắt đầu tất cả các quy trình khác.

Vì vậy, sau một thời gian, một chuyển đổi bối cảnh xảy ra. Trong quá trình chuyển đổi ngữ cảnh này, kernel nhìn vào bảng trang cho quy trình mới và tải nó (nếu cần) vào TLB của MMU. Hạt nhân có tải toàn bộ bảng trang (vì vậy cho 4 GB bộ nhớ ảo trên hệ thống 32 bit) vào MMU không? Và làm thế nào để hoán đổi bảng này hoạt động, bởi vì theo tôi hiểu, 1 GB bộ nhớ hàng đầu sẽ có mặt và không bị tráo đổi trong tất cả các quy trình, bởi vì đây là bộ nhớ kernel? Các bảng trang cho tất cả các quy trình có chứa ánh xạ trực tiếp cho 1 GB bộ nhớ hàng đầu, để 1 GB bộ nhớ ảo hàng đầu được ánh xạ trực tiếp vào 1 GB bộ nhớ vật lý hàng đầu không?

Có một số loại tài liệu về cách chuyển đổi ngữ cảnh này hoạt động bởi vì tôi không tìm thấy bất kỳ tài liệu nào giải thích điều này cho những người mới như tôi.


Ban đầu, hoặc nói PID = 1, vâng, được khởi động bởi kernel, nhưng không phải tất cả quá trình đều được rẽ nhánh từ nó. Ví dụ. Shell chạy trong xfce4-terminal được rẽ nhánh trực tiếp từ xfce4-terminal, không phải init. Sau một thời gian, fork () trở lại không gian người dùng, bây giờ bảng trang liên quan đến quy trình mới đã được xây dựng. Bảng trang nằm trong bộ nhớ, điều này được xác định bởi CPU không phải kernel. Đọc quản lý bộ nhớ x86 trên sách giáo khoa, đừng chỉ tưởng tượng nó. Hạt nhân được tải vào bộ nhớ vật lý, nhưng địa chỉ phụ thuộc, sau đó nó được ánh xạ vào không gian bộ nhớ ảo của các tiến trình.
薯条

Câu trả lời:


2

Mỗi quy trình có một bộ trang trang riêng, trải rộng 3 GB thấp trên các máy x86 32 bit. 1 GB hàng đầu trên các máy 32 bit là phổ biến cho tất cả các quy trình và không thể truy cập được từ không gian người dùng. 1 GB hàng đầu được dành riêng cho kernel và ban đầu chứa bản đồ của toàn bộ RAM vật lý bù 3 GB. Điều này có nghĩa là địa chỉ bộ nhớ vật lý 0 hiển thị tại địa chỉ ảo 0xc0000000, địa chỉ bộ nhớ vật lý 1 hiển thị tại địa chỉ 0xc0000001, v.v. Khi kích thước bộ nhớ vượt quá giới hạn 1 GB, bộ nhớ vật lý dư thừa bắt đầu được truy cập thông qua cửa sổ "highmem".

Trên x86-64, nửa trên của không gian địa chỉ được dành riêng cho kernel, nửa dưới cho không gian người dùng. Lưu ý rằng phần cứng hiện tại không cho phép sử dụng toàn bộ không gian địa chỉ 64 bit: thông thường chỉ có 48 bit địa chỉ có thể sử dụng được, 16 bit trên phải là tất cả các số 0 hoặc tất cả các số. (Số bit chính xác có thể sử dụng thay đổi tùy theo kiểu CPU.)

Tại một chuyển đổi ngữ cảnh, phần không gian người dùng của ánh xạ được thay thế bằng ánh xạ của quy trình mới, nhưng phần nhân vẫn giữ nguyên. Toàn bộ không gian bộ nhớ 4 GB không được ánh xạ, chỉ có các phần thực sự được sử dụng. Điều này cho phép một cây bảng trang nhỏ hơn nhiều. Ánh xạ ban đầu được xác định bởi tệp ELF chứa chương trình sẽ được chạy. Các bảng trang được sửa đổi khi cần thiết khi bộ nhớ mới được phân bổ động, ánh xạ bằng cách sử dụng mmaphoặc tự động mở rộng ngăn xếp.

Bộ lập lịch không được "bắt đầu", vì nó không phải là một quy trình riêng biệt. Hạt nhân sắp xếp lại các tiến trình khi quá trình đang chạy cần đợi đầu vào hoặc một số sự kiện khác hoặc khi quá trình hiện tại đã sử dụng hết lát cắt thời gian của nó. Mỗi quá trình là ở một trong một số trạng thái, như chờ đợi một sự kiện nào đó, sẵn sàng để chạy hoặc chạy. Khi kernel thực hiện sắp xếp lại, nó sẽ kiểm tra danh sách các tiến trình sẵn sàng để chạy và chọn một (mỗi CPU) để chạy tiếp theo.

Ngoài ra, Bộ đệm dịch thuật tìm kiếm (TLB) không được tải trực tiếp bởi kernel (trên bộ xử lý x86). Phần mềm chỉ sửa đổi các bảng trang và phần cứng sẽ tự động điền vào các mục trong TLB khi cần trong thời gian chạy. TLB có thể được xóa bằng phần mềm; điều này cần phải được thực hiện tại một chuyển đổi bối cảnh.

Một vài cuốn sách đã được viết trên phần bên trong nhân Linux ("Tìm hiểu về nhân Linux"), nhưng hầu hết chúng đều khá cũ. Nhưng, ngay cả khi chúng không còn là tài liệu tham khảo tốt nữa, nhiều người trong số họ cung cấp thông tin có liên quan, nhưng bạn phải nhớ rằng rất nhiều thứ đã thay đổi.

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.