XXX_initcall()函数分析

1. 先看这些宏的定义(定义在文件include/linux/init.h中)

 1 #define pure_initcall(fn)                __define_initcall("0",fn,0)
 2 #define core_initcall(fn)                __define_initcall("1",fn,1)
 3 #define core_initcall_sync(fn)        __define_initcall("1s",fn,1s)
 4 #define postcore_initcall(fn)        __define_initcall("2",fn,2)
 5 #define postcore_initcall_sync(fn)    __define_initcall("2s",fn,2s)
 6 #define arch_initcall(fn)                __define_initcall("3",fn,3)
 7 #define arch_initcall_sync(fn)        __define_initcall("3s",fn,3s)
 8 #define subsys_initcall(fn)        __define_initcall("4",fn,4)
 9 #define subsys_initcall_sync(fn)    __define_initcall("4s",fn,4s)
10 #define fs_initcall(fn)            __define_initcall("5",fn,5)
11 #define fs_initcall_sync(fn)        __define_initcall("5s",fn,5s)
12 #define rootfs_initcall(fn)        __define_initcall("rootfs",fn,rootfs)
13 #define device_initcall(fn)        __define_initcall("6",fn,6)
14 #define device_initcall_sync(fn)    __define_initcall("6s",fn,6s)
15 #define late_initcall(fn)                __define_initcall("7",fn,7)
16 #define late_initcall_sync(fn)        __define_initcall("7s",fn,7s)

initcall

2. __define_initcall

/* 初始化调用函数依据功能分组成独立的子段,这些字段的内部排列顺序由链接顺序决定 */

/* 为了向后的兼容性,initcall()放置这些函数在器件的初始化字段 */

/* __define_initcall 中 id 这个参数是必要的,这样多个initcalls可以同时指向同一个handler */

1 #define __define_initcall(level,fn,id) 2     static initcall_t __initcall_##fn##id __used 3     __attribute__((__section__(".initcall" level ".init"))) = fn

__define_initcall

其中initcall_t是函数指针,原型如下

1 typedef int (*initcall_t)(void);

而属性 __attribute__((__section__())) 则表示把对象放在一个这个由括号中的名称所指代的section中。

所以__define_initcall的含义是:

1) 声明一个名称为__initcall_##fn##id 的函数指针;

2) 将这个函数指针指向传入的函数名fn;

3) 编译的时候需要把这个函数指针变量放置到名称为 ".initcall" level ".init"的section中。

时间: 2024-10-05 23:09:54

XXX_initcall()函数分析的相关文章

linux C函数之strdup函数分析

一.函数分析 1.函数原型: #include <string.h>char *strdup(const char *s); 2.功能: strdup()函数主要是拷贝字符串s的一个副本,由函数返回值返回,这个副本有自己的内存空间,和s没有关联.strdup函数复制一个字符串,使用完后,要使用delete函数删除在函数中动态申请的内存,strdup函数的参数不能为NULL,一旦为NULL,就会报段错误,因为该函数包括了strlen函数,而该函数参数不能是NULL. 3.strdup函数实现 c

如何验证一个地址可否使用—— MmIsAddressValid函数分析

又是一篇内核函数分析的博文,我个人觉得Windows的内核是最好的老师,当你想实现一个功能之前可以看看Windows内核是怎么做的,说不定就有灵感呢:) 首先看下官方的注释说明: /*++ Routine Description: For a given virtual address this function returns TRUE if no page fault will occur for a read operation on the address, FALSE otherwis

page_address()函数分析--如何通过page取得虚拟地址

由于X86平台上面,内存是划分为低端内存和高端内存的,所以在两个区域内的page查找对应的虚拟地址是不一样的. 一. x86上关于page_address()函数的定义 在include/linux/mm.h里面,有对page_address()函数的三种宏定义,主要依赖于不同的平台: 首先来看看几个宏的定义:CONFIG_HIGHMEM:顾名思义,就是是否支持高端内存,可以查看config文件,一般推荐内存超过896M的时候,才配置为支持高端内存.WANT_PAGE_VIRTUAL:X86平台

Oracle官网JNI简介和接口函数分析

第一章 概述 本章主要介绍JNI(Java Native Interface),JNI是一种本地编程接口.它允许运行在JAVA虚拟机中的JAVA代码和用其他编程语言,诸如C语言.C++.汇编,写的应用和库之间的交互操作. JNI的最大优势在于没有强加任何限制在JAVA虚拟机的下层实现上,因此,JAVA虚拟机供应商能够提供JNI的支持而不影响虚拟机的其他部分,程序员只需写出一个版本的本地应用和库,就可使之运行在一切支持JNI的JAVA虚拟机上. 本章包含了以下的要点: ? JNI概述 ? 目标 ?

linux 内核移植(七)——rest_init函数分析

代码在start_kernel函数运行的最后到了rest_init()函数中 1:rest_init()函数分析 (1)rest_init中调用kernel_thread函数启动了2个内核线程,分别是:kernel_init和kthreadd (2)调用schedule函数开启了内核的调度系统,从此linux系统开始转起来了. (3)rest_init最终调用cpu_idle函数结束了整个内核的启动.也就是说linux内核最终结束了一个函数cpu_idle.这个函数里面肯定是死循环. (4)简单

如何验证一个地址可否使用——MmIsAddressValid函数分析

又是一篇内核函数分析的博文,我个人觉得Windows的内核是最好的老师,当你想实现一个功能之前可以看看Windows内核是怎么做的,说不定就有灵感呢:) 首先看下官方的注释说明: /*++ Routine Description: For a given virtual address this function returns TRUE if no page fault will occur for a read operation on the address, FALSE otherwis

Linux-0.11内核内存管理get_free_page()函数分析

/* *Author : DavidLin*Date : 2014-11-11pm*Email : [email protected] or [email protected]*world : the city of SZ, in China*Ver : 000.000.001*history : editor time do 1)LinPeng 2014-11-11 created this file! 2)*/Linux-0.11内存管理模块是源代码中比较难以理解的部分,现在把笔者个人的理解

Linux-0.11内核源代码分析系列:内存管理get_free_page()函数分析

Linux-0.11内存管理模块是源码中比較难以理解的部分,如今把笔者个人的理解发表 先发Linux-0.11内核内存管理get_free_page()函数分析 有时间再写其它函数或者文件的:) /*  *Author  : DavidLin  *Date    : 2014-11-11pm  *Email   : [email protected] or [email protected]  *world   : the city of SZ, in China  *Ver     : 000

string函数分析

string函数分析string函数包含在string.c文件中,经常被C文件使用.1. strcpy函数原型: char* strcpy(char* str1,char* str2);函数功能: 把str2指向的字符串拷贝到str1中去函数返回: 返回str1,即指向str1的指针 /** * strcpy - Copy a %NUL terminated string * @dest: Where to copy the string to * @src: Where to copy the