2013-02-04 40 views
5

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()*_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.

Trả lời

3

in_irq() là một trình bao bọc looks at some bits in preempt_count, là một cấu trúc trong cấu trúc thread_info và giá trị 0 có nghĩa là nó không được đặt trước để nó không nằm trong dấu ngoặc vuông.

local_irq_disable() tự nó không ảnh hưởng đến số đó, nhưng spin_lock_irqsave()does, để có thể dẫn đến dương tính giả. Bạn nói rằng bạn đã sử dụng các hàm spinlock, bạn đã sử dụng chức năng này chưa? Nếu có, hãy xem liệu giá trị của preempt_count có thay đổi không.

CHỈNH SỬA: Chỉ để bao gồm tất cả các cơ sở, hãy kiểm tra để đảm bảo rằng khả năng hỗ trợ trước hạt nhân được bật.

+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

+0

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

+0

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

Các vấn đề liên quan