歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux 可移植性(硬件可移植)

Linux 可移植性(硬件可移植)

日期:2017/3/1 11:08:12   编辑:Linux編程
Linux 內核中有很多不同的內部API,頭文件和其他支持代碼,它們以一種盡可能可移植的方式來抽象和管理硬件平台之間的許多不同.但是硬件可移植不僅僅是linux內核的問題,普通用戶應用程序也需要關注自己的字節序.

一.64位兼容

64位到底意味了什麼.通常:長整型和指針數據類新使用64位,而其他數據類型可能使用32位.

1.首先遇到的問題是不安全的類型轉換

int i=(int)pointer;

如果在64位機器下,pointer是64位長度的.

因此追加了void *類型到c標准中去,由gcc支持:

void *p=pointer

這樣可以安全的將一個指針存儲在一些通用的類型中.

二.字節序

字節序:一種是最重要的字節優先存儲,另一種是最不重要的字節優先存儲

數據按內存地址的升序一次存儲,高位數據在低地址,www.linuxidc.com就是大頭字節序

相反最低位數據放在低地址就是小頭字節序

那麼字節序到底會導致什麼問題呢?

例子:

#include <stdio.h>

#include <stdlib.h>

static inline int little_endian()

{

int endian=1;

return (0==(*(char *)&endian));

}

void broken_endian_example()

{

union

{

int i;

char j[sizeof(int)];

}test={0xdeadbeef};

int i=0;

for(i=0;i<sizeof(int);i++)

{

printf("test.h[%d]=0x%x\n",i,test.j[i]);

}

}

int main(int argc,char **argv)

{

printf("this machine is ");

little_endian()?printf("big"):printf("little");

printf("endian\n");

printf("this program was build on a machine that is :");

#if BYTE_ORDER==BIG_ENDIAN

printf("big endian\n");

#else

#if BYTE_ORDER==LITTLE_ENDIAN

printf("little endian\n");

#else

printf("something weird\n");

#endif

#endif

printf("and here is a silly example...\n");

broken_endian_example();

exit(0);

}

執行完:

this machine is little endian

this program was build on a machine that is :little endian

and here is a silly example...

test.h[0]=0xffffffef

test.h[1]=0xffffffbe

test.h[2]=0xffffffad

test.h[3]=0xffffffde

X86體系用小端字節序,即 低內存地址空間存儲數據的低位
現代計算機通常優化了內存訪問粒度.如果你試圖讀取一個字節的數據,處理器實際上執行了一個完整的32位操作,並將結果截斷以返回你要的字節.所以在開發中需要小心指針運算以及類型轉換是否映像程序的運行.為了實現透明的可移植,可以使用gnu自動話工具測試以實現函數的自動替換.
Copyright © Linux教程網 All Rights Reserved