我正在将 USB 设备的驱动程序移植到 Rocky Linux 9.3。插入模块后,通过 ssh 进行的新登录将无响应。将模块列入黑名单并重新启动即可恢复正常功能。
https://github.com/izot/lon-driver
插入模块后,lsmod|grep u50“Used By”大约每 7 秒从 0 变为 1。然后,当尝试 SSH 登录时,“使用者”将介于 3 和 2 之间。
停止 SSH 登录,modprobe -r u50,重试...现在 SSH 收到 motd 但没有提示,并显示“PTY 分配请求在通道 0 上失败”。
ssh SITE "/bin/bash -i" (登录成功) (与插入模块相同)
模组信息u50
filename: /lib/modules/5.14.0-362.18.1.el9_3.x86_64/kernel/drivers/lon/u50.ko
description: U50 SMIP Driver 1.4 L2
alias: tty-ldisc-28
license: GPL
rhelversion: 9.3
srcversion: 311B898EC0CC268466EA85B
depends:
retpoline: Y
name: u50
vermagic: 5.14.0-362.18.1.el9_3.x86_64 SMP preempt mod_unload modversions
删除模块后,journalctl 显示“错误:openpty:无法分配内存”和“错误:session_pty_req:会话 0 分配失败”。
再次插入模块并尝试 SSH 后,journalctl 显示“NetworkManager ... manager: (lon10): new Generic device (/org/freedesktop/NetworkManager/Devices/743)”和“NetworkManager ... manager: (lon11)” :新的通用设备(/org/freedesktop/NetworkManager/Devices/744)。”
当 SSH 尝试被取消时,journalctl 会显示两次“正在删除未添加的网络设备”。
我终于设置好了 gdb 来进行远程调试。我将 src 复制到了运行 gdb 的主机。我可以在可加载模块中的某个函数处中断,但为时已晚。我需要在模块加载时中断,它会终止新的 ssh 登录。此模块用于 USB,与 ssh 无关。
我可以在 do_init_module() 处中断并逐步执行,直到 exit_to_user_mode_loop() 然后它显示“无法找到当前函数的边界”。在 module_init() 处设置断点以供将来加载不会中断。
答案1
我没有正确移植这一行,并且无法在 struct tty_ldisc_ops 中设置 .num 字段。
//FIXME err = tty_register_ldisc(N_U50, &u50_ldisc);
err = tty_register_ldisc(&u50_ldisc);
我的问题的另一部分(在 module_init() 处中断)是通过在 rtnl_link_register() 中设置断点来解决的。