一、内核模块操作
1.模块管理
--insmod xxx.ko: 加载内核驱动模块,不会自动解析依赖;
--modprobe xxx: 智能加载,自动匹配依赖模块(需 modules.dep);
--rmmod xxx: 卸载驱动模块;
--lsmod: 列出当前已加载全部内核模块,查看占用、依赖关系;
--modinfo xxx.ko: 查看模块信息:作者、参数、license、依赖、符号;
--加载模块时传参/运行时修改模块参数。
二、内核日志打印
1.dmesg: 打印内核环形缓冲区日志,驱动printk输出全部在这里:
--dmesg -w 实时持续打印(驱动热插拔、中断、probe 日志);
--dmesg -l err 只看错误级日志;
--dmesg -c 打印并清空缓冲区。
2.cat /proc/kmsg: 实时内核日志流,比dmesg -w 更底层;
3.logread(OpenWrt/嵌入式小系统): 读取持久化内核日志;
4.日志级别控制。
三、设备、总线、驱动匹配查看(platform/i2c/spi/pcie)
1./proc 虚拟文件系统
--cat /proc/devices: 查看系统注册的主设备号,字符设备 / 块设备列表,判断驱动注册是否成功;
--cat /proc/modules 等价 lsmod;
--cat /proc/interrupts: 查看中断号、中断计数、绑定CPU、设备名,验证中断是否触发;
--cat /proc/iomem: 物理内存资源、寄存器基地址、外设内存区间,核对dts reg地址;
--cat /proc/softirqs: 软中断统计;
--cat /proc/kallsyms: 导出内核全部符号,查找内核函数地址、驱动导出符号 grep xxx_func /proc/kallsyms。
2./sys 文件系统(设备树、驱动、电源、gpio 标准接口)
--ls /sys/bus/platform/devices/: 查看平台设备总线;--ls /sys/bus/i2c/devices/: I2C 总线设备;--ls /sys/bus/spi/devices/: SPI 总线;--cat /sys/bus/platform/devices/xxx_dev/driver: 查看绑定的驱动;--ls /sys/firmware/devicetree/base/: 遍历dts节点;--cat /sys/firmware/devicetree/base/xxx/compatible: 核对匹配字符串;--ls /sys/class/regulator/: 查看时钟、电源域、regulator;--cat /sys/firmware/devicetree/base/xxx-node/compatible: 设备树节点属性查看;--ls /sys/firmware/devicetree/base/: 运行时查看加载后的设备树,遍历节点、compatible、reg、interrupts 等属性,核对 dts 配置是否生效。
--GPIO 操作:
#导出gpio48echo 48 > /sys/class/gpio/export#设置输出高电平echo out > /sys/class/gpio/gpio48/directionecho 1 > /sys/class/gpio/gpio48/value#输入读取电平echo in > /sys/class/gpio/gpio48/directioncat /sys/class/gpio/gpio48/value
四、字符设备/块设备调试
1.ls /dev/: 查看驱动生成设备节点;
2.mknod /dev/xxx c 240 0: 手动创建设备节点(主设备号 240,次设备号 0,字符设备 c);
3.stat /dev/xxx: 查看设备文件主次设备号、权限;
4.读写测试字符设备:
#写数据进驱动echo 123 > /dev/xxx#读取驱动返回数据cat /dev/xxx#二进制读写dd if=/dev/xxx bs=1 count=10
5.块设备:
--lsblk: 列出块设备;--blkid: 查看块设备(磁盘/分区)的底层元数据属性,最主要的是查看UUID(全局唯一标识符)和文件系统类型(TYPE);--cat /sys/block/mmcblk0/size: 读取 mmcblk0(eMMC/SD卡)的总扇区数量;--fdisk -l /dev/mmcblk0: 单独列出 mmcblk0(eMMC/SD卡)的硬件参数、分区表、所有分区(mmcblk0p1/p2/p3…);--fdisk /dev/mmcblk0: 进入交互式分区工具,对整块eMMC、SD卡 /dev/mmcblk0进行,查看、新建、删除、修改分区、修改分区类型、写入分区表等操作;--df -h: disk-free,查看磁盘分区占用、已用、剩余空间、挂载点;-h,human-readable,自动转换成 GB/MB/KB单位。
五、内存、虚拟地址、内核 OOM、栈溢出调试
1.free -h: 内存整体占用;
2.cat /proc/meminfo: 详细内存、DMA、slab分配;
3.vmstat 1 每秒打印内存、IO、中断、上下文切换;
4.slabtop 查看内核 slab 内存泄漏(驱动 kmalloc 未释放);
5.cat /proc/vmallocinfo 查看 vmalloc 分配的虚拟内存区域;
6.echo f > /proc/sysrq-trigger 手动触发 OOM 杀进程(调试内存崩溃);
7.dmesg | grep -i oom 查找内存溢出崩溃日志;
8.cat /proc/self/maps: 用户态虚拟内存映射;
9.cat /proc/vmallocinfo: 内核 vmalloc 分配虚拟区间;
10.cat /proc/iomem: 物理外设内存区间,核对 ioremap 范围。
六、中断、时钟、寄存器读写调试
1.devmem: 寄存器直接读写
#读取0x12340000 32位寄存器
devmem 0x12340000
devmem 0x12340000 32 0x5678
2.ioremap 内核函数,用户层用devmem替代调试寄存器;
3.clk_summary、cat /sys/kernel/debug/clk/clk_summary: 时钟树调试,查看外设时钟开关、分频、频率,排查时钟未使能导致驱动probe失败。
七、网络驱动调试
1.ip addr/ifconfig: 查看网卡设备是否注册成功;
2.ifconfig eth0 192.168.1.1 netmask 255.255.255.0: 配置ip地址;
3.ethtool eth0: 查看网卡驱动、速率、中断、寄存器;
4.mii-tool eth0 PHY基础状态;
5.mdio-tool eth0 0x00直接读写 PHY 寄存器;
6.tcpdump -i eth0: 抓包验证收发驱动;
7.netstat -lntp: 查看所有监听端;
8.ifup eth0/ifdown eth0: 启用eth0设备/关闭eth0设备。
八、串口UART驱动调试
1.stty -F /dev/ttyS0 115200 设置波特率;
2.cat /dev/ttyS0 接收串口数据;
3.echo "test" > /dev/ttyS0 发送数据;
4.minicom/picocom串口终端工具。
5.查看控制台内核指定的串口(内核 console)
cat /proc/cmdline #读取内核参数
例如:console=ttyPS0,115200 noinitrd earlycon=uart8250,mmio32,0xe0023000 root=/dev/mmcblk0p2 rootwait rw
九、CAN驱动调试
ifconfig -a
ip link set can0 down
#设置波特率 125000
ip link set can0 type can bitrate 125000
ip link set can0 up
ip -details link show can0
十、系统崩溃、看门狗、复位调试
1.watchdog 操作硬件看门狗设备 /dev/watchdog;
2.reboot、halt 系统复位,测试驱动注销流程;
3.echo b > /proc/sysrq-trigger 强制重启。
十一、其他
ps
ps aux
#查看占用/dev设备的进程(驱动排错)
lsof /dev/ttyS0
#从地址 192.168.0.51的tftp服务器下载xxx,保存到本地当前目录同名文件
tftp -g -r xxx -l xxx 192.168.0.51
#给可执行文件xxx设置最高权限,所有用户拥有读、写、执行权限
chmod 777 xxx