devmem调试内核驱动
来源:互联网 发布:淘宝两天没发货怎么办 编辑:程序博客网 时间:2024/05/16 12:30
在Linux开发中着实用到的调试工具并不是很多。devmem的方式是提供给驱动开发人员,在应用层能够侦测内存地址中的数据变化,以此来检测驱动中对内存或者相关配置的正确性验证。
devmem2使用方法: devmem2 { address } [ type [ data ] ] address : 物理地址 type :要访问的数据类型 : [b]yte, [h]alfword, [w]ord data :想要写入的数据,若为读取操作则省略此参数,若为写入,则必须含有此参数。
如下就贴出devmem2的源代码一探究竟。
01.#include <stdio.h> 02.#include <stdlib.h> 03.#include <unistd.h> 04.#include <string.h> 05.#include <errno.h> 06.#include <signal.h> 07.#include <fcntl.h> 08.#include <ctype.h> 09.#include <termios.h> 10.#include <sys/types.h> 11.#include <sys/mman.h> 12. 13.#define FATAL do { fprintf(stderr, "Error at line %d, file %s (%d) [%s]\n", \ 14. __LINE__, __FILE__, errno, strerror(errno)); exit(1); } while(0) 15. 16.#define MAP_SIZE 4096UL 17.#define MAP_MASK (MAP_SIZE - 1) 18. 19.int main(int argc, char **argv) { 20. int fd; 21. void *map_base, *virt_addr; 22. unsigned long read_result, writeval; 23. off_t target; 24. int access_type = 'w'; 25. 26. if(argc < 2) {//若参数个数少于两个则打印此工具的使用方法 27. fprintf(stderr, "\nUsage:\t%s { address } [ type [ data ] ]\n" 28. "\taddress : memory address to act upon\n" 29. "\ttype : access operation type : [b]yte, [h]alfword, [w]ord\n" 30. "\tdata : data to be written\n\n", 31. argv[0]); 32. exit(1); 33. } 34. target = strtoul(argv[1], 0, 0); 35. 36. if(argc > 2) 37. access_type = tolower(argv[2][0]); 38. 39. 40. if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) FATAL; 41. printf("/dev/mem opened.\n"); 42. fflush(stdout); 43. 44. /* Map one page */ //将内核空间映射到用户空间 45. map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK); 46. if(map_base == (void *) -1) FATAL; 47. printf("Memory mapped at address %p.\n", map_base); 48. fflush(stdout); 49. 50. virt_addr = map_base + (target & MAP_MASK); 51. //针对不同的参数获取不同类型内存数据 52. switch(access_type) { 53. case 'b': 54. read_result = *((unsigned char *) virt_addr); 55. break; 56. case 'h': 57. read_result = *((unsigned short *) virt_addr); 58. break; 59. case 'w': 60. read_result = *((unsigned long *) virt_addr); 61. break; 62. default: 63. fprintf(stderr, "Illegal data type '%c'.\n", access_type); 64. exit(2); 65. } 66. printf("Value at address 0x%X (%p): 0x%X\n", target, virt_addr, read_result); 67. fflush(stdout); 68. //若参数大于3个,则说明为写入操作,针对不同参数写入不同类型的数据 69. if(argc > 3) { 70. writeval = strtoul(argv[3], 0, 0); 71. switch(access_type) { 72. case 'b': 73. *((unsigned char *) virt_addr) = writeval; 74. read_result = *((unsigned char *) virt_addr); 75. break; 76. case 'h': 77. *((unsigned short *) virt_addr) = writeval; 78. read_result = *((unsigned short *) virt_addr); 79. break; 80. case 'w': 81. *((unsigned long *) virt_addr) = writeval; 82. read_result = *((unsigned long *) virt_addr); 83. break; 84. } 85. printf("Written 0x%X; readback 0x%X\n", writeval, read_result); 86. fflush(stdout); 87. } 88. 89. if(munmap(map_base, MAP_SIZE) == -1) FATAL; 90. close(fd); 91. return 0; 92.}
0 0
- devmem调试内核驱动
- Linux驱动开发常用调试工具-------之devmem
- Linux驱动开发常用调试工具-------之devmem
- Linux驱动开发常用调试工具-------之devmem
- Linux驱动开发常用调试工具---之devmem
- Linux驱动开发常用调试工具-------之devmem
- Linux驱动开发常用内存调试工具 memtool and devmem
- Linux驱动开发常用调试工具---之内存读写工具devmem和devkmem
- Linux驱动开发常用调试工具---之内存读写工具devmem和devkmem
- Linux驱动开发常用调试工具---之内存读写工具devmem和devkmem
- Linux驱动开发常用调试工具---之内存读写工具devmem
- devmem
- 内核驱动调试方法
- linux 内核驱动调试
- windbg调试内核驱动
- DirectFB学习之使用devmem驱动
- 内核驱动加载调试(1)
- 内核驱动加载调试(2)
- 简述软件配置管理
- 简易流水线需改进的问题
- 基于线程池的http服务器
- 在jsp中重复定义了两个相同id的标签导致的错误
- 为什么无线信号(RSSI)是负值
- devmem调试内核驱动
- java 读写者问题 实现
- unsigned long类型转换为CString出现的问题
- MyEclipse8.6中提交SVN报错
- 使用AJAX填充<select>标签下拉项,没有显示指定的option项
- ssh之我见
- 为什么Nginx的性能要比Apache高很多?
- no sigar-amd64-winnt.dll in java.library.path 错误
- Win10下PB停在欢迎窗口界面