linux核心可變引數分析

2021-06-27 03:17:52 字數 2440 閱讀 1761

首先來看源**,來自:

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)

//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。

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

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

linux核心可變引數分析

typedef char va list storage alignment properties define aupbnd sizeof acpi native int 1 acpi native int 為4位元組 32位 根據機子字數而定 define adnbnd sizeof acpi ...

SFDR 引數分析

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

SFDR 引數分析

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