Linux-hexdump命令调试event驱动—详解(13)

本文介绍了如何使用hexdump工具调试Linux内核中的键盘和触摸屏驱动。通过分析event设备中的数据,展示了在按键按下和松开时event结构体中的时间戳、事件类型、代码和值的变化,以及同步事件的处理。同时,文章还提供了键盘驱动和触摸屏驱动的调试实例。

2018-01-03阅读 6300

hexdump: 查看文件的内容,比如二进制文件中包含的某些字符串,通常用来调试驱动用

描述:

我们以event1为例,当我们insmod挂载了键盘驱动后,出现一个event1设备,

此时没有按键按下,所以event1里面的数据是没有的,那么数据又是从来哪里来?

通过键盘驱动的read函数,若有按键按下,就会上传按键数据给用户层hexdump

因为键盘驱动的input_handler 是:evdev_handler

所以键盘驱动的read函数是: evdev_handler->evdev_fops->evdev_read

进入evdev_read()函数,如下图所示:\

 

evdev_event_to_user()这个函数从字面上来看,显然就是用来上传给用户层的函数,其中buffer是函数参数,指向用户层,

所以数据就是event.

我们来看看event的结构体:input_event

struct input_event {
struct timeval time;  //事件发生的时间
__u16 type;            //  哪类事件, 比如键盘事件
__u16 code;     // 对应的事件里支持的哪个变量,比如按键K
__s32 value;   // 对应的变量里的数值, 比如松开按键则是1,反之为0
};

把 time里的成员展开如下:

 struct input_event {
long   tv_sec; /* seconds */          //秒
long   tv_usec;    /* microseconds */     //微妙

__u16 type;            //  哪类事件, 比如键盘事件
__u16 code;     // 对应的事件里支持的哪个变量,比如按键K
__s32 value;   // 对应的变量里的数值, 比如松开按键则是1,反之为0
};

所以我们hexdump调试任何输入子系统event XX驱动时,有信息就会打印上面数据

 1.调试键盘驱动

(键盘驱动代码:13.Linux键盘按键驱动 (详解) - 诺谦 - 博客园)

以按开发板的按键 KEY_L,为例(因为数据是从低到高打印的,所以数据是反的):

# hexdump /dev/event1     //按键键盘驱动

/*按下时:*/
//hexdump序列号          秒             微妙         键盘事件    code=KEY_L     value=1(按下)
 0000000             07c6 0000      faa2 000b      0001        0026          0001 0000
//hexdump序列号          秒             微妙         同步事件       code        value=0 
 0000010            07c6 0000      faac 000b       0000        0000          0000 0000

/*松开时:*/
//hexdump序列号          秒             微妙         键盘事件     code=0x26     value=0(松开)
 0000020             07c6 0000     cf67 000d        0001        0026         0000 0000
//hexdump序列号          秒             微妙         同步事件      code         value=0 
 0000030             07c6 0000     cf70 000d        0000        0000         0000 0000

2.调试触摸屏驱动

(触摸屏驱动代码: )

 /dev/event0            //触摸屏驱动
# hexdump /dev/event0 
//hexdump序列号          秒             微妙        绝对坐标事件    code=ABS_X   X坐标值 
0000000               0412 0000      6ef0 000c      0003          0000      0239 0000
//hexdump序列号          秒             微妙        绝对坐标事件    code=ABS_Y   Y坐标值
0000010                 0412 0000    6f08 000c      0003          0001      01ae 0000
//hexdump序列号          秒             微妙        绝对坐标事件    code=压力     压力值
0000020             0412 0000        6f0c 000c      0003          0018      0001 0000
//hexdump序列号          秒             微妙        键盘事件       code=触摸按键  value=1(按下)
0000030              0412 0000       6f10 000c      0001          014a      0001 0000
//hexdump序列号          秒             微妙        同步事件      
0000040             0412 0000        6f13 000c      0000          0000      0000 0000

//hexdump序列号          秒             微妙        绝对坐标事件    code=压力     压力值
00000b0               023b 0000      872d 000c      0003          0018      0000 0000

//hexdump序列号          秒             微妙        键盘事件      code=触摸按键  value=0(松开)
00000b0            0412 0000         1f5b 000d     0001          014a       0000 0000
//hexdump序列号          秒             微妙        同步事件      
00000c0             0412 0000        1f70 000d     0000          0000       0000 0000

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

 

<think>我们正在讨论hexdump命令,用户请求获取该命令的详细解释。根据之前的对话历史,用户已经对`hexdump -C`有了一定的了解,现在希望获得更全面的命令解释。 参考引用资料: - 引用[1]和[2]介绍了hexdump的基本用途:查看和解析二进制文件,以十六进制格式显示文件内容。 - 引用[4]提供了详细的参数说明(基于RHEL 5.7)。 - 引用[5]展示了使用`hexdump -C`的典型输出示例。 结合这些信息,我应当构建一个全面的解释,包括: 1. 命令的基本功能和典型应用场景 2. 核心参数详解(特别是常用参数如-C, -n, -s等) 3. 输出格式解析(重点说明-C格式的双栏显示) 4. 实际使用示例 5. 与其他工具(如xxd, od)的简单对比 特别注意:用户要求使用中文回答,数学表达式需用$...$或$$...$$格式(但hexdump解释中数学表达式较少,可能涉及偏移量计算时使用)。 由于hexdump参数较多,我将重点解释最常用的参数,避免信息过载。同时,根据引用[3]和[5]的示例,加入实际命令示例。 最后,按照要求生成相关问题。 </think>### `hexdump` 命令详解 `hexdump` 是 Linux 中用于**以十六进制、十进制或 ASCII 格式解析文件二进制内容**的核心工具,适用于二进制文件分析、数据结构调试和隐藏内容检测[^1][^2]。 --- #### **一、核心功能与用途** 1. **二进制文件分析** - 查看 ELF 可执行文件头、图片元数据等二进制结构。 - 检测文件中的非打印字符(如空字符 `0x00`)。 2. **数据格式转换** - 支持十六进制(`-x`)、八进制(`-o`)、十进制(`-d`)、ASCII(`-c`)多种格式输出。 3. **偏移量定位** - 左侧列显示**十六进制偏移地址**(如 `00000000`),便于精确定位数据位置。 --- #### **二、命令语法** ```bash hexdump [选项] 文件名 ``` 或简写为: ```bash hd [选项] 文件名 # 部分系统支持 ``` --- #### **三、常用参数详解** | 参数 | 作用 | 示例 | |------|------|------| | **`-C`** | **规范格式(十六进制 + ASCII 双栏)** | `hexdump -C file.bin` | | **`-n N`** | 仅解析前 N 字节 | `hexdump -n 64 file` | | **`-s OFFSET`** | 从指定偏移开始解析 | `hexdump -s 0x100 file` | | **`-v`** | 禁用重复行压缩(显示全部原始数据) | `hexdump -Cv file` | | **`-x`** | 双字节十六进制输出 | `hexdump -x file` | | **`-e fmt`** | **自定义格式**(高级用法) | 见下文 | --- #### **四、输出格式解析(以 `-C` 为例)** ```bash 00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| ``` 1. **左侧:偏移地址** `00000000` 表示当前行的起始字节位置(十六进制)。 2. **中部:十六进制数据** - 每行默认 16 字节,每 8 字节用空格分隔(`7f 45 ... 00 00`)。 3. **右侧:ASCII 映射** - 可打印字符显示原字符(如 `.`、`E`、`L`)。 - 不可打印字符(如 `0x00`)显示为 `.`。 - UTF-8 等多字节字符**无法完整显示**,会被拆分为单字节处理[^5]。 --- #### **五、自定义格式(`-e` 高级用法)** 通过 `-e` 定义解析规则: ```bash hexdump -e '格式字符串' 文件 ``` - **示例 1**:每字节显示为 8 位十六进制 ```bash hexdump -e '/1 "%08X "' file # 输出:0000007F 00000045 ... ``` - **示例 2**:解析 4 字节整数(小端序) ```bash hexdump -e '/4 "%d "' file # 若数据为 01 00 00 00 → 输出:1 ``` - **格式符号**: - `/1`:单字节单位 - `/4 "%d"`:4 字节按十进制整数解析 - `"%08X"`:8 位十六进制(补零对齐) --- #### **六、典型应用场景** 1. **查看二进制文件头** ```bash hexdump -C -n 32 /bin/ls # 解析 ls 命令前 32 字节 ``` 2. **检测文本中的隐藏字符** ```bash echo -e "Hello\x00World" | hexdump -C ``` 输出: ``` 00000000 48 65 6c 6c 6f 00 57 6f 72 6c 64 |Hello.World| ``` 3. **网络数据包分析** ```bash tcpdump -i eth0 -w packet.pcap # 抓包 hexdump -C -s 14 -n 20 packet.pcap # 解析 IP 头(偏移 14 字节) ``` --- #### **七、与其他工具对比** | 命令 | 特点 | 适用场景 | |---------------|-------------------------------|----------------------| | `hexdump -C` | 规范双栏输出+偏移地址 | 二进制结构分析 | | `xxd` | 类似 `-C`,支持反向生成二进制 | 二进制编辑 | | `od -x` | 纯十六进制输出(无 ASCII 栏) | 原始数据提取 | > 注意:不同 Linux 发行版的 `hexdump` 参数可能略有差异,建议通过 `man hexdump` 查看本地帮助[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值