zoukankan      html  css  js  c++  java
  • linux内核模块

    本文是我迭代学习的笔记,不保证内容的严谨性。

    目录

    1.linux内核模块简介
    2.linux内核模块示例
    3.内核模块加载/卸载原理

    1. linux内核模块简介

    由于linux内核需要支持多种功能模块或者硬件设备,而这些功能模块或者硬件设备在不同板子上千差万别。受存储空间的限制,不可能把linux支持所有设备的驱动一下全编译进去,所以linux提供了一种动态加载模块的方法linux内核模块(Linux Kernel Module,LKM)。编译的内核首先只包含满足基本需求的模块,各种设备的驱动均可在内核运行起来后,通过应用层按用户需求由用户自行决定要加载的内核模块和加载时间。

    2. linux内核模块示例

    #include <linux/init.h>
    #include <linux/module.h>
    
    
    //模块参数
    static int hello_parament = 4000;	//默认值
    module_param(hello_parament, int, S_IRUGO);
    
    //符号导出
    EXPORT_SYMBOL(hello_export_fun);
    void hello_export_fun(void)
    {
    	do something;
    }
    
    //加载函数
    static int __init hello_init(void)
    {
    	printk(KERN_INFO "Hello World enter
    ");
    	return 0;
    }
    module_init(hello_init);
    
    //卸载函数
    static void __exit hello_exit(void)
    {
    	printk(KERN_INFO "Hello World exit
     ");
    }
    module_exit(hello_exit);
    

    编译的Makefile

    KVERS = $(shell uname -r)
    
    # Kernel modules
    obj-m += hello.o
    
    # Specify flags for the module compilation.
    #EXTRA_CFLAGS=-g -O0
    
    build: kernel_modules
    
    kernel_modules:
    	make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules
    
    clean:
    	make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
    
    

    编译完成,得到hello.ko文件,此文件就是内核模块文件。

    ├── hello.c
    ├── hello.ko
    ├── hello.mod.c
    ├── hello.mod.o
    ├── hello.o
    ├── Makefile
    ├── modules.order
    └── Module.symvers
    
    0 directories, 8 files
    

    insmod(安装 LKM),rmmod (删除 LKM),modprobe(insmod 和 rmmod 的包装器),depmod(用于创建模块依赖项),以及 modinfo(用于为模块宏查找值)。

    使用insmod hello.ko加载模块,rmmod hello卸载模块,通过dmesg查看内核打印,可以看到分别加载模块和卸载模块时的打印信息。

    sudo insmod hello.ko
    sudo rmmod hello.ko
    
    dmesg
    ...
    ...
    [24283.807671] Hello World enter
    [24289.517281] Hello World exit
    

    内核模块参数就只指在insmod的时候可以由用户传递一个参数下去给内核模块,内核模块符号的导出指加载内核模块后,其他内核模块可以看得到此模块导出的符号,可以进行调用。

    3. 内核模块加载/卸载原理

    https://www.ibm.com/developerworks/cn/linux/l-lkm/index.html

  • 相关阅读:
    web Function函数
    web语言发展史
    用户正则
    字符串替换
    css单位
    JavaScript DOM&BOM
    css颜色的设置
    pseudo-class与pseudo-element的不同点与相同点
    对css语法中position值的理解
    API
  • 原文地址:https://www.cnblogs.com/thammer/p/12539414.html
Copyright © 2011-2022 走看看