新聞中心
linux大小端識別是對于存儲器編碼方式的識別,它是指在存儲器中字節(jié)的順序,大端表示存儲器中字節(jié)的高位放在低位地址,而小端則恰好相反,高位存儲在高地址。在開發(fā)中會遇到不同的系統(tǒng)、處理器,存儲器編碼方式也是不盡相同,例如x86編譯出來的可執(zhí)行文件是字節(jié)順序都是小端的。而在ARM之類的開發(fā)中,編譯出的文件的字節(jié)順序可以根據(jù)不同的處理器設置大端或小端,開發(fā)者需要針對不同的處理器進行字節(jié)順序的檢測,并且采用不同的程序進行處理。

一種最簡單的linux大小端識別方法就是使用CPUID命令檢測CPU的類型,在不同的架構(gòu)中采用不同的匯編指令,實現(xiàn)Linux大小端識別,代碼如下:
//Check CPU Type
asm volatile (“movl $0x01, %%eax; \
xorl %%edx, %%edx; \
cpuid; \
movl %%edx, %0″
:”=r” (INFO->EDX)::”%eax”,”%edx”);
// Checks if the CPU is big or little endian
if((info->EDX) & 0x00000001){
info->ENDIANNESS = LITTLE_ENDIAN;
}
else{
info->ENDIANNESS = BIG_ENDIAN;
}
上面的代碼使用匯編指令CPUID,然后將edx寄存器中第一位的值判斷出CPU類型,從而識別Linux大小端。如果根據(jù)edx的第一位的值的話,對于x86系統(tǒng)下查詢出來的結(jié)果是0,則為小端模式,如果查詢結(jié)果是1,則為大端模式。
此外,如果要實時的進行大小端的轉(zhuǎn)換,同樣可以使用匯編指令來進行,具體代碼如下:
//Swap endianness
asm volatile (“rorl $16, %0”
: “=q” (info->data)
:: “cc”);
上面的代碼使用匯編指令rorl對變量info->data進行移位16次,實現(xiàn)大小端的轉(zhuǎn)換,將原來的小端字節(jié)序轉(zhuǎn)換成大端字節(jié)序或者將大端字節(jié)序轉(zhuǎn)換成小端字節(jié)序。
總之,Linux大小端識別的實現(xiàn)較為簡單,不僅可以使用cpuid命令,還可以使用rorl匯編指令來識別CPU類型,以及實時的進行大小端轉(zhuǎn)換,這樣可以使得我們可以在不同系統(tǒng)之間正常實現(xiàn)數(shù)據(jù)同步。
成都網(wǎng)站建設選創(chuàng)新互聯(lián)(?:028-86922220),專業(yè)從事成都網(wǎng)站制作設計,高端小程序APP定制開發(fā),成都網(wǎng)絡營銷推廣等一站式服務。
本文題目:識別Linux大小端識別:深入淺出(linux大小端)
路徑分享:http://m.fisionsoft.com.cn/article/djecdji.html


咨詢
建站咨詢
