linux核心可變引數分析

2021-07-11 03:46:17 字數 2142 閱讀 8490

typedef char *   va_list;

/* * storage alignment properties

*/#define _aupbnd (sizeof (acpi_native_int) - 1) //acpi_native_int 為4位元組(32位)(根據機子字數而定)

#define _adnbnd (sizeof (acpi_native_int) - 1)

/* * variable argument list macro definitions

*/#define _bnd(x, bnd) (((sizeof (x)) + (bnd)) & (~(bnd)))

#define va_arg(ap, t) (*(t *)(((ap) += (_bnd (t, _aupbnd))) - (_bnd (t,_adnbnd))))

#define va_end(ap) (void) 0

#define va_start(ap, a) (void) ((ap) = (((char *) &(a)) + (_bnd (a,_aupbnd))))

首先分析一下_bnd(x, bnd)。

在使用過程中,_bnd(x, bnd)括號內的bnd是乙個固定值:_adnbnd或者_aupbnd。這個值在這裡都是3。

對於x,我們看看下面的例子:

char  c;

_bnd(c, bnd) = ((sizeof(c)) + (3)) & (~(3)) = 4&0xfffffffc = 4

int  t;

_bnd(t, bnd) = ((sizeof(t)) + (3)) & (~(3)) = 7&0xfffffffc = 4

double  d;

_bnd(d, bnd) = ((sizeof(d)) + (3)) & (~(3)) = b&0xfffffffc = 8

char str[15];

_bnd(str, bnd) = ((sizeof(str)) + (3)) & (~(3)) = 0x12&0xfffffffc = 16

_bnd(x, bnd)給出了以4位元組對齊

的變數x

的大小。

下面給出乙個

具體列子:

#include #include double sum_fun(int num, ...); //num為引數個數,此函式返回除num外所有引數之和。

int main()

double sum_fun(int num, ...)

va_end(argptr);

return sum;

}//這裡假設 &num = 0xbff69ce0。

首先分析一下va_start(argptr, num):

(void) ((argptr) = ((char *)&num + 4))   即

argptr = (char *)(0xbff69ce0

)  +  4 =  (char *)(

0xbff69ce4)即

argptr

指向了下乙個引數的位址(引數是以入棧的形式儲存

再來解析 va_arg(argptr, double):

第一次for迴圈:

(* (double*) ((argptr += 8)  -  8)) = (*(double *)(

0xbff69ce4

)) 即

取出了第乙個用於計算的引數的數值。

注意:此時argptr的值是:argptr = argptr + 8 =

0xbff69cec,

即第二次for迴圈:

(* (double*) ((argptr += 8)  -  8)) = (*(double *)(

0xbff69cec

))即取出了第二個用於計算的引數的值。

和第一次取數值一樣,此時的argptr的值也變了,為:

0xbff69cf4。

對,如果有第三個引數,這就是第三個引數的位址。

明白了可變引數的這些取值方法,我們就可以自由使用了。

int log(char * fmt,...)

va_end(ap);

}

linux核心可變引數分析

首先來看源 來自 linux v2.6.28 include acpi platform acenv.h line 274 typedef char va list storage alignment properties define aupbnd sizeof acpi native int 1...

SFDR 引數分析

sfdr是訊號系統處理中常用的一項引數,對於評估系統的雜訊水平和adc dac的效能有一定參考意義。sfdr,英文全稱是 spurious free dynamic range,意為無雜散動態範圍。sfdr是指基波強度與最大雜波或諧波的強度之比,所以sfdr值越大則說明系統的雜訊水平越低,靈敏度越高...

SFDR 引數分析

sfdr是訊號系統處理中常用的一項引數,對於評估系統的雜訊水平和adc dac的效能有一定參考意義。sfdr,英文全稱是 spurious free dynamic range,意為無雜散動態範圍。sfdr是指基波強度與最大雜波或諧波的強度之比,所以sfdr值越大則說明系統的雜訊水平越低,靈敏度越高...