易截截图软件、单文件、免安装、纯绿色、仅160KB

高水平C程序员修养

在大型C语言项目工程或者linux内核中我们都会经常见到两个FASTCALL和armlinkage
两个标识符(修饰符),那么它们各有什么不同呢?今天就给大家共同分享一下自己的心得.
     大家都知道在标准C系中函数的形参在实际传入参数的时候会涉及到参数存放的问题,那么这些参数存放在哪里呢? 有一定理论基础的朋友一定会肯定地回答:这些函数参数和函数内部局部变量一起被分配到了函数的局部堆栈中,真的是这样吗?其实还有例外的情况:
   首先作为linux操作系统,它不一定就只运行在X86平台下面,还有其他平台例如ARM,PPC,达芬奇等等,所以在不同的处理器结构上不能保证都是通过局部栈传递参数的,可能此时就有朋友就会问:不放在栈中能放在哪里呢?熟悉ARM的朋友一定知道ARM对函数调用过程中的传参定义了一套规则,叫ATPCS(内地叫AAPCS),规则中明确指出ARM中R0-R4都是作为通用寄存器使用,在函数调用时处理器从R0-R4中获取参数,在函数返回时再将需要返回的参数一次存到R0-R4中,也就是说可以将函数参数直接存放在寄存器中,所以为了严格区别函数参数的存放位置,引入了两个标记,即asmlinkage和FASTCALL,前者表示将函数参数存放在局部栈中,后者则是通知编译器将函数参数用寄存器保存起来
    我们在搜索一些额外的线索,ARM中R0-R4用于存放传入参数,隐约告诉我们,作为高水平嵌入式系统开发者,或者高水平C语言程序员,函数的删除不应该大于5个,那么有人就会反过来问:超过5个的那些参数又何去何从?我的回答是:传入参数如果超过5个,多余的参数还是被存放到局部栈中,此时有人可能又会问:将函数参数传入局部栈有什么不好? 我的回答是:表面上没什么不好,但是如果你是一名具有linux内核修养的程序员,你就会隐约记得linux中,不管是系统调用,还是系统陷阱都会引起用户空间陷入内核空间,我们知道,系统空间的权限级是0,用户空间的权限级为3,系统调用从权限级为3的用户空间陷到权限级为0的内核空间,必然引起堆栈切换,linux系统将从全局任务状态栈TSS中找到一个合适的内核栈信息保存覆盖当前SP,SS两个寄存器的内容,以完成堆栈切换,此时处于内核空间所看到的栈已不是用户空间那个栈,所以在调用的时候压入用户栈的数据就在陷入内核的那个瞬间,被滞留在用户空间栈,内核根本不知道它的存在了,所以作为安全考虑或者作为高水平程序员的切身修养出发,都不应该向系统调用级函数传入过多的参数。


相关文档:

C/C++程序员两年历程 (1)

  不知不觉已经工作两年了,辞去了原来的工作,又跑回了我上学的地方。今天跑去一家室友介绍的公司面试。问得问题挺简单,但我答的却真不怎么地啊。回来又研究了一下,发现这些问题我应该都理解啊,怎么到别人问起的时候就全忘了一般呢。想想了发现还是学的不到位。不禁又想起了这么多年来,我都学到了什么东西呢。
& ......

c学习第一天

n 用标识符代表一个常量,称为符号常量。 n 符号常量与变量不同,它的值在其作用域内不能改变,也不能再被赋值。 n 使用符号常量的好处是: Ø 含义清楚; Ø 能做到“一改全改”。 --话说:不知道c里面有没有全局变量的东东,有的话,这两个的实际用处有啥子区别呢?看看再说 数据结构+算法=程序 终于知道这 ......

求教高手 关于C播放wav问题


最近在网上查了好多关于C播放wav这方面的资料,调试半天也没有结果,搜到一个编译好的EXE文件能播放,没有源代码,反汇编不了,谁能指点一下。。。。。以下两种代码段:
 #include <stdio.h>
#include <dos.h>
/* wav文件结构 */
typedef struct WaveData
{
   unsigned long sample_le ......

linux 系统下使用C程序实现时钟的函数

#include "stdio.h"
#include "math.h"
#include "time.h"
#define INTERVAL 1  定义宏的时间间隔为1秒
//
void On_Time()  //每一秒激发的事件
{
   printf("now=%s\n","JJK"); 
}
void Timer()  //时钟的函数
{  time_t newclk,oldclk;
   while(1)
 &nb ......

C/C++运算符的优先级


Precedence Operator Description Example Overloadable Associativity
1
::
Scope resolution operator
Class::age = 2;
no
none
2
()
()
[]
->
.
++
--
const_cast
dynamic_cast
static_cast
reinterpret_cast
typeid
Function call
Member initalization
Array access
Member access from ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号