• linux驱动之入口


    以module_init(Demo_init);为例

    定义文件:

    includelinuxinit.h

    #define module_init(x) __initcall(x);

    #define __initcall(fn) device_initcall(fn)

    #define device_initcall(fn) __define_initcall("6",fn,6)

    #define __define_initcall(level,fn,id)
    static initcall_t __initcall_##fn##id __attribute_used__
    __attribute__((__section__(".initcall" level ".init"))) = fn

    展开为

    static initcall_t __initcall_Demo_init6 __attribute_used__ __attribute__((__section__(".initcall6.init"))) = Demo_init;

    typedef int (*initcall_t)(void);

    这里

    typedef int (init_fnc_t)  (void); 定义一种函数类型
    typedef int (*init_fnc_t) (void); 定义一种类型的函数指针

    所以展开的宏定义就是定义名为__initcall_Demo_init6的函数指针

    属性有两个:

    1.

      在gcc 3.4之前的编译器被展开成__attribute__((unused))来禁止编译器弹出有关函数没有被用到的的警告信息

      在gcc 3.4之后被展开成__attribute__((used))功能一样

    2.加载到段.initcall6.init,其地址为Demo_init的地址

      段的分布顺序在链接脚本中有

    编译内核后,会有vmlinux.lds的打印信息,里面有各段位置

    __initcall_start = .;

    *(.initcallearly.init) __early_initcall_end = .;

    *(.initcall0.init)

    *(.initcall0s.init)

    *(.initcall1.init)

    *(.initcall1s.init)

    *(.initcall2.init)

    *(.initcall2s.init)

    *(.initcall3.init)

    *(.initcall3s.init)

    *(.initcall4.init)

    *(.initcall4s.init)

    *(.initcall5.init)

    *(.initcall5s.init)

    *(.initcallrootfs.init)

    *(.initcall6.init)

    *(.initcall6s.init)

    *(.initcall7.init)

    *(.initcall7s.init)

    __initcall_end = .;

    当insmod的时候,内核从initcall6.init段中读取到驱动入口地址,然后跳转到该地址去执行入口函数,

    一般入口函数会进行注册驱动,例如

    register_chrdev(unsigned int major, const char * name, const struct file_operations * fops)

    usb_register(struct usb_driver * driver)

    spi_register_driver(struct spi_driver * sdrv)

    等等注册函数,再依次调用相应设备结构体中的ioctl或者直接调用file_operations结构体

  • 相关阅读:
    接口的显式实现和隐式实现
    MVC
    委托
    测试用例(TestCase)
    The remote server returned an error: NotFound.
    事件
    WCF大数据量传输配置
    多态随笔
    领域模型(domain model)
    IQueryable接口和IEnumberable接口
  • 原文地址:https://www.cnblogs.com/pokerface/p/6379860.html
Copyright © 2020-2023  润新知