字元裝置驅動程式學習筆記四

2022-08-18 04:18:09 字數 2032 閱讀 7513

竟爭與互斥

程式除錯

1 列印除錯資訊 printk

定義全域性列印

示例**如下:

#ifdef pdebug

#define plog(fmt,args...) printk(kern_debug "scull:",fmt,##args)

#else

/*do nothing*/

#define plog(fmt,args...)

#endif

在makefile中定義pdebug的值

示例**如下:

debug=y

ifeq($(debug),y)

debflags=-o2 -g -d pdebug

else

debflags=-o2

endif

cflags+=$(debflags)

2 偵錯程式除錯 kdb kgdb

3 查詢除錯

4 通過核心配置工具中的kernel hacking選單

5 通過監視除錯strace

併發與竟態

併發: 多個執行單元同時被執行

競態:併發的執行單元對共享資源的訪問導致的競爭狀態

示例**如下:

if(copy_from_user(&dev->data[pos]),buf,count)

ret=-efault;

goto out;

加鎖  互斥

spin_lock機制

semaphore機制

訊號量如果乙個任務相要獲得已經被占用的訊號量時,訊號量將會將這個程序放入乙個

等待佇列,然後讓其睡眠,當持有訊號量的程序將訊號釋放後,處於等待佇列中

的任務被子喚醒

在定義定義訊號量

struct semaphore sem;

初始人訊號量

/*設定訊號量的初值為val*/

void sema_init(struct semaphore *sem,int val)

互斥體必須在執行時被初始化

/*初始化乙個互斥鎖,把sem的值設為1 */

void init_mute(struct semphore *sem)

/*同上,將sem設定為0,為已鎖狀態*/

void init_mutex_locked(struct semaphore *sem)

/*定義初始化為1*/

declare_mutex(name)

/*定義初如化為0*/

declare_mutex_locked(name)

獲取訊號量

/*不建議使用,可能會導致程式睡眠,不能在中斷上下文使用該函式*/

void down(struct semaphore *sem)

/*如果訊號量不可用,程序將被置為task_interruptible*/

int down_interruptible(struct semaphore *sem)

/*如果訊號量不可用,置為task_killable*/

down_killable(struct semaphore *sem)

釋放訊號量

/*把sem的值加1,如果sem的值為非正數,表明有任務等待,喚醒這些等待者*/

void up(struct semaphore *sem)

自旋鎖最多只能被乙個可執行單元持有,不會引起呼叫者睡眠

如果乙個執行執行緒想要獲得乙個已經被持有的自旋鎖,就會一直進行忙迴圈,查

看是否被釋放

/*初始化自旋鎖*/

spin_lock_init(x)

/*獲取自旋鎖,不成功則一直自旋在那裡*/

spin_lock(lock)

/*獲取自旋鎖,直接返回真假,不會一直等待*/

spin_trylock(lock)

/*釋放自旋鎖*/

spin_unlock(lock)

自旋鎖與訊號量的使用場景

自旋鎖  只有乙個持有者

時間較短的情況        

訊號量  多個持有者

保持時間較長的情況

字元裝置驅動程式學習筆記四

竟爭與互斥 程式除錯 1 列印除錯資訊 printk 定義全域性列印 示例 如下 ifdef pdebug define plog fmt,args.printk kern debug scull fmt,args else do nothing define plog fmt,args.endif...

linux裝置驅動程式 字元裝置驅動程式

先留個 有一起學習驅動程式的加qq295699450 字元裝置驅動 這篇比較惱火。載入成功,但是讀不出來資料,有知道怎麼回事的,留個言,一起討論下 資料結構 struct scull mem struct scull dev dev 整個驅動程式 如下 include include include...

Linux裝置驅動程式 字元裝置驅動程式

1.檢視主裝置號,次裝置號 進入 dev目錄執行ls l,第四,五列分別為主次裝置號,10,180,1,5,這些是主裝置號,而60,63這些就是次裝置號 130 shell android dev ls l crw rw r system radio 10,60 1969 12 31 21 00 a...