zoukankan      html  css  js  c++  java
  • linux初始化和关停

    如已提到的, 模块初始化函数注册模块提供的任何功能. 这些功能, 我们指的是新功能, 可以由应用程序存取的或者一整个驱动或者一个新软件抽象. 实际的初始化函数定义常常 如:

    static int   init initialization_function(void)

    {

    /* Initialization code here */

    }

    module_init(initialization_function);

    初始化函数应当声明成静态的, 因为它们不会在特定文件之外可见; 没有硬性规定这个, 然而, 因为没有函数能输出给内核其他部分, 除非明确请求. 声明中的 init 标志可能 看起来有点怪; 它是一个给内核的暗示, 给定的函数只是在初始化使用. 模块加载者在模 块加载后会丢掉这个初始化函数, 使它的内存可做其他用途. 一个类似的标签

    ( initdata) 给只在初始化时用的数据. 使用 init 和 initdata 是可选的, 但是它 带来的麻烦是值得的. 只是要确认不要用在那些在初始化完成后还使用的函数(或者数据结 构)上. 你可能还会遇到 devinit 和 devinitdata 在内核源码里; 这些只在内核没有 配置支持 hotplug 设备时转换成 init 和 _initdata. 我们会在 14 章谈论 hotplug 支持.

    使用 moudle_init 是强制的. 这个宏定义增加了特别的段到模块目标代码中, 表明在哪里 找到模块的初始化函数. 没有这个定义, 你的初始化函数不会被调用.

    模块可以注册许多的不同设施, 包括不同类型的设备, 文件系统, 加密转换, 以及更多. 对每一个设施, 有一个特定的内核函数来完成这个注册. 传给内核注册函数的参数常常是 一些数据结构的指针, 描述新设施以及要注册的新设施的名子. 数据结构常常包含模块函 数指针, 模块中的函数就是这样被调用的.

    能够注册的项目远远超出第 1 章中提到的设备类型列表. 它们包括, 其他的, 串口, 多样 设备, sysfs 入口, /proc 文件, 执行域, 链路规程. 这些可注册项的大部分都支持不直 接和硬件相关的函数, 但是处于"软件抽象"区域里. 这些项可以注册, 是因为它们以各种 方式(例如象 /proc 文件和链路规程)集成在驱动的功能中.

    对某些驱动有其他的设施可以注册作为补充, 但它们的使用太特别, 所以不值得讨论它们. 它们使用堆叠技术, 在"内核符号表"一节中讲过. 如果你想深入探求, 你可以在内核源码 里查找 EXPORT_SYMBOL , 找到由不同驱动提供的入口点. 大部分注册函数以 register_ 做前缀, 因此找到它们的另外一个方法是在内核源码里查找 register_ .

  • 相关阅读:
    添加到path的作用
    java post格式发送application/x-www-form-urlencoded
    c# 获取本机ip
    Winform学习(八)——使用setup打包程序
    kubernetes 核心技术-ingress
    ExceptionHandler的执行顺序
    cookie、session、token、jwt详解与sso基本实现原理
    java函数式编程及JDK常用函数式接口
    vue饼图
    vue动态页签
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11138387.html
Copyright © 2011-2022 走看看