可重入代碼:任何狀態信息都是進程自己所特定的,不使用全局變量來記錄狀態信息
記錄狀態信息的方法:保存在驅動程序的局部變量中(每個進程在內核空間都有不同的堆棧頁來保存局部變量)
典型內存空間佈局
對於一個完整的程序,在內存中分佈情況如下圖:
也可以保存在訪問文件用的filp的私有數據結構(private_data)中。(但是可能同一個文件被父子進程共享)
如果狀態數據很多,可以用局部變量只保存一個指針。而用kmalloc來獲取實際的內存空間。
注意:kmalloc分配的空間需要kfree來釋放。內核空間工作時沒有”程序運行完自動釋放資源“的說法
下列兩種情況下需要使用可重入函數:
1 調用了schedule 用sleep_on 和wake_up引起的
2和用戶空間交換數據:因爲訪問用戶空間可能出現缺頁,缺頁時可能進入睡眠狀態。