Unreliable Guide To Hacking The Linux Kernel khẳng định rằngIn_irq() có đáng tin cậy không?
Bạn có thể nói bạn đang ở trong một ngắt phần cứng, vì in_irq() trả về true.
Thận trọng. Cẩn thận rằng điều này sẽ trả về một giá trị dương nếu các ngắt bị vô hiệu hóa (xem bên dưới).
Có thực sự trường hợp in_irq()
có thể trả về khác không phải trong ngữ cảnh hardirq trong hạt nhân Linux 2.6.32 hoặc mới hơn trên x86 không?
Trong thử nghiệm với hạt nhân 2.6.32 (Debian 6) và 3.4 (OpenSUSE 12.1), in_irq()
luôn trả về 0 khi được gọi từ ngữ cảnh quy trình ngay cả khi được gọi giữa local_irq_disable()
và . Các kết quả giống nhau khi tôi sử dụng các chức năng spinlock để tắt các ngắt thay vì local_irq*
.
Từ mã nguồn của hạt nhân, hiện tại tôi không thể xem cách in_irq()
có thể trả về kết quả dương tính giả. Ai có thể làm rõ điều này?
EDIT: Tôi cũng đã thử cả hai *_irqsave()
và *_irq()
spinlock API cũng như local_irq_save()
/local_irq_restore()
, kết quả là như nhau, có nghĩa là, in_irq()
trở 0 khi ngắt được vô hiệu hóa. Việc vô hiệu hóa ngắt một cách rõ ràng thông qua lệnh cli
máy trên x86 cũng không buộc in_irq() trả về khác 0.
CONFIG_PREEMPT là 'y', tất nhiên. Có, tôi đã kiểm tra * _irqsave, * _irq và * _bh biến thể của API khóa spinlock. Trong mỗi trường hợp, 'in_irq()' trả về 0 ngay cả khi một spinlock bị khóa. – Eugene
Có, tôi đã thấy việc thực hiện 'in_irq()'. Đây là lý do tại sao tôi không hiểu tại sao nó không tạo ra các kết quả dương tính giả trên các máy của tôi. – Eugene
Liệu 'in_irq()' có trả về khác không khi một spinlock bị khóa hoặc ngắt được vô hiệu hóa một số cách khác trong thử nghiệm của bạn? – Eugene