NOTE: Linux设备驱动开发详解:基于最新的Linux 4.0内核(宋宝华)

1. Linux内核组成部分:

  • 进程调度
  • 内存管理(0~3G用户空间,3~4G内核空间)
  • 虚拟文件系统
  • 网络接口(分为网络协议和网络驱动)
  • 进程间通信(信号量、共享内存、消息队列、管道、UNIX套接字等)

2. 内核模块:

  • 模块加载/卸载函数:
    #include <linux/init.h>
    #include <linux/module.h>
    
    /*
    #define __init __attribute__((__section__(".init.text")))
    内核中加载模块函数:request_module(const char *fmt, ...)
    */
    
    /*
    模块参数:module_param(参数名,参数类型,参数读/写权限)
    模块参数数组:module_param_array(数组名,数组类型,数组长,参数读/写权限)
    
    用户可以向模块传递参数:insmode(或modprobe) 模块名 参数名=参数值
    如果模块被内置,就无法insmod,但是可以通过bootloader在bootargs里设置"模块名.参数名=值"
    参数类型:byte short ushort int uint long ulong charp(字符指针) bool/invbool(布尔的反)
    模块被加载后,/sys/module/目录下将出现以此模块命名的目录
    */
    
    static char *book_name = "Linux Device Driver";
    module_param(book_name, charp, S_IRUGO);
    
    static int book_num = 4000;
    module_param(book_num, int, S_IRUGO);
    
    static int g_init_data __initdata = 1;
    static int __init func_init(void)
    {
        printf(KERN_INFO"func_init:%d\n", g_init_data);
        printf(KERN_INFO"book_name:%s\n", book_name);
        printf(KERN_INFO"book_num:%d\n", book_num);
        return 0;
    }
    module_init(func_init);
    
    static int g_exit_data __exitdata = 2;
    static void __exit func_exit(void)
    {
        printf(KERN_INFO"func_exit:%d\n", g_exit_data);
    }
    module_exit(func_exit);
    
    MODULE_AUTHOR(“Linuxer”);
    MODULE_LICENSE("GPL v2");
    MODULE_DESCRIPTION("Module for testing");
    MODULE_VERSION("V1.0");
    
    
    
  •  

猜你喜欢

转载自blog.csdn.net/findmu/article/details/89183602