2.4 常用的系統支持
2.4.1 內存申請和釋放
include/linux/kernel.h裡聲明了kmalloc()和kfree()。用於在內核模式下申請和釋放內存。
void *kmalloc(unsigned int len,int priority);
void kfree(void *__ptr);
與用戶模式下的malloc()不同,kmalloc()申請空間有大小限制。長度是2的整次方。可以申請的最大長度也有限制。另外kmalloc()有priority參數,通常使用時可以為GFP_KERNEL,如果在中斷裡調用用GFP_ATOMIC參數,因為使用GFP_KERNEL則調用者可能進入sleep狀態,在處理中斷時是不允許的。
kfree()釋放的內存必須是kmalloc()申請的。如果知道內存的大小,也可以用kfree_s()釋放。
2.4.2 request_irq() free_irq()
這是驅動程序申請中斷和釋放中斷的調用。在include/linux/sched.h裡聲明。request_irq()調用的定義:
int request_irq(unsigned int irq,
void (*handler)(int irq, void *dev_id, struct pt_regs *regs),
unsigned long irqflags,
const char * devname,
void *dev_id);
irq是要申請的硬件中斷號。在Intel平台,范圍0--15。handler是向系統登記的中斷處理函數。這是一個回調函數,中斷發生時,系統調用這個函數,傳入的參數包括硬件中斷號,device id,寄存器值。dev_id就是下面的request_irq時傳遞給系統的參數dev_id。irqflags是中斷處理的一些屬性。比較重要的有SA_INTERRUPT,標明中斷處理程序是快速處理程序(設置SA_INTERRUPT)還是慢速處理程序(不設置SA_INTERRUPT)。快速處理程序被調用時屏蔽所有中斷。慢速處理程序不屏蔽。還有一個SA_SHIRQ屬性,設置了以後運行多個設備共享中斷。dev_id在中斷共享時會用到。一般設置為這個設備的device結構本身或者NULL。中斷處理程序可以用dev_id找到相應的控制這個中斷的設備,或者用rq2dev_map找到中斷對應的設備。
void free_irq(unsigned int irq,void *dev_id);