可重入函數

可重入代碼:任何狀態信息都是進程自己所特定的,不使用全局變量來記錄狀態信息

記錄狀態信息的方法:保存在驅動程序的局部變量中(每個進程在內核空間都有不同的堆棧頁來保存局部變量)

典型內存空間佈局典型內存空間佈局

對於一個完整的程序,在內存中分佈情況如下圖:

         一個進程在內存中的佈局 - 玄機逸士 - 玄機逸士博客


也可以保存在訪問文件用的filp的私有數據結構(private_data)中。(但是可能同一個文件被父子進程共享)

如果狀態數據很多,可以用局部變量只保存一個指針。而用kmalloc來獲取實際的內存空間。

注意:kmalloc分配的空間需要kfree來釋放。內核空間工作時沒有”程序運行完自動釋放資源“的說法


下列兩種情況下需要使用可重入函數:

1 調用了schedule 用sleep_on 和wake_up引起的

2和用戶空間交換數據:因爲訪問用戶空間可能出現缺頁,缺頁時可能進入睡眠狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章