迅为RK3568开发板内核模块实现-模块加载与卸载
有了内核模块以后,我们要如何使用呢?编译驱动有俩种方式,那 Linux 驱动的运行方式也肯定有俩种。一种就是将驱动编译进内核,这样 Linux 系统启动后会自动运行程序。第二种就是将驱动编译成模块,在 Linux 系统启动以后使用“insmod”命令加载驱动模块。在 上 个 小 节 中 编 译 了 驱 动 模 块 helloworld.ko, 在 RK3568 开 发 板 上 通 过 “ insmodhelloworld.ko”命令可以加载驱动,在加载驱动模块的时候会执行驱动入口的函数,也就是helloworld 程 序 中 的 helloworld_init 函 数 , 所 以 可 以 看 到 打 印 出 来 的 字 符 串 信 息“helloworld_init”。如下图(图 4-10)所示:https://img2024.cnblogs.com/blog/1884655/202505/1884655-20250514103214238-1979084897.jpg如果要卸载 helloworld 内核模块,可以通过“rmmod helloworld”命令来卸载驱动模块,同理在卸载驱动模块的时候会执行驱动出口的函数,所以可以看到驱动出口函数打印出来的字符串信息“helloworld_exit”,如下图(图 4-11)所示:
https://img2024.cnblogs.com/blog/1884655/202505/1884655-20250514103220516-1911804938.jpg加载驱动模块也可以使用 modprobe 命令,它比 insmod 命令更强大,modprobe 命令在加载驱动模块的时候,会同时加载该模块依赖的其他模块。比如 helloworld.ko 依赖 before.ko,使用 insmod 加载的时候,就必须先加载 before.ko,然后在加载 helloworld.ko 才可以加载成功从。但是使用 modprobe 加载的时候,他会自动分析模块的依赖关系,然后将所有的依赖的模块都加载到内核当中。比较“聪明”。
同样,在卸载驱动模块的时候,如果模块存在依赖关系,如果使用 insmod 命令,需要手动卸载依赖的内核模块,但是使用 modprobe 命令可以自动卸载驱动模块所依赖的其他模块。所以,如果驱动模块是以“modprobe helloworld.ko”命令加载的,卸载的时候使用“modprobe-r helloworld.ko”命令卸载。
但是使用 modprobe 卸载存在一个问题,如果所依赖的模块被其他模块所使用,比如刚才例子中的 before.ko 还被其他的模块使用,这时候就不能使用 modprobe 卸载。所以还是推荐使用 rmmod 命令来卸载。
页:
[1]