瑞芯微——Linux的常用指令--grep
作为一个 Linux 内核驱动开发者,尤其是写 RV1126b 这类嵌入式芯片驱动时, 你一定有过这种 “翻源码翻到眼酸” 的时刻:
想找 platform_driver_register 的定义,却不知道在哪个头文件里; 想参考一个类似的 I2C 驱动,却不知道从哪个文件入手; 想查 -ENODEV 错误码的含义,却翻遍了目录找不到。
这时候,你需要一个内核驱动开发的 “源码导航仪” —— 它就是 grep。
在我看来,grep 就像内核源码里的 “精准探测器”, 不管你要找的是函数定义、结构体、宏、设备树属性还是错误码, 只要给它一个关键词,它就能在嵌套几十层的内核源码里快速定位, 帮你节省大把翻源码的时间。
先看例子(RV1126b 驱动开发真实场景)
假设你正在写 RV1126b 的摄像头驱动,需要做这几件事:
- 找 struct platform_driver 的定义,了解怎么注册平台驱动;
- 找 devm_kzalloc 的实现,确认它的内存管理机制;
- 查设备树里 RV1126b 的 compatible 属性,匹配你的驱动;
- 找 -EINVAL 错误码的定义,排查参数错误问题。
用 grep 一键搞定:
1. 找 struct platform_driver 定义(带上下文)
cd ~/rv1126b_linux6.1_release_v1.2.0/kernel/
grep -A 30 "struct platform_driver" include/linux/platform_device.h
-A 30 会显示匹配行之后的 30 行,直接看到结构体的成员,不用再打开文件翻。
2. 找 devm_kzalloc 的实现(只搜 .c 文件)
grep -r "devm_kzalloc" --include="*.c" drivers/base/
--include="*.c" 只搜 C 源文件,避免搜到头文件里的声明,直接定位实现。
3. 查 RV1126b 设备树 compatible 属性
grep -r "rockchip,rk1126" arch/arm/boot/dts/
快速找到 RV1126b 设备树里的匹配字符串,直接用到你的驱动 of_match_table 里。
4. 找 -EINVAL 错误码定义
grep -w "EINVAL" include/uapi/asm-generic/errno-base.h
-w 全词匹配,避免搜到包含 EINVAL 的其他宏,直接看到错误码的数值和注释。
grep:驱动开发核心用法 + 高频参数
内核源码目录深、文件多,grep 的这几个参数是驱动开发必备,一定要记牢:
1. 核心参数(开发必背)
- --include=".c" / --include=".h":只搜指定类型文件
2. 驱动开发经典搜索场景
场景1:找内核 API 声明 & 实现
# 找声明(头文件)
grep -r "int devm_request_irq" --include="*.h" include/linux/
# 找实现(C 文件)
grep -r "devm_request_irq" --include="*.c" drivers/base/
场景2:找参考驱动(I2C / 平台驱动)
# 找 I2C 驱动
grep -r "i2c_driver" drivers/i2c/ --include="*.c" | head -30
# 找设备树匹配表
grep -A 10 "of_match_table" drivers/ --include="*.c" | grep -B 10 "compatible"
场景3:查设备树属性
# RV1126 摄像头设备树
grep -r "camera" arch/arm/boot/dts/rockchip/
# reg 属性
grep -A 5 "reg" include/linux/of.h
场景4:查错误码 & 宏
grep -w "E[A-Z]+" include/uapi/asm-generic/errno-base.h
grep -r "GPIO_" include/linux/gpio/
驱动开发高效小技巧(grep 组合使用)
1. grep + find(更快更精准)
find drivers/ -name "*.c" -o -name "*.h" | xargs grep -n "struct platform_driver"
2. grep + vim(直接跳转到代码行)
grep -n "devm_kzalloc" drivers/base/devres.c
vim +1234 drivers/base/devres.c
3. grep -v 排除干扰文件
grep -r "i2c_driver" drivers/i2c/ | grep -v ".o$"
4. grep + cscope 搭配使用
grep 适合模糊搜索、批量找参考; cscope 适合精准跳转定义,两者搭配效率最高。
总结
grep 是 Linux 内核驱动开发的 “第一工具” —— 它能帮你快速定位 API、结构体、设备树属性和参考代码, 不用再在嵌套几十层的源码里瞎翻。
记住常用的:
再配合 find 和 vim,能让你的 RV1126b 驱动开发效率直接起飞!
grep 的大致用法就讲到这里, 大家有什么在内核驱动开发中用 grep 的经典场景或小技巧,欢迎在评论区交流~