首页主机资讯Linux驱动如何进行设备注销

Linux驱动如何进行设备注销

时间2025-12-18 14:39:03发布访客分类主机资讯浏览457
导读:Linux驱动设备注销实战指南 一、通用原则与清理顺序 按“注册的逆序”进行注销:先清理用户态可见与占用资源,再撤销内核对象,最后释放内存与设备号。 典型顺序: 停止设备并禁止新的打开:如关闭文件操作、停止队列、注销中断/工作队列。 撤...

Linux驱动设备注销实战指南

一、通用原则与清理顺序

  • 按“注册的逆序”进行注销:先清理用户态可见与占用资源,再撤销内核对象,最后释放内存与设备号。
  • 典型顺序:
    1. 停止设备并禁止新的打开:如关闭文件操作、停止队列、注销中断/工作队列。
    2. 撤销内核对象:字符设备用 cdev_del、网络设备用 unregister_netdev、平台驱动用 platform_driver_unregister 等。
    3. 释放设备号:如 unregister_chrdev_region
    4. 释放驱动私有数据:如 kfree(priv)
    5. 模块卸载:在 module_exit 中完成上述清理,确保无进程占用再返回。
  • 模块级配对:用 module_init/__init 注册入口,module_exit/__exit 注册出口,确保加载/卸载对称。

二、按设备类型的注销要点与示例

  • 字符设备(经典接口)
    • 注销函数:unregister_chrdev(unsigned int major, const char *name);与注册时的 major/name 一致。
    • 注意:经典接口一次注册会占用该主设备号下的256 个次设备号;注销前确保无进程打开设备。
    • 示例:
      • 注册:major = register_chrdev(200, “chrtest”, & fops);
      • 注销:unregister_chrdev(200, “chrtest”);
  • 字符设备(cdev 接口,Linux 2.6+ 推荐)
    • 注销步骤:先 cdev_del(& cdev),再 unregister_chrdev_region(dev_t first, count)
    • 示例:
      • 注册:alloc_chrdev_region(& dev, 0, 1, “mydev”); cdev_init(& cdev, & fops); cdev_add(& cdev, dev, 1);
      • 注销:cdev_del(& cdev); unregister_chrdev_region(dev, 1);
  • 网络设备
    • 注销函数:unregister_netdev(struct net_device *dev);内部会先关闭设备、回滚注册,并在 rtnl_unlock 时由 netdev_run_todo 等待引用计数清零后完成最终清理。
    • 典型路径:驱动 removeunregister_netdev → (必要时)释放 net_device 资源。
  • 平台驱动
    • 注销函数:platform_driver_unregister(& drv);与 platform_driver_register 配对使用,通常在模块退出中调用。

三、模块级注销与用户态配合

  • 模块卸载命令:使用 rmmod < module.ko> 卸载;若模块有依赖,可用 modprobe -r 一并清理依赖(前提是无其他使用者)。
  • 用户态节点:经典字符设备接口不会自动创建设备节点,需手动用 mknod /dev/xxx c 创建;卸载后可用 rm /dev/xxx 删除节点(或由 udev 规则清理)。

四、常见陷阱与排查

  • 设备忙无法卸载:说明仍有进程持有文件描述符或内核引用。可通过 lsof | grep 查找占用进程,或在代码中确保已停止队列/中断并等待工作完成后再注销。
  • 网络接口卡在“正在卸载”:通常是引用未清零。检查是否有 netif_running 未关闭、内核线程/定时器未停止、netlink/rtnl 未释放等,必要时在 remove 中先 netif_device_detach 并等待引用释放。
  • 重复注销或释放:对同一对象多次 cdev_del/unregister_netdev 会触发内核告警或崩溃;在 module_exit 中使用 guard 标志位或 IS_ERR_OR_NULL 判断,保证只清理一次。
  • 设备号泄漏:忘记 unregister_chrdev_region 会导致后续分配失败;在模块退出路径中务必成对释放。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Linux驱动如何进行设备注销
本文地址: https://pptw.com/jishu/775107.html
Linux驱动如何实现设备驱动模型 如何在Linux中调整GIMP图像大小

游客 回复需填写必要信息