Ngăn xếp hạt nhân cho tất cả quá trình được chia sẻ hoặc có một ngăn xếp hạt nhân riêng biệt cho mỗi quy trình? Nếu nó là riêng biệt cho mỗi quá trình mà là con trỏ ngăn xếp này được lưu trữ? Trong task_struct?ngăn xếp hạt nhân cho quá trình linux
Trả lời
Chỉ có một bộ nhớ hạt nhân phổ biến. Trong mỗi quá trình có một task_struct + kernel stack riêng (theo mặc định là 8K).
Trong bối cảnh chuyển đổi con trỏ ngăn xếp cũ được lưu ở đâu đó và con trỏ ngăn xếp thực tế được thực hiện để trỏ lên đầu ngăn xếp (hoặc dưới tùy thuộc vào kiến trúc phần cứng) của quy trình mới sắp chạy.
This old article cho biết mỗi quy trình đều có ngăn xếp hạt nhân riêng. Xem nhận xét về lý do tại sao đó có vẻ là một thiết kế rất tốt.
Tôi đã thử reading the current source để đảm bảo, nhưng vì ngăn xếp hạt nhân "ẩn" nên không hiển thị trong task_struct
. Điều này được đề cập trong bài viết.
Câu trả lời này đã được chỉnh sửa để kết hợp trí tuệ từ nhận xét. Cảm ơn.
Tôi nghiêm túc nghi ngờ rằng điều này có thể thay đổi. Ngăn xếp hạt nhân là một không gian không chia sẻ nơi các cuộc gọi hệ thống có thể đặt dữ liệu của họ. Nếu bạn muốn chia sẻ chúng giữa các quá trình, một số thói quen hạt nhân có thể sử dụng cùng một ngăn xếp cùng một lúc -> dữ liệu tham nhũng. –
Tôi sẽ nghĩ rằng mỗi quá trình cần ngăn xếp hạt nhân riêng của mình, bởi vì một số quy trình khác nhau có thể thực hiện các cuộc gọi hệ thống đồng thời và bạn sẽ không muốn chúng bị lẫn lộn. –
Mỗi tiến trình có ngăn xếp hạt nhân riêng và mỗi ngăn xếp hạt nhân có quá trình liên kết của nó. Nó chưa bao giờ được thay đổi. Đó là lý do tại sao có một số quá trình giả giống như trong "ps". –
Cuốn sách "Phát triển hạt nhân Linux" của Robert Love có một giải thích tốt về ngăn xếp hạt nhân quá trình.
Và có, mỗi quy trình có ngăn xếp hạt nhân riêng và nếu tôi không sai thì con trỏ của nó được lưu trữ trên cấu trúc thread_info. Nhưng tôi không thực sự chắc chắn về nó, và struct task_struct được lưu trữ trên đầu hoặc cuối của quá trình hạt nhân ngăn xếp, tùy thuộc vào kiến trúc CPU.
Chúc mừng. Carlos Maiolino
Từ hạt nhân Linux 2.6 trở đi, cấu trúc 'thread_info' được lưu trữ ở cuối ngăn xếp hạt nhân của mỗi tiến trình và không phải là cấu trúc task_struct. Cấu trúc 'thread_info' chứa con trỏ tới cấu trúc' task_struct' –
Tôi nghĩ mỗi quy trình đều có ngăn xếp chế độ hạt nhân riêng. Trình điều khiển được thực hiện trong chế độ hạt nhân, quá trình đôi khi sẽ bị chặn trong khi thực hiện thường trình trình điều khiển. và hệ điều hành có thể lên lịch trình khác để chạy. Quá trình được lên lịch có thể gọi lại trình điều khiển. Nếu ngăn xếp hạt nhân được chia sẻ, 2 quy trình đang sử dụng ngăn xếp hạt nhân, mọi thứ sẽ được trộn lẫn. Tôi bối rối bởi câu hỏi này trong một thời gian dài. Lúc đầu, tôi nghĩ rằng hạt nhân ngăn xếp được chia sẻ, một số sách nói rằng. Sau khi tôi đọc phát triển hạt nhân Linux, và thấy một số mã trình điều khiển, tôi bắt đầu nghĩ rằng ngăn xếp hạt nhân không được chia sẻ.
con trỏ ngăn xếp này được lưu trữ ở đâu? – suresh
Trong bối cảnh chuyển đổi giá trị con trỏ ngăn xếp cũ được lưu trữ trong task_struct của quá trình đang được thay thế bằng một quy trình mới và con trỏ ngăn xếp cho quy trình mới được đọc từ task_struct của quy trình mới này. –