转载自:http://blog.chinaunix.net/uid-20729583-id-1884553.html

这 些宏包括 __init、__initdata、__initfunc()、asmlinkage、ENTRY()、FASTCALL()等等。它们的定义主要位于 Include/linux/linkage.h和 include/asm-i386/Init.h以及其他一些.h文件中。

1) __init位置:include/asm-i386/Init.h

定义:#define __init __attribute__ ((__section__ (".text.init")))

注释:这个标志符和函数声明放在一起,表示gcc编译器在编译的时候需要把这个函数放.text.init section中,而这个section在内核完成初始化之后,会被释放掉。

举例:asmlinkage void __init start_kernel(void){...}

2) __initdata

位置:include/asm-i386/Init.h

定义:#define __initdata __attribute__ ((__section__ (".data.init")))

注释:这个标志符和变量声明放在一起,表示gcc编译器在编译的时候需要把这个变量放在.data.init section中,而这个section在内核完成初始化之后,会被释放掉。

举例:static struct kernel_param raw_params[] __initdata = {....}

3) __initfunc()

位置:include/asm-i386/Init.h

定义: #define __initfunc(__arginit) \

__arginit __init; \

__arginit

注释: 这个宏用来定义一个 __init 函数。

举例: __initfunc(void mem_init(unsigned long start_mem, unsigned long e

nd_mem)) {....}

4) asmlinkage

位置:Include/linux/linkage.h

定义:#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))

注释:这个标志符和函数声明放在一起,告诉gcc编译器该函数不需要通过任何寄存器来传递参数,参数只是通过堆栈来传递。

举例:asmlinkage void __init start_kernel(void){...}

5) ENTRY()

位置:Include/linux/linkage.h

定义: #define ENTRY(name) \

.globl SYMBOL_NAME(name); \

ALIGN; \

SYMBOL_NAME_LABEL(name)

注释: 将name声明为全局,对齐,并定义为标号。

举例: ENTRY(swapper_pg_dir)

.long 0x00102007

.fill __USER_PGD_PTRS-1,4,0

/* default: 767 entries */

.long 0x00102007

/* default: 255 entries */

.fill __KERNEL_PGD_PTRS-1,4,0

等价于

.globl swapper_pg_dir

.align 16,0x90

/* if i486+ */

swapper_pg_dir:

.long 0x00102007

.fill __USER_PGD_PTRS-1,4,0

/* default: 767 entries */

.long 0x00102007

/* default: 255 entries */

.fill __KERNEL_PGD_PTRS-1,4,0

6) FASTCALL()

位置:Include/linux/kernel.h

定义:#define FASTCALL(x) x __attribute__((regparm(3)))

注释:这个标志符和函数声明放在一起,带regparm(3)的属性声明告诉gcc编译器这个函数可以通过寄存器传递多达3个的参数,这3个寄存器依次为EAX、EDX 和 ECX。更多的参数才通过堆栈传递。这样可以减少一些入栈出栈操作,因此调用比较快。

举例:extern void FASTCALL(__switch_to(struct task_struct *prev, struct t

ask_struct *next));

这个例子中,prev将通过eax,next通过edx传递。

【转载】Linux i386+源码中常见宏标识tag的定义的更多相关文章

  1. linux内核源码中常见宏定义

    http://blog.csdn.net/yangdelong/article/details/5508057

  2. 盘点Linux内核源码中使用宏定义的若干技巧(1)

    http://blog.chinaunix.net/uid-23769728-id-3141515.html

  3. linux内核源码中两个重要的宏

    转载:http://www.cnblogs.com/skywang12345/p/3562146.html 倘若你查看过Linux Kernel的源码,那么你对 offsetof 和 containe ...

  4. Linux内核源码中的likely和unlikely释疑【转】

    本文转载自:https://my.oschina.net/armsky/blog/15320 ikely()与unlikely()在2.6内核中,随处可见,那为什么要用它们?它们之间有什么区别呢? 首 ...

  5. Linux 内核源码中likely()和unlikely()【转】

    本文转载自:http://blog.csdn.net/tigerjibo/article/details/8279183 ikely()与unlikely()在2.6内核中,随处可见,那为什么要用它们 ...

  6. Linux 内核源码中likely()和unlikely()

    ikely()与unlikely()在2.6内核中,随处可见,那为什么要用它们?它们之间有什么区别呢? 首先明确: if (likely(value))等价于if (value)if (likely( ...

  7. linux 内核源代码情景分析——linux 内核源码中的汇编语言代码

    1. 用汇编语言编写部分核心代码的原因: ① 操作系统内核中的底层程序直接与硬件打交道,需要用到一些专用的指令,而这些指令在C语言中并无对应的语言成分: ② CPU中的一些特殊指令也没有对应的C语言成 ...

  8. 如何单独编译Linux内核源码中的驱动为可加载模块?

    答: 分为两步: 1. 配置某个驱动为模块(如: CONFIG_RTC_XXX=m) 2. 指定路径并编译, 如编译drivers/rtc中的驱动 make SUBDIRS=drivers/rtc m ...

  9. Linux内核源码特殊用法

    崇拜并且转载的: http://ilinuxkernel.com/files/5/Linux_Kernel_Source_Code.htm Linux内核源码特殊用法 1 前言 Linux内核源码主要 ...

随机推荐

  1. Redis info参数总结(转)

    Redis官网对 info 已经讲解的比较清楚的,参考文档 . 可以看到,info的输出结果是分几块的,有Servers.Clients.Memory等等,通过info后面接这些参数,可以指定输出某一 ...

  2. Visual Studio 2012完美的拥抱GitHub

    详情请查看http://www.aehyok.com/Blog/Detail/73.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链 ...

  3. 报错:ASP.NET Web API中找不到与请求匹配的HTTP资源

    当发出GET请求: GET http://localhost:54176/api/Products 报如下错: {  "message": "找不到与请求 URI“htt ...

  4. GTD时间管理(3)---梳理总结

    一:收集箱   1:灵感和想法 2:交代事情 3:任何困扰你的事     二:清单容器     1:通过行动性和非行动性原则 2:通过2分钟原则 3:通过人员性质原则  三:组织 (人,事,时 的组合 ...

  5. 【Vegas原创】RHEL6.2安装vmtools

    1,mount虚拟cdrom       # mount /dev/cdrom /mnt/cdrom   2, ls一下,看有没有      # cd /mnt/cdrom     # ls –l   ...

  6. 将复杂form表单序列化serialize-object.js

    <form class="form-horizontal" role="form" id="myform" action=" ...

  7. Codeforces Round #382 (Div. 2) A. Ostap and Grasshopper bfs

    A. Ostap and Grasshopper 题面 On the way to Rio de Janeiro Ostap kills time playing with a grasshopper ...

  8. 画六边形-mat

    %% theta = linspace(0,2*pi,7); D=2; %边长 X=1; %中心横坐标 Y=2; %中心纵坐标 plot(D*cos(theta)+X,D*sin(theta) + Y ...

  9. android 抓包 使用 tcpdmp + Wireshark

         下载地址tcpdump: http://www.androidtcpdump.com/      使用su用户, 给/system/可写的权限 mount -o remount,rw -t ...

  10. Swift 3 新特性

    原文:What's New in Swift 3? ,作者:Ben Morrow,译者:kmyhy Swift 3将于今年下半年推出,为Swift开发者们带来了很多核心代码的改变.如果你没有关注过 S ...