ngăn xếp hạt nhân và ngăn xếp không gian người dùng


110

Sự khác biệt giữa ngăn xếp nhân và ngăn xếp người dùng là gì? Tại sao kernel stack được sử dụng? Nếu một biến cục bộ được khai báo trong ISR, nó sẽ được lưu trữ ở đâu? Mỗi tiến trình có ngăn xếp hạt nhân riêng của nó không? Sau đó, làm thế nào quá trình điều phối giữa cả hai ngăn xếp này?

Câu trả lời:


187
  1. Sự khác biệt giữa ngăn xếp nhân và ngăn xếp người dùng là gì?

Nói tóm lại, không có gì - ngoài việc sử dụng một vị trí khác trong bộ nhớ (và do đó một giá trị khác cho thanh ghi stackpointer), và thường là các biện pháp bảo vệ truy cập bộ nhớ khác nhau. Tức là khi thực thi ở chế độ người dùng, bộ nhớ hạt nhân (một phần trong đó là ngăn xếp hạt nhân) sẽ không thể truy cập được ngay cả khi được ánh xạ. Ngược lại, nếu không được mã nhân yêu cầu rõ ràng (trong Linux, thông qua các chức năng như copy_from_user()), bộ nhớ người dùng (bao gồm ngăn xếp người dùng) thường không thể truy cập trực tiếp.

  1. Tại sao ngăn xếp hạt nhân [một riêng biệt] được sử dụng?

Tách biệt các đặc quyền và bảo mật. Đối với một, các chương trình không gian người dùng có thể làm cho ngăn xếp (con trỏ) của họ bất cứ thứ gì họ muốn và thường không có yêu cầu kiến ​​trúc để có một ngăn xếp hợp lệ. Do đó, hạt nhân không thể tin rằng trình xếp chồng không gian người dùng là hợp lệ cũng như có thể sử dụng được, và do đó sẽ yêu cầu một tập hợp dưới sự kiểm soát của chính nó. Các kiến ​​trúc CPU khác nhau thực hiện điều này theo những cách khác nhau; CPU x86 tự động chuyển đổi các điểm xếp chồng khi xảy ra chuyển đổi chế độ đặc quyền và các giá trị được sử dụng cho các mức đặc quyền khác nhau có thể cấu hình được - bằng mã đặc quyền (tức là chỉ hạt nhân).

  1. Nếu một biến cục bộ được khai báo trong ISR, nó sẽ được lưu trữ ở đâu?

Trên ngăn xếp hạt nhân. Hạt nhân (nghĩa là hạt nhân Linux) không kết nối trực tiếp các ISR với các cổng ngắt của kiến ​​trúc x86 mà thay vào đó, ủy quyền điều phối ngắt cho một cơ chế vào / ra ngắt hạt nhân chung để lưu trạng thái thanh ghi trước ngắt trước khi gọi (các) trình xử lý đã đăng ký . Bản thân CPU khi điều phối một ngắt có thể thực thi một chuyển đổi đặc quyền và / hoặc ngăn xếp, và điều này được sử dụng / thiết lập bởi hạt nhân để mã nhập ngắt chung có thể đã dựa trên một ngăn xếp hạt nhân đang hiện diện.
Điều đó nói rằng, các ngắt xảy ra trong khi thực thi mã hạt nhân sẽ đơn giản (tiếp tục) sử dụng ngăn xếp hạt nhân tại chỗ tại thời điểm đó. Điều này có thể, nếu trình xử lý ngắt có đường dẫn cuộc gọi lồng nhau sâu, dẫn đến tràn ngăn xếp (nếu đường dẫn lệnh gọi hạt nhân sâu bị gián đoạn và trình xử lý gây ra một đường dẫn sâu khác; trong Linux, mã RAID của hệ thống tệp / phần mềm bị gián đoạn bởi mã mạng có iptables đang hoạt động là được biết là có thể kích hoạt như vậy trong các hạt nhân cũ chưa được điều chỉnh ... giải pháp là tăng kích thước ngăn xếp hạt nhân cho các khối lượng công việc như vậy).

  1. Mỗi tiến trình có ngăn xếp hạt nhân riêng không?

Không chỉ mỗi quy trình - mỗi luồng có ngăn xếp nhân riêng của nó (và trên thực tế, ngăn xếp người dùng của chính nó cũng vậy). Hãy nhớ sự khác biệt duy nhất giữa quy trình và luồng (đối với Linux) là thực tế là nhiều luồng có thể chia sẻ một không gian địa chỉ (tạo thành một quy trình).

  1. Quá trình phối hợp giữa cả hai ngăn xếp này như thế nào?

Không hề - nó không cần thiết. Lập lịch (cách thức / khi các luồng khác nhau đang được chạy, cách trạng thái của chúng được lưu và khôi phục) là nhiệm vụ của hệ điều hành và các tiến trình không cần phải quan tâm đến điều này. Khi các luồng được tạo (và mỗi tiến trình phải có ít nhất một luồng), hạt nhân sẽ tạo các ngăn xếp nhân cho chúng, trong khi ngăn xếp không gian người dùng được tạo / cung cấp rõ ràng bởi bất kỳ cơ chế nào được sử dụng để tạo luồng (các chức năng như makecontext()hoặc pthread_create()cho phép người gọi chỉ định vùng bộ nhớ được sử dụng cho ngăn xếp của luồng "con") hoặc được kế thừa (bằng cách sao chép bộ nhớ khi truy cập, thường được gọi là "sao chép khi ghi" / COW, khi tạo một quy trình mới).
Mà nói,(trạng thái, trong số đó là điểm xếp chồng của luồng). Có nhiều cách cho việc này: tín hiệu UNIX setcontext(), pthread_yield()/ pthread_cancel(), ... - nhưng điều này đang vi phạm một chút so với câu hỏi ban đầu.


Câu trả lời xuất sắc FrankH. Cảm ơn.
kumar

1
@FrankH Câu trả lời tuyệt vời .. nhưng tôi có câu hỏi nhỏ liên quan đến nó, nhưng trong kiến ​​trúc ARM .. Ngăn xếp hạt nhân này có liên quan như thế nào với chế độ bộ xử lý khác nhau?
Rahul

2
@Rahul: "lề của một bình luận SO quá nhỏ để chứa một câu trả lời như vậy". Cách hoạt động của các thanh ghi ngăn xếp / điểm xếp chồng trong các chế độ CPU ARM khác nhau (chế độ nào triển khai SP có mã nguồn) là một câu hỏi hay, nhưng cần nhiều không gian để trả lời hơn là một nhận xét có thể đưa ra. Điều tương tự cũng áp dụng cho những thứ như cổng tác vụ x86 hoặc IST - không có cái gọi là con trỏ ngăn xếp hạt nhân "duy nhất" (cũng như không có con trỏ ngăn xếp người dùng "duy nhất") và hỗ trợ / ủy quyền phần cứng dành cho con trỏ ngăn xếp riêng biệt trong các chế độ hoạt động khác nhau ... rất phụ thuộc vào phần cứng.
FrankH.

@FrankH. Tôi đã tạo câu hỏi mới cho cùng một câu hỏi ... stackoverflow.com/q/22601165/769260 Tôi hy vọng bây giờ bạn có thể giúp tôi mà không cần quan tâm đến dung lượng :)
Rahul

1
@FrankH. Bạn có thể cung cấp một sơ đồ cho thấy ngăn xếp hạt nhân thuộc về nơi bố trí bộ nhớ của một tiến trình không?
Jithin Pavithran 27/09/18

19

Câu trả lời của tôi được thu thập từ các câu hỏi SO khác với nội dung của tôi.

What's the difference between kernel stack and user stack?

Là một lập trình viên hạt nhân, bạn biết rằng hạt nhân phải bị hạn chế khỏi các chương trình người dùng có lỗi. Giả sử bạn giữ cùng một ngăn xếp cho cả nhân và không gian người dùng, thì segfault đơn giản trong ứng dụng người dùng sẽ làm hỏng nhân và cần khởi động lại.

Có một "ngăn xếp hạt nhân" trên mỗi CPU như ISR Stack và một "ngăn xếp hạt nhân" trên mỗi Quy trình. Có một "ngăn xếp người dùng" cho mỗi quy trình, mặc dù mỗi luồng có ngăn xếp riêng, bao gồm cả luồng người dùng và nhân.

http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-10/3194.html

Why kernel stack is used?

Vì vậy, khi chúng ta ở chế độ hạt nhân, loại cơ chế ngăn xếp là cần thiết để xử lý các lệnh gọi hàm, các biến cục bộ tương tự như không gian người dùng.

http://www.kernel.org/doc/Documentation/x86/kernel-stacks

If a local variable is declared in an ISR, where it will be stored?

Nó sẽ được lưu trữ trong ngăn xếp ISR (IRQSTACKSIZE). ISR chỉ chạy trên một ngăn xếp ngắt riêng biệt nếu phần cứng hỗ trợ nó. Nếu không, các khung ngăn xếp ISR được đẩy lên ngăn xếp của luồng bị gián đoạn.

Không gian người dùng không biết và nói thẳng ra là không quan tâm đến việc ngắt được phục vụ trong ngăn xếp nhân của quy trình hiện tại hay ngăn xếp ISR riêng biệt. Vì ngắt đến trên mỗi cpu, do đó ngăn xếp ISR phải trên mỗi cpu.

 Does each process has its own kernel stack ?

Đúng. Mỗi tiến trình có ngăn xếp hạt nhân riêng của nó.

 Then how the process coordinates between both these stacks?

Câu trả lời của @ FrankH có vẻ tuyệt vời đối với tôi.


4
  1. Sự khác biệt giữa ngăn xếp nhân và ngăn xếp người dùng là gì

Tham khảo từ Phát triển nhân Linux của Robert Love, sự khác biệt chính là kích thước:

Không gian người dùng có thể thoát khỏi việc phân bổ tĩnh nhiều biến trên ngăn xếp, bao gồm các cấu trúc khổng lồ và mảng nghìn phần tử.
Hành vi này là hợp pháp vì không gian người dùng có một ngăn xếp lớn có thể phát triển động.
Ngăn xếp hạt nhân không lớn và không động; nó có kích thước nhỏ và cố định.
Kích thước chính xác của ngăn xếp hạt nhân thay đổi theo kiến ​​trúc.
Trên x86, kích thước ngăn xếp có thể định cấu hình tại thời điểm biên dịch và có thể là 4KB hoặc 8KB.
Về mặt lịch sử, ngăn xếp hạt nhân là hai trang, thường ngụ ý rằng nó là 8KB trên kiến ​​trúc 32 bit và 16KB trên kiến ​​trúc 64 bit — kích thước này là cố định và tuyệt đối.
Mỗi tiến trình nhận được ngăn xếp của riêng nó.

Ngoài ra, ngăn xếp hạt nhân còn chứa một con trỏ tới cấu trúc thread_info chứa thông tin về luồng.

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.