對於hp32bit位和64bit的區別

maojunxu發表於2013-05-16

一,前言

  使用64位體系結構對應用程式的開發者來說,Solaris 64位作業系統和32位作業系統之間的最大差別在於它們使用的C語言資料型別模型。64位作業系統使用LP64模型,在LP64模型中long型別和指標型別是64位的。其他基本資料型別和32位的模型一樣。32位資料型別使用ILP32模型,其中的int,long和指標型別都是32位的。下面列出了64位環境的主要特點和使用時需要考慮的問題。l 巨大的虛擬地址空間在64位環境中,一個程式可以有多達64位寬的虛擬地址空間,或18
exabytes(18*260位元組)。這是32位環境中4G虛擬地址空間的四十億倍。由於硬體的限制,有的64位平臺無法完全支援64位的地址空間。大地址空間使得系統可以建立更多的執行緒,在32位平臺上一個預設的執行緒需要1M堆疊,在64位平臺上一個預設的執行緒需要2M堆疊。在32位平臺上可以建立4000個預設執行緒,在64位平臺上可以建立8萬億個預設執行緒。l 使用核心記憶體的程式由於系統核心內部也使用64位的資料結構,所以現存的程式,如果使用了libkvm,/dev/mem或/dev/kmem,將無法再在64位環境中執行。必須將這樣的程式轉變為64位的程式。l
/proc的限制一個使用/proc的32位應用程式可以訪問32位程式的屬性,但無法訪問一個64位程式的屬性;現存的描述程式的介面和資料結構不能包含所涉及的64位的量。這種程式必須重新編譯成64位應用程式,這樣才能訪問32位和64位程式的屬性。l 64位庫32位的應用程式必須和32位的庫連結在一起,64位的應用程式必須和64位的庫連結在一起。除了過時的庫,所有的庫都有32位和64位兩種版本。但沒有一個64位庫是靜態連結庫。l 64位運算儘管在32位的Solaris系統中已經有64位運算了,但64位的實現為整數操作和引數傳遞提供了完全64位的機器暫存器。l
大檔案如果一個程式只需要支援大檔案,使用32位Solaris的大檔案介面就可以了。但是為了充分的利用64位的優點,最好把程式轉變為64位程式碼。

64 位計算

Red Hat 和很多其它發行商為 Compaq/DEC Alpha 提供了一種 64 位版的 Linux。您可以在 AlphaLinux Web 站點上了解關於這種 Linux 的其它資訊。64 位的 Solaris 和 64 位的 Linux/Alpha 都使用 LP64 資料模型,它能夠帶來很好的相容性。

不久,Intel Itanium(TM) IA-64 處理器也能使用一種 64 位版的 Linux。您可以在 IA-64 Linux Project Web 站點了解關於這種 Linux 的更多資訊。一種支援 IBM 64 位 PowerPC 體系結構的 Linux 也在開發之中。

請注意,儘管 SuSE Linux/UltraSPARC 的核心執行在 64 位的模式中,但 SuSE Linux/UltraSPARC 目前並不支援 64 位的使用者空間應用程式。

 

二,對於hp 32bit位 和64bit的區別

hp C/HP-UX 32-bit and 64-bit base data types

data type

ILP32 size (bits)

LP64 size (bits)

char

8

8

short

16

16

int

32

32

long

32

64

long long(1)

64

64

pointer

32

64

float

32

32

double

64

64

long double

128

128

enum(2)

32

32

最主要的區別是long型和pointer型資料。

三,32bit機資料在內容中的說明

A)      
為變量/對象分配記憶體的候,是以4字節對齊,無你的變數類型是什。也就是,任何一個變數/對象的存儲空間都是以4的整數倍的地址始的。

B)      
對於
pointer型資料,因為內容是地址,要求該地址也必須是4整數倍

C)      
例如:

main()

{

  struct student

  {

    int i;

    long l;

  }node;

 

  struct student *p;

 

  p=&node;

 

  int *pp;

  char *qq;

  long *ll;

 

  p->i=1;

  p->l=2;

  pp=(int *)p;

  qq=(char *)p;

  ll=(long *)p;

 

  printf(“int pp l=%d/n”,*(pp+1));   /*result =2*/

printf(“char  qq l=%d/n”,*(qq+7)); /*result =2*/

(char型指標指向的內容只能是1位元組的資料。如果將

  p->l賦更大的值22222,*(qq+7))只能取到地址為0x200000007ffff657

 對應的內容)

  printf(“long ll l=%d/n”,*(ll+1));  /*result =2*/

  }

 

結構體的記憶體分配如下:

0x200000007ffff650:  0x00000001    0x00000002    0x00000000    0x00000000

0x200000007ffff660:  0x00000190    0x000002ec    0x000017a0    0x00000002

0x200000007ffff670:  0x00000000    0x00000000

圖解如下:

 

pp,qq,ll

Adress

 data

0x200000007ffff650

00

0x200000007ffff651

00

0x200000007ffff652

00

0x200000007ffff653

01

0x200000007ffff654

l

00

0x200000007ffff655

00

0x200000007ffff656

00

0x200000007ffff657

02

0x200000007ffff658

 

0x200000007ffff659

 

0x200000007ffff65A

 

i

 

四,64bit機資料在內容中的說明

A)      
為變量/對象分配記憶體的候,是以8字節對齊,無你的變數類型是什。也就是,任何一個變數/對象的存儲空間都是以8的整數倍的地址始的。

B)      
對於
pointer型資料,因為內容是地址,要求該地址也必須是8整數倍

C)      
例如:

main()

{

  struct student

  {

    int i;   /*8個位元組的儲存空間,*/

    long l; /*8個位元組的儲存空間,*/

  }node;

 

  struct student *p;

 

  p=&node;

 

  int *pp;

  char *qq;

  long *ll;

 

  p->i=1;

  p->l=222222222;

  pp=(int *)p;

  qq=(char *)p;

  ll=(long *)p;

 

  printf(“int pp l=%d/n”,*(pp+2));/*result int pp l=222222222*/

  printf(“char  qq l=%d/n”,*(qq+15));/*result int pp 13*/

  printf(“long ll l=%d/n”,*(ll+1));/*result int pp l=222222222*/

}

 

 

 

 

 

五,64bit機下,記憶體對齊的例子

  正確:

   int main()

{

        long i;

        char a[44];

        long *p;

 

        p=(char *)(a+8);

        *p=3;

        printf(“*p=%d/n”,*p); /*result = 3*/

}

錯誤:

void main()

{

        long i;

        char a[44];

        long *p;

        p=a+4;

        *p=3;

    printf(“*p=%d/n”,*p); /*bus error*/

}

六,程式中的記憶體分配淺談

一.存空間的對齊規則

首先看一段例子:
    ……
    
int  i1;
    char c1;
    char c2;
    int  i2;

cout << “i1:” <<&i1 << “/n”;
    cout << “c1:” <<(void *)&c1 << “/n”;
    cout << “c2:” <<(void *)&c2 << “/n”;
    cout << “i2:” <<&i2 << “/n”;
    ……
輸出結果如下:
i1:0012FF4C
c1:0012FF48
c2:0012FF44
i2:0012FF40
是不是有些奇怪?
們知道char型別的變數是隻佔用一個位元組的,用sizeof(char)得到的結果也會是1。但在這裡我們看到,c1和c2都被分配了4個位元組的儲存空間,在32bit機下,在為變數/物件分配記憶體的時候,總是以4位元組對齊,無論你的變數型別是什麼。也就是說,任何一個變數/物件的儲存空間都是以4的整數倍的地址開始的。64bit機下,都是8的倍數。


相關文章