zoukankan      html  css  js  c++  java
  • linux 内核模块开发相关的文章搜集和模块开发过程中的小技巧

    最近需要开发一些内核模块,进行探究linux内核的一些特征,现在把一些遇到的比较好的文章和知识点,进行简要记录和备忘;

    内核模块开发相关链接:

    内核模块开发过程遇到的知识点:

    • make命令,会隐士调用cc -c 命令,生成.o文件;所以在内核模块的makefile中,可以直接写上:  obj-m += hello_mod.o 
    • 内核模块可以进行传参:insmod module.ko [param1=value param2=value ...] 
    • 内核模块只能访问内核导出的函数和变量;EXPORT_SYMBOL(my_variable); 
    • 想要熟悉内核模块编程,写一个linux设备驱动程序是比较好的学习方法; 
    • 在进行开发linux内核模块的时候,最好下载对应版本的linux内核代码,使用source insight或者vscode工具进行打开进行参考;因为经常内核中的API会改变;你参考别人的针对其他版本开发的代码,编译不通过;
    • 内核模块和内核公用一个地址空间,可以使用所有模块导出的符号表;我们可以使用内存拷贝函数,把用户空间中的一些代码段,拷贝到内核态来完成。

    最简单的内核模块编译示例:

    //必要的头文件
    #include <linux/module.h> // included for all kernel modules
    #include <linux/kernel.h> // include for KERN_INFO
    #include <linux/init.h> // include for __init and __exit macros
    //模块许可证声明(必须)
    MODULE_LICENSE("Dual BSD/GPL"); // 通常使用BSD 和 GPL 双协议
    //声明模块的作者(可选)
    MODULE_AUTHOR("Yaowen Xu");
    MODULE_AUTHOR("YaoXu");
    MODULE_DESCRIPTION("This is a simple example!");
    MODULE_ALIAS("A simplest example");
    //模块加载函数(必须)
    static int hello_init(void)
    {
        printk(KERN_ALERT "Hello World enter/n");
        return 0;
    }
    //模块卸载函数(必须)
    static void hello_exit(void)
    {
        printk(KERN_ALERT "Hello World exit/n");
    }
    //模块的注册
    module_init(hello_init);
    module_exit(hello_exit);
    hello_mod.c
    obj-m += hello_mod.o
    all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
    clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
    Makefile

    编译前需要安装必要编译工具和所需要的文件:

    apt-get install build-essential linux-headers-$(uname -r) 

    保持更新,转载请注明出处;更多内容请关注cnblogs.com/xuyaowen; 如果对您有帮助,请点击推荐~!

  • 相关阅读:
    MFC绘制直角坐标系
    mfc画波形函数
    ciscn_2019_ne_5
    ciscn_2019_n_5
    [ZJCTF 2019]NiZhuanSiWei
    ciscn_2019_n_1
    pwn-100
    2014提高组笔试错题
    BZOJ3211: 花神游历各国
    主席树模板
  • 原文地址:https://www.cnblogs.com/xuyaowen/p/dev-linux-kernel-modules.html
Copyright © 2011-2022 走看看