寫驅動的朋友都應該知道,有些時候驅動程式編譯沒有出錯,執行也沒有出現錯誤,但是執行卻達不到我們想要的效果,這個時候除錯真的讓你束手無策了,這時候我們就可以想辦法直接檢視跟硬體相關暫存器的值,但是linux核心並沒這樣的工具,所以自己製作了乙個檢視暫存器的值得工具。
先動態載入我們除錯程式的工具,然後執行我們除錯工具的應用程式就可以實現檢視暫存器的值或者給暫存器寫值。
下面紅色部分不能亂定義,linux-2.6.31之後的版本已經明確規定了,各個cmd有自己的含義,具體內容參考這篇文章 。 開始我依次定義成0 1 2 3 4 5。就出錯了,我找這個原因花了兩個小時,老版本核心並沒有這樣的要求哦。就來檢視ioctl-number.txt檔案才找到原因了。
regeditor_drv.c /* 驅動程式 */
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define ker_rw_r8 100
#define ker_rw_r16 101 /* 切記!cmd命令值不能亂定義 */
#define ker_rw_r32 102
#define ker_rw_w8 103
#define ker_rw_w16 104
#define ker_rw_w32 105
static int major;
static struct class *class;
static long ker_rw_ioctl( struct file *file, unsigned int cmd, unsigned long arg)
case ker_rw_r16:
case ker_rw_r32:
case ker_rw_w8:
case ker_rw_w16:
case ker_rw_w32:
}iounmap(p8);
return 0;
}static struct file_operations ker_rw_ops = ;
static int ker_rw_init(void)
static void ker_rw_exit(void)
module_init(ker_rw_init);
module_exit(ker_rw_exit);
module_license("gpl");
#include #include #include #include #include #include #include #include #include #include #include #define ker_rw_r8 100
#define ker_rw_r16 101
#define ker_rw_r32 102
#define ker_rw_w8 103
#define ker_rw_w16 104
#define ker_rw_w32 105
/* usage:
* ./regeditor r8 addr [num] /* 用法 */
* ./regeditor r16 addr [num]
* ./regeditor r32 addr [num]
* * ./regeditor w8 addr val
* ./regeditor w16 addr val
* ./regeditor w32 addr val
*/void print_usage(char *file)
int main(int argc, char **argv)
fd = open("/dev/ker_rw", o_rdwr);
if (fd < 0)
/* addr */
buf[0] = strtoul(argv[2], null, 0);
if (argc == 4)
else
if (strcmp(argv[1], "r8") == 0) }
else if (strcmp(argv[1], "r16") == 0) }
else if (strcmp(argv[1], "r32") == 0) }
else if (strcmp(argv[1], "w8") == 0)
else if (strcmp(argv[1], "w16") == 0)
else if (strcmp(argv[1], "w32") == 0)
else
return 0; }
makefile:
kern_dir = /home/book/workspace/kernel/linux-3.4.2 /* linux核心路徑 */
all:
make -c $(kern_dir) m=`pwd` modules
clean:
make -c $(kern_dir) m=`pwd` modules clean
rm -rf modules.order
obj-m +=regeditor——drv.o
驅動程式編譯:make
應用程式編譯:arm-linux-gcc regeditor.c -o regeditor
linux除錯工具GDB
gdb偵錯程式除錯的物件是可執行檔案,使用gcc或者g 編譯器編譯源 時,必須加上 g才能使目標可執行檔案包含可被除錯的資訊。比如 gcc g o helloworld helloworld.c 編譯並連線程式,使之包含可被除錯資訊 gdb helloworld 使用gdb偵錯程式開啟hellowo...
Linux除錯工具2
偵錯程式 gdb gnu計畫的工具 核心除錯kgdb 程式的錯誤分類 編譯時錯誤 語法錯誤 執行時錯誤 記憶體錯誤,邏輯錯誤 gdb的功能 1.執行程式 2.設定斷點 3.檢視變數值 hello.c gcc g hello.c o hello gdb hello 使用 tui run layout ...
Linux核心除錯工具
linux核心除錯工具 strace 追蹤系統呼叫路徑 systemtap 基於kprobe kexec 從執行的核心裝載另乙個核心 kdump 崩潰轉存 kprobe 核心裡設定探針 kdb 核心除錯 kgdb 用另一台機器配合gdb除錯核心 objdump 獲取核心模組資訊 uml user m...