Để cung cấp cho bạn ngữ cảnh đầy đủ, cuộc thảo luận của tôi bắt đầu với quan sát rằng tôi đang chạy một SMP linux (3.0.1-rt11) trên vỏ ARM A8 dựa trên SoC mà là một uniprocessor. Tôi đã tò mò muốn biết nếu có bất kỳ lợi thế hiệu suất nào bằng cách vô hiệu hóa hỗ trợ SMP. Và nếu có những gì tác động nó sẽ có trên trình điều khiển của tôi và xử lý ngắt.Hiểu liên kết giữa CONFIG_SMP, Spinlocks và CONFIG_PREEMPT trong hạt nhân Linux mới nhất (3.0.0 trở lên)
Tôi đã thực hiện một số việc đọc và tìm hiểu hai chủ đề liên quan: khóa spinlocks và phần thưởng hạt nhân. Tôi đã ít googling và đọc nhưng lần này tất cả tôi đã nhận được vài câu trả lời cũ và mâu thuẫn. Vì vậy, tôi nghĩ hãy để tôi thử stackoverflow.
Xuất xứ của những nghi ngờ của tôi/câu hỏi là para này từ trình điều khiển thiết bị Linux 3rd edition chương 5:
spinlocks được, bởi bản chất của họ, mục đích để sử dụng trên đa hệ thống, mặc dù một máy trạm uniprocessor chạy một preemptive hạt nhân hoạt động như SMP, khi có liên quan đến đồng thời. Nếu hệ thống uniprocessor không được kiểm soát bao giờ đi vào vòng quay trên một khóa, nó sẽ quay mãi mãi; không có chủ đề nào khác có thể có được CPU để giải phóng khóa. Vì lý do này, các hoạt động spinlock trên các hệ thống uniprocessor không được kích hoạt tính năng ưu tiên được tối ưu hóa để làm không có gì, ngoại trừ những thay đổi về mặt nạ IRQ . Do việc sử dụng, ngay cả khi bạn không bao giờ mong đợi mã của mình là chạy trên hệ thống SMP, bạn vẫn cần triển khai khóa thích hợp.
nghi ngờ của tôi/câu hỏi là:
a) là Linux kernel ưu tiên trong vũ trụ hạt nhân theo mặc định? Nếu có, tiền thưởng này có giới hạn cho các quy trình duy nhất hay trình xử lý ngắt cũng có thể được ưu tiên không?
b) Hạt nhân Linux (trên ARM) có hỗ trợ ngắt lồng nhau không? Nếu có, thì mỗi trình xử lý ngắt (nửa trên) có ngăn xếp riêng hoặc chúng có cùng một ngăn xếp chế độ hạt nhân 4k/8k không?
c) Nếu tôi tắt SMP (Config_SMP) và tiền thưởng (Config_preempt) sẽ quay vòng trong trình điều khiển của tôi và trình xử lý ngắt có ý nghĩa gì không?
d) Làm thế nào xử lý hạt nhân ngắt tăng lên trong khi thực hiện nửa đầu tức là chúng sẽ bị vô hiệu hóa hoặc bị che khuất?
Sau khi một số googling Tôi thấy điều này:
Đối với hạt nhân biên soạn mà không CONFIG_SMP, và không có CONFIG_PREEMPT spinlocks không tồn tại. Đây là một quyết định thiết kế tuyệt vời: khi không ai khác có thể chạy cùng một lúc, không có lý do gì để có một khóa.
Nếu kernel được biên dịch mà không CONFIG_SMP, nhưng CONFIG_PREEMPT là bộ, sau đó spinlocks chỉ đơn giản là vô hiệu hóa đòn phủ đầu, đó là đủ để ngăn chặn bất kỳ cuộc đua. Đối với hầu hết các mục đích, chúng tôi có thể nghĩ về việc mua trước là tương đương với SMP và không phải lo lắng về điều này một cách riêng biệt.
Nhưng không có phiên bản hạt nhân hoặc ngày trên source.Bất cứ ai có thể xác nhận nếu nó vẫn còn hợp lệ cho hạt nhân Linux mới nhất?
Đó là bốn câu hỏi, vì vậy hãy chia nhỏ câu hỏi vì chúng có thể không được trả lời cùng nhau. –