• Linux设备驱动程序 之 装载和卸载模块


    前置说明

    本文例子中涉及两个模块hello.ko和world.ko,其中hello导出符号供world使用;

    insmod

    该命令将模块的代码和数据装入内核,然后使用内核的符号表继续模块中任何未解析的符号。insmod不会修改模块的磁盘文件,而仅仅修改内存中的副本。insmod可以接受一些命令行选项,并且可以再模块链接到内核之前给模块中的整数和字符串变量赋值。

    按照顺序加载,通过;

    1 [root@localhost export]# insmod hello.ko
    2 [root@localhost export]# insmod world.ko

    先加载world.ko,不通过,因为world找不到从a中引用的符号;

    1 [root@localhost export]# insmod world.ko 
    2 insmod: ERROR: could not insert module world.ko: Unknown symbol in module
    modprobe

    与insmod类型,modprobe也用来将模块装入内核,区别在于,modprobe会考虑要加载的模块是否引用了一些当前内核中不存在的符号,如果有这类引用,modprobe会在当前模块搜索路径中查找定义了这些符号的其他模块,如果找到了这些依赖模块,它会同时将这些模块也装载到内核。这种情况下使用insmod会失败,并在系统日志文件中记录”unresolved symbols”消息;

    在使用modprobe时,在配置文件中加入 modules_install行和clean行;

     1 ifneq ($(KERNELRELEASE),)
     2         obj-m :=hello.o world.o
     3 #       module-objs := file1.o file2.o
     4 else
     5         KERNELDIR ?=/lib/modules/$(shell uname -r)/build
     6         PWD :=$(shell pwd)
     7 default:
     8         $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
     9         $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
    10 clean:
    11         rm -rf *.o *.mod.c *.ko *.symvers *.order *.makers
    12         $(MAKE) -C $(KERNELDIR) M=$(PWD) clean
    13 endif

    加载模块world,成功;

    1 [root@localhost export]# modprobe world

    lsmod查看,可见依赖的模块hello也被加载进内核;

    1 [root@localhost export]# lsmod
    2 Module                  Size  Used by
    3 world                  16384  0 
    4 hello                  16384  1 world
    rmmod

    rmmod用于从内核中移除模块;如果内核模块仍然在使用状态,或者内核被配置为禁止移除模块,则无法移除该模块;配置内核并支持在模块忙的时候仍能移除模块是可能的;但是,重新引导系统是更合适的办法;

    先移除world.ko,再移除hello.ko,成功;

    [root@localhost export]# rmmod world.ko 
    [root@localhost export]# rmmod hello.ko

    先移除模块hello.ko,产生错误,因为hello在被world使用;

    1 [root@localhost export]# rmmod hello.ko
    2 rmmod: ERROR: Module hello is in use by: world
    lsmod

    lsmod用于列出当前装载到内核中的所有模块,包括一些其他信息,其通过读取/proc/modules来获取这些信息;

    1 [root@localhost export]# lsmod
    2 Module                  Size  Used by
    3 world                  16384  0 
    4 hello                  16384  1 world
  • 相关阅读:
    Lyndon Word & The Runs Theorem
    Codeforces 1477F. Nezzar and Chocolate Bars
    Codeforces Round #700 (Div.1)
    kubeadm 安装 k8s
    centos7更新阿里yum源
    CF1186 F. Vus the Cossack and a Graph
    CF1152 D. Neko and Aki's Prank
    CF803 C. Maximal GCD
    CF1180 B. Nick and Array
    CF1186 D. Vus the Cossack and Numbers
  • 原文地址:https://www.cnblogs.com/wanpengcoder/p/11755850.html
Copyright © 2020-2023  润新知