热门关键字:  ubuntu  分区  Fedora  linux系统进程  函数

当前位置 :| 主页>Linux教程>内核研究>

__attribute__之regparm

来源: 作者: 时间:2008-10-17 Tag: 点击:
    在阅读Linux内核源代码的时候,发现start_kernel函数定义的最前面是一个asmlinkage.虽知它是GNU
C的扩展,但并不知其意.所以决定对其做一些研究.
    i386的linkage.h里有这样的宏定义:
    #define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
    CPP_ASMLINKAGE我们暂时不管,只看asmlinkage,它的主要起作用的部分是__attribute__,它在内核
代码里随外可见,我想应该是对GNU编译器的一种指示操作.
    在说明__attribute__((regparm(0))用处之前,我们先来看看程序在调用时的参数传递.
    不同的硬件平台在默认情况下,参数调用时的参数传递机制是不一样的.如MIPS,SH4等精简指令处理器在进
行子程序调用时先从寄存器里取得前几个参数,至于是几个视硬件平台而定.如SH4默认就是使用r4,r5,r6,r7作
为前四个整参数的传递寄存器,同时用fr4~fr11传递前四个浮点参数,其他参数都压入栈.当然关于SH4的参数传
递还有更多的细节,这里就不多说.而在i386平台上,函数的调用是基于栈的,也就是说,默认情况下,编译器在进行
函数编译的时候会从栈里取得函数体需要使用的参数,而不是寄存器.
    然而,参数直接从寄存器里取而不是从栈里取,前者相对来说速度要快,所以在linkage.h里也有这样的定义:
    #define fastcall __attribute__((regparm(3)))
    意思是,最多可以使用3个寄存器(或许是eax,edx,ecx)来传送前3个参数,其他参数则压入栈中,那么
    #define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
    的意思就是使用0个寄存器来进行参数传递,顾名思义它是想使得调用这个函数时的所有参数都压入栈中,相
对于fastcall的使用方式当然是要慢一些了.



相关文章:
精通initramfs构建step by step
Linux利用kexec迅速切换内核
进程上下文VS中断上下文
内核通知链 学习笔记
linux spi子系统驱动分析
menuconfig 配置选项
《Linux操作系统内核实习》之练习一
udev详解
什么叫微内核,宏内核?
Linux 信号signal处理机制
开发简单的 Linux2.6 内核模块
删除内核的perl脚本
Linux2.6内核usb gadget驱动移植
GCC hacks in the Linux kernel
iomem
kernel学习的想法
让自己的驱动支持udev
linux内核编译步骤
内核的等待队列
Linux内核wait_queue深入分析
升级和删除内核
SD卡驱动分析2
Linux Kernel VDSO本地权限提升漏洞
内核中的TCP的追踪分析-15-TCP(IPV4)的客户端与
linux 2.6内核可加载模块的编译
内核模块HelloWorld
在环回接口上发送一个数据报
ARP初始化
1分钟编译FreeBSD内核
linux设备模型之uart驱动架构分析