Linux驱动编程 step-by-step (六) 用户地址检测 简单模块调试 以及一些杂项
生活随笔
收集整理的這篇文章主要介紹了
Linux驱动编程 step-by-step (六) 用户地址检测 简单模块调试 以及一些杂项
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
用戶地址檢測 簡單模塊調試 以及一些雜項
檢測用戶空間地址的有效性
上一節中提到在read write時候要檢測用戶空間傳遞的參數地址是否是有效地址,有的內核函數會自行檢測,但是在調用輕量級的內核函數時候,就可能不去檢測用戶空間的地址是否有效,如果此時用戶無傳遞一個無效地址,而內核函數去操作了它,這時棘手的問題出現了,輕則內核oops 關機重啟就OK了,在特別嚴重的情況下,可能你的系統就崩潰了(我又遇到過),所以,我們在驅動程序中操作用戶空間地址時候要小心加小心。如果電腦配置可以就在虛擬機中玩, 或者在開發板上試,當然這邊的測試代碼我都有試過,不至于讓你系統崩潰的。如何檢測呢?
調用一個access_ok函數去檢測
[cpp]?view plaincopy
addr 用戶傳入的地址
size 讀寫的長度
此代碼在有內存管理的芯片與無內存管理之間有區別
我們 看一段內核代碼 (path : arch/arm/include/asm/uaccess.h)
即在有內存管理并配置了內存管理的芯片內調用次函數會執行檢測操作,而在沒有配置內存管理的芯片中此函數總是返回真,而做驅動的不應該做這些假設,所以傳入的參數在有必要的情況下還是要自行檢測再看看copy_to_user函數 [cpp]?view plaincopy
而當我們調用
簡單模塊調試技術
為什么要加簡單呢? 因為這邊只介紹了用打印來調試程序。看了LDD3上邊介紹的很多調試技術 ?查詢調試 觀察調試之類
我覺得 打印調試來的最簡單最直接 雖然他有一些限制
1、大量的使用printk會使系統變慢
2、沒次打印一行都會引起磁盤操作
...
在printk中有7中 消息的選項 表示著不同的消息等級
| KERN_GMERG<0> | 用于緊急消息, 常常是那些崩潰前的消息. |
| KERN_ALERT<1> | 需要立刻動作的情形. |
| KERN_CRIT<2> | 嚴重情況, 常常與嚴重的硬件或者軟件失效有關. |
| KERN_ERR<3> | 用來報告錯誤情況; 設備驅動常常使用 來報告硬件故障. |
| KERN_WARNING<4> | 有問題的情況的警告, 這些情況自己不會引起系統的嚴重問題 |
| KERN_NOTICE<5> | 正常情況, 但是仍然值得注意. 在這個級別一些安全相關的情況會報告. |
| KERN_INFO<6> | 信息型消息. 比如 :打印它們發現的硬件的信息. |
| KERN_DEBUG<7> | 用作調試消息. |
在系統中我們 可以使用? echo 8 >?/proc/sys/kernel/printk ?來調整這個數值(要root權限) 使信息全部被打印出來。
當然我們 也可以通過dmesg來查看所有的打印信息 (有一點不適用,就是當系統出現oops的時候 就不行了 因為你已經死機了 也就輸不了這個命令 就看不到打印信息了) 。
[cpp]?view plaincopy
在需要打印的地方我們就使用
[cpp]?view plaincopy
打印當前進程信息
內核模塊不像應用程序一樣順序執行,只用應用進程調用到想關聯的函數才會到內核模塊中call這個接口,那可不可以 打印調用進程的信息呢?
答案是肯定的,linux中定義了 current 這個變量(<linux/sched.h>)current指向了當前的進程,他是一個 task_struct 類型
其中有兩個重要的成員
comm 表示了 當前的命令名名
pid 表示了當前進程號
[cpp]?view plaincopy
內核的container_of函數
在寫字符設備驅動時候我們都會去自定義一個結構,其中包含了cdev結構
[cpp]?view plaincopy
所以需要尋求一種安全的方法
container_of為我們提供了這么一個很好的接口
[cpp]?view plaincopy
ptr是指結構體一個成員的地址
type 指要獲得的結構體
member ptr指向的成員在結構體中的名字 [cpp]?view plaincopy
container_of 的實現基本原理是這樣的:
知道了結構體中某個成員的地址, ?又可以求的該成員在改結構體中得偏移,拿成員的地址減去這個偏移,就得到了整個結構的地址,太佩服寫內核的人了
[cpp]?view plaincopy
總結
以上是生活随笔為你收集整理的Linux驱动编程 step-by-step (六) 用户地址检测 简单模块调试 以及一些杂项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux驱动编程 step-by-st
- 下一篇: Linux驱动编程 step-by-st