1. 程式人生 > >linux核心自旋鎖和中斷知識講解

linux核心自旋鎖和中斷知識講解

一、併發與競態三個要點

1、只要併發的執行單元同時訪問共享記憶體是就會出現競態

2、解決競態的唯一途徑是保證共享資源的互斥訪問,即一個執行單元在訪問共享資源時,其他的執行單元被禁止訪問。 3、訪問共享資源的程式碼區域被稱為臨界區,臨界區需要被以某種互斥機制加以保護 二、自旋鎖注意事項 1、自旋鎖是一種忙等鎖,當執行臨界區是沒有獲得鎖時,CPU一直迴圈執行“測試並設定”的原子操作,等待鎖的獲得,在等待過程中CPU不會做任何的工作,所以自旋鎖一定要是用在臨界區特別短的,即等待時間會很短,否則會降低系統性能 2、自旋鎖會導致系統出現死鎖,即已經獲得自旋鎖的資源重新再去獲得這個自旋鎖,即自旋鎖的遞迴使用,就會發生死鎖
3、在自旋鎖期間不能呼叫可能引起程序排程的函式比如說copy_from_user,kmalloc(),msleep()等 三、中斷與定時器 根據終端的來源可分為內部中斷和外部中斷 內部中斷:例如作業系統從使用者態切換到核心態需藉助CPU內部的軟體中斷 外部中斷的中斷源來自CPU外部,由外設提出請求 向量中斷和非向量中斷:向量中斷由硬體提供中斷程式服務入口地址,非向量中斷由軟體提供中斷服務程式入口地址 SGI:軟體產生的中斷,可用於多核之間的通訊,一個CPU可以通過寫GIC的暫存器給另外一個CPU產生中斷, SPI:共享的外設中斷,這類外設的中斷可路由到任何一個CPU 頂半部和低半部:因為中斷能打斷核心的排程和正常執行,會對系統性能有影響,所以中斷的執行時間應該儘可能的短,但有時候又必須在中斷裡進行一些延時操作,所以linux將中斷處理程式分為兩個半部,頂半部和低半部
頂半部執行緊急的硬體操作,低半部執行延緩的耗時操作 中斷的申請和釋放 低半部機制 linux的低半部機制主要由taklet,工作佇列,軟中斷和執行緒話irq tasklet作為低半部處理中斷程式
void xxx_do_tasklet(unsight long);
DSCLARE_TASKLET(xxx_tasklet,xxx_do_tasklet,0)
中斷處理低半部
void xxx_do_tasklet(unsighned long)
{

}
中斷處理頂半部
irqreturn_t xxx_interrupt(int irq,void *dev_id)
{
........
     tasklet_schedule(&xxx_tasklet);
}

int __init xxx_init(void)
{
    result = request_irq(xxx_irq,xxx_interrupt,0,"xxx",NULL);
}
void __exit xxx_exit(void){
    free_irq(xxx_irq,xxx_interrupt);
}
總結:低半部中斷的處理函式tasklet一般要在頂半部經過tasklet_schedule()函式排程在適當的時候執行。執行排程函式後低半部處理函式將掛到該裝置的低半部執行佇列中去。 軟中斷只是中斷低半部的一種處理機制