linux原始碼分析之位長定義 -- bitsperlong.h
阿新 • • 發佈:2019-01-29
我們知道,在Linux核心中,不同CPU裡面,不同CPU的位元組序定義不同。
本節年內容主要是講的是:不同CPU裡面,各自的位長定義也是不同。
本次用於分析的 Linux 核心版本為: linux--3.0.0-12。
arch/XXX/include/asm/bitsperlong.h:不同CPU(XXX)的位長定義
1)ARM(XXX=arm):
(2)PowerPC(XXX=powerpc)
(3)X86(XXX=x86)
由上面舉的3個例子,可以看出三種不同的CPU對於各自的位長定義有所不同。
接下來我們來看看 asm-generic/bitsperlong.h, 原始碼如下
該標頭檔案說明:一個支援32和64位使用者空間的架構,不能像依靠 CONFIG_64BIT 來決定位長,而是檢查編譯器提供的巨集。
小結:即是先檢查 arch/XXX/include/asm/bitsperlong.h, 看CPU是否定義了位長,若沒有定義,則按照 asm-generic/bitsperlong.h 來決定。
(該例子是隻要 arch/XXX/include/asm/bitsperlong.h 中沒定義,asm-generic/bitsperlong.h 都定義位長為32)
本節年內容主要是講的是:不同CPU裡面,各自的位長定義也是不同。
本次用於分析的 Linux 核心版本為: linux--3.0.0-12。
arch/XXX/include/asm/bitsperlong.h:不同CPU(XXX)的位長定義
1)ARM(XXX=arm):
#include <asm-generic/bitsperlong.h>
(2)PowerPC(XXX=powerpc)
#ifndef __ASM_POWERPC_BITSPERLONG_H #define __ASM_POWERPC_BITSPERLONG_H #if defined(__powerpc64__) # define __BITS_PER_LONG 64 #else # define __BITS_PER_LONG 32 #endif #include <asm-generic/bitsperlong.h> #endif /* __ASM_POWERPC_BITSPERLONG_H */
(3)X86(XXX=x86)
#ifndef __ASM_X86_BITSPERLONG_H
#define __ASM_X86_BITSPERLONG_H
#ifdef __x86_64__
# define __BITS_PER_LONG 64
#else
# define __BITS_PER_LONG 32
#endif
#include <asm-generic/bitsperlong.h>
#endif /* __ASM_X86_BITSPERLONG_H */
由上面舉的3個例子,可以看出三種不同的CPU對於各自的位長定義有所不同。
接下來我們來看看 asm-generic/bitsperlong.h, 原始碼如下
#ifndef __ASM_GENERIC_BITS_PER_LONG #define __ASM_GENERIC_BITS_PER_LONG /* * There seems to be no way of detecting this automatically from user * space, so 64 bit architectures should override this in their * bitsperlong.h. In particular, an architecture that supports * both 32 and 64 bit user space must not rely on CONFIG_64BIT * to decide it, but rather check a compiler provided macro. */ #ifndef __BITS_PER_LONG #define __BITS_PER_LONG 32 #endif #endif /* __ASM_GENERIC_BITS_PER_LONG */
該標頭檔案說明:一個支援32和64位使用者空間的架構,不能像依靠 CONFIG_64BIT 來決定位長,而是檢查編譯器提供的巨集。
小結:即是先檢查 arch/XXX/include/asm/bitsperlong.h, 看CPU是否定義了位長,若沒有定義,則按照 asm-generic/bitsperlong.h 來決定。
(該例子是隻要 arch/XXX/include/asm/bitsperlong.h 中沒定義,asm-generic/bitsperlong.h 都定義位長為32)