2013-03-06 38 views
7

Trong mô-đun hạt nhân, tôi cần xử lý ngắt bằng cách viết "số không" vào địa chỉ bộ nhớ vật lý.C - Ghi vào bộ nhớ vật lý từ mô-đun hạt nhân

Trước hết, tôi nên phân bổ bộ nhớ theo một số chức năng như "mmap", nhưng đối với mô-đun hạt nhân; ví dụ, ioremap.

static irqreturn_t int068_interrupt(int irq, void *dev_id) 
{ 
    unsigned int *p; 
    unsigned int address; 
    unsigned int memsize; 

    address = 0x12345678; 
    memsize = 1024; 

    p = ioremap(address, memsize); 
    p[0]=0; 

    printk("Interrupt was handled\n"); 

    return IRQ_HANDLED; 
} 

Tuy nhiên, các tai nạn hạt nhân khi ngắt đến và gián đoạn xử lý bắt đầu xử lý nó (BUG hạt nhân tại mm/vmalloc.c: numberofline)

Dường như điều gì sai với việc sử dụng của tôi ioremap, hoặc Tôi nên sử dụng "thay thế hạt nhân khác của mmap"

Vui lòng cho tôi biết, cách khắc phục sự cố này?

+2

Bạn đã thử thực hiện lệnh gọi 'ioremap' _outside_ ngắt? Ví dụ. trong mã khởi tạo mô-đun? –

+0

@JoachimPileborg cùng một mã hoạt động tốt trong mô-đun init! O_O Tuy nhiên, tôi cần mã này tại trình xử lý ngắt –

+1

Thiết bị có tiếp tục di chuyển trong không gian địa chỉ thực không ??? –

Trả lời

3

trực tiếp từ Linux ioremap.c:

Nếu bạn iounmap và ioremap một khu vực, các CPU khác sẽ không thấy thay đổi này cho đến khi chuyển đổi bối cảnh tiếp theo của họ. Trong khi đó, (ví dụ) nếu một ngắt xuất hiện trên một trong các CPU khác yêu cầu vùng ioremap'd mới để tham chiếu, CPU sẽ tham khảo vùng cũ.

Điều này gây ngạc nhiên khi yêu cầu tránh ioremap gọi trong vòng một dịch vụ gián đoạn thường xuyên.

+3

+ [ioremap/iounmap trong bối cảnh ngắt] (http://www.spinics.net/lists/newbies/msg22020 .html). –