1. 程式人生 > >linux原始碼分析之位長定義 -- bitsperlong.h

linux原始碼分析之位長定義 -- bitsperlong.h

我們知道,在Linux核心中,不同CPU裡面,不同CPU的位元組序定義不同。
本節年內容主要是講的是:不同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)