• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統(tǒng)計(jì)

            • 隨筆 - 21
            • 文章 - 0
            • 評(píng)論 - 2
            • 引用 - 0

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            2010年10月25日

            Linux 中 x86 的內(nèi)聯(lián)匯編

            如果您是 Linux 內(nèi)核的開(kāi)發(fā)人員,您會(huì)發(fā)現(xiàn)自己經(jīng)常要對(duì)與體系結(jié)構(gòu)高度相關(guān)的功能進(jìn)行編碼或優(yōu)化代碼路徑。您很可能是通過(guò)將匯編語(yǔ)言指令插入到 C 語(yǔ)句的中間(又稱為內(nèi)聯(lián)匯編的一種方法)來(lái)執(zhí)行這些任務(wù)的。讓我們看一下 Linux 中內(nèi)聯(lián)匯編的特定用法。(我們將討論限制在 IA32 匯編。)

            GNU 匯編程序簡(jiǎn)述

            讓我們首先看一下 Linux 中使用的基本匯編程序語(yǔ)法。GCC(用于 Linux 的 GNU C 編譯器)使用 AT&T 匯編語(yǔ)法。下面列出了這種語(yǔ)法的一些基本規(guī)則。(該列表肯定不完整;只包括了與內(nèi)聯(lián)匯編相關(guān)的那些規(guī)則。)

            寄存器命名
            寄存器名稱有 % 前綴。即,如果必須使用 eax,它應(yīng)該用作 %eax。

            源操作數(shù)和目的操作數(shù)的順序
            在所有指令中,先是源操作數(shù),然后才是目的操作數(shù)。這與將源操作數(shù)放在目的操作數(shù)之后的 Intel 語(yǔ)法不同。

            mov %eax, %ebx, transfers the contents of eax to ebx.

            操作數(shù)大小
            根據(jù)操作數(shù)是字節(jié) (byte)、字 (word) 還是長(zhǎng)型 (long),指令的后綴可以是 b、w 或 l。這并不是強(qiáng)制性的;GCC 會(huì)嘗試通過(guò)讀取操作數(shù)來(lái)提供相應(yīng)的后綴。但手工指定后綴可以改善代碼的可讀性,并可以消除編譯器猜測(cè)不正確的可能性。

            movb %al, %bl -- Byte move
            movw %ax, %bx -- Word move
            movl %eax, %ebx -- Longword move

            立即操作數(shù)
            通過(guò)使用 $ 指定直接操作數(shù)。

            movl $0xffff, %eax -- will move the value of 0xffff into eax register.

            間接內(nèi)存引用
            任何對(duì)內(nèi)存的間接引用都是通過(guò)使用 ( ) 來(lái)完成的。

            movb (%esi), %al -- will transfer the byte in the memory 
            pointed by esi into al
            register


            內(nèi)聯(lián)匯編

            GCC 為內(nèi)聯(lián)匯編提供特殊結(jié)構(gòu),它具有以下格式:

            GCG 的 "asm" 結(jié)構(gòu)

               asm ( assembler template

            : output operands (optional)

            : input operands (optional)

            : list of clobbered registers
            (optional)

            );

            本例中,匯編程序模板由匯編指令組成。輸入操作數(shù)是充當(dāng)指令輸入操作數(shù)使用的 C 表達(dá)式。輸出操作數(shù)是將對(duì)其執(zhí)行匯編指令輸出的 C 表達(dá)式。

            內(nèi)聯(lián)匯編的重要性體現(xiàn)在它能夠靈活操作,而且可以使其輸出通過(guò) C 變量顯示出來(lái)。因?yàn)樗哂羞@種能力,所以 "asm" 可以用作匯編指令和包含它的 C 程序之間的接口。

            一個(gè)非常基本但很重要的區(qū)別在于 簡(jiǎn)單內(nèi)聯(lián)匯編只包括指令,而 擴(kuò)展內(nèi)聯(lián)匯編包括操作數(shù)。要說(shuō)明這一點(diǎn),考慮以下示例:

            內(nèi)聯(lián)匯編的基本要素

            {
            int a=10, b;
            asm ("movl %1, %%eax;

            movl %%eax, %0;"
            :"=r"(b) /* output */
            :"r"(a) /* input */
            :"%eax"); /* clobbered register */
            }

            在上例中,我們使用匯編指令使 "b" 的值等于 "a"。請(qǐng)注意以下幾點(diǎn):

            • "b" 是輸出操作數(shù),由 %0 引用,"a" 是輸入操作數(shù),由 %1 引用。
            • "r" 是操作數(shù)的約束,它指定將變量 "a" 和 "b" 存儲(chǔ)在寄存器中。請(qǐng)注意,輸出操作數(shù)約束應(yīng)該帶有一個(gè)約束修飾符 "=",指定它是輸出操作數(shù)。
            • 要在 "asm" 內(nèi)使用寄存器 %eax,%eax 的前面應(yīng)該再加一個(gè) %,換句話說(shuō)就是 %%eax,因?yàn)?"asm" 使用 %0、%1 等來(lái)標(biāo)識(shí)變量。任何帶有一個(gè) % 的數(shù)都看作是輸入/輸出操作數(shù),而不認(rèn)為是寄存器。
            • 第三個(gè)冒號(hào)后的修飾寄存器 %eax 告訴將在 "asm" 中修改 GCC %eax 的值,這樣 GCC 就不使用該寄存器存儲(chǔ)任何其它的值。
            • movl %1, %%eax 將 "a" 的值移到 %eax 中, movl %%eax, %0 將 %eax 的內(nèi)容移到 "b" 中。
            • 因?yàn)?"b" 被指定成輸出操作數(shù),因此當(dāng) "asm" 的執(zhí)行完成后,它將反映出更新的值。換句話說(shuō),對(duì) "asm" 內(nèi) "b" 所做的更改將在 "asm" 外反映出來(lái)。

            現(xiàn)在讓我們更詳細(xì)的了解每一項(xiàng)的含義。


            匯編程序模板

            匯編程序模板是一組插入到 C 程序中的匯編指令(可以是單個(gè)指令,也可以是一組指令)。每條指令都應(yīng)該由雙引號(hào)括起,或者整組指令應(yīng)該由雙引號(hào)括起。每條指令還應(yīng)該用一個(gè)定界符結(jié)尾。有效的定界符為新行 (\n) 和分號(hào) (;)。 '\n' 后可以跟一個(gè) tab(\t) 作為格式化符號(hào),增加 GCC 在匯編文件中生成的指令的可讀性。 指令通過(guò)數(shù) %0、%1 等來(lái)引用 C 表達(dá)式(指定為操作數(shù))。

            如果希望確保編譯器不會(huì)在 "asm" 內(nèi)部?jī)?yōu)化指令,可以在 "asm" 后使用關(guān)鍵字 "volatile"。如果程序必須與 ANSI C 兼容,則應(yīng)該使用 __asm__ 和 __volatile__,而不是 asm 和 volatile。


            操作數(shù)

            C 表達(dá)式用作 "asm" 內(nèi)的匯編指令操作數(shù)。在匯編指令通過(guò)對(duì) C 程序的 C 表達(dá)式進(jìn)行操作來(lái)執(zhí)行有意義的作業(yè)的情況下,操作數(shù)是內(nèi)聯(lián)匯編的主要特性。

            每個(gè)操作數(shù)都由操作數(shù)約束字符串指定,后面跟用括弧括起的 C 表達(dá)式,例如:"constraint" (C expression)。操作數(shù)約束的主要功能是確定操作數(shù)的尋址方式。

            可以在輸入和輸出部分中同時(shí)使用多個(gè)操作數(shù)。每個(gè)操作數(shù)由逗號(hào)分隔開(kāi)。

            在匯編程序模板內(nèi)部,操作數(shù)由數(shù)字引用。如果總共有 n 個(gè)操作數(shù)(包括輸入和輸出),那么第一個(gè)輸出操作數(shù)的編號(hào)為 0,逐項(xiàng)遞增,最后那個(gè)輸入操作數(shù)的編號(hào)為 n -1。總操作數(shù)的數(shù)目限制在 10,如果機(jī)器描述中任何指令模式中的最大操作數(shù)數(shù)目大于 10,則使用后者作為限制。


            修飾寄存器列表

            如果 "asm" 中的指令指的是硬件寄存器,可以告訴 GCC 我們將自己使用和修改它們。這樣,GCC 就不會(huì)假設(shè)它裝入到這些寄存器中的值是有效值。通常不需要將輸入和輸出寄存器列為 clobbered,因?yàn)?GCC 知道 "asm" 使用它們(因?yàn)樗鼈儽幻鞔_指定為約束)。不過(guò),如果指令使用任何其它的寄存器,無(wú)論是明確的還是隱含的(寄存器不在輸入約束列表中出現(xiàn),也不在輸出約束列表中出現(xiàn)),寄存器都必須被指定為修飾列表。修飾寄存器列在第三個(gè)冒號(hào)之后,其名稱被指定為字符串。

            至于關(guān)鍵字,如果指令以某些不可預(yù)知且不明確的方式修改了內(nèi)存,則可能將 "memory" 關(guān)鍵字添加到修飾寄存器列表中。這樣就告訴 GCC 不要在不同指令之間將內(nèi)存值高速緩存在寄存器中。


            操作數(shù)約束

            前面提到過(guò),"asm" 中的每個(gè)操作數(shù)都應(yīng)該由操作數(shù)約束字符串描述,后面跟用括弧括起的 C 表達(dá)式。操作數(shù)約束主要是確定指令中操作數(shù)的尋址方式。約束也可以指定:

            • 是否允許操作數(shù)位于寄存器中,以及它可以包括在哪些種類的寄存器中
            • 操作數(shù)是否可以是內(nèi)存引用,以及在這種情況下使用哪些種類的地址
            • 操作數(shù)是否可以是立即數(shù)

            約束還要求兩個(gè)操作數(shù)匹配。


            常用約束

            在可用的操作數(shù)約束中,只有一小部分是常用的;下面列出了這些約束以及簡(jiǎn)要描述。有關(guān)操作數(shù)約束的完整列表,請(qǐng)參考 GCC 和 GAS 手冊(cè)。

            寄存器操作數(shù)約束 (r)
            使用這種約束指定操作數(shù)時(shí),它們存儲(chǔ)在通用寄存器中。請(qǐng)看下例:

            asm ("movl %%cr3, %0\n" :"=r"(cr3val));

            這里,變量 cr3val 保存在寄存器中,%cr3 的值復(fù)制到寄存器上,cr3val 的值從該寄存器更新到內(nèi)存中。指定 "r" 約束時(shí),GCC 可以將變量 cr3val 保存在任何可用的 GPR 中。要指定寄存器,必須通過(guò)使用特定的寄存器約束直接指定寄存器名。

            a   %eax
            b %ebx
            c %ecx
            d %edx
            S %esi
            D %edi

            內(nèi)存操作數(shù)約束 (m)
            當(dāng)操作數(shù)位于內(nèi)存中時(shí),任何對(duì)它們執(zhí)行的操作都將在內(nèi)存位置中直接發(fā)生,這與寄存器約束正好相反,后者先將值存儲(chǔ)在要修改的寄存器中,然后將它寫(xiě)回內(nèi)存位置中。但寄存器約束通常只在對(duì)于指令來(lái)說(shuō)它們是絕對(duì)必需的,或者它們可以大大提高進(jìn)程速度時(shí)使用。當(dāng)需要在 "asm" 內(nèi)部更新 C 變量,而您又確實(shí)不希望使用寄存器來(lái)保存其值時(shí),使用內(nèi)存約束最為有效。例如,idtr 的值存儲(chǔ)在內(nèi)存位置 loc 中:

             ("sidt %0\n" : :"m"(loc));

            匹配(數(shù)字)約束
            在某些情況下,一個(gè)變量既要充當(dāng)輸入操作數(shù),也要充當(dāng)輸出操作數(shù)。可以通過(guò)使用匹配約束在 "asm" 中指定這種情況。

            asm ("incl %0" :"=a"(var):"0"(var));

            在匹配約束的示例中,寄存器 %eax 既用作輸入變量,也用作輸出變量。將 var 輸入讀取到 %eax,增加后將更新的 %eax 再次存儲(chǔ)在 var 中。這里的 "0" 指定第 0 個(gè)輸出變量相同的約束。即,它指定 var 的輸出實(shí)例只應(yīng)該存儲(chǔ)在 %eax 中。該約束可以用于以下情況:

            • 輸入從變量中讀取,或者變量被修改后,修改寫(xiě)回到同一變量中
            • 不需要將輸入操作數(shù)和輸出操作數(shù)的實(shí)例分開(kāi)

            使用匹配約束最重要的意義在于它們可以導(dǎo)致有效地使用可用寄存器。


            一般內(nèi)聯(lián)匯編用法示例

            以下示例通過(guò)各種不同的操作數(shù)約束說(shuō)明了用法。有如此多的約束以至于無(wú)法將它們一一列出,這里只列出了最經(jīng)常使用的那些約束類型。

            "asm" 和寄存器約束 "r" 讓我們先看一下使用寄存器約束 r 的 "asm"。我們的示例顯示了 GCC 如何分配寄存器,以及它如何更新輸出變量的值。

            int main(void)
            {
            int x = 10, y;

            asm ("movl %1, %%eax;

            "movl %%eax, %0;"
            :"=r"(y) /* y is output operand */
            :"r"(x) /* x is input operand */
            :"%eax"); /* %eax is clobbered register */
            }

            在該例中,x 的值復(fù)制為 "asm" 中的 y。x 和 y 都通過(guò)存儲(chǔ)在寄存器中傳遞給 "asm"。為該例生成的匯編代碼如下:

            main:
            pushl %ebp
            movl %esp,%ebp
            subl $8,%esp
            movl $10,-4(%ebp)
            movl -4(%ebp),%edx /* x=10 is stored in %edx */
            #APP /* asm starts here */
            movl %edx, %eax /* x is moved to %eax */
            movl %eax, %edx /* y is allocated in edx and updated */
            #NO_APP /* asm ends here */
            movl %edx,-8(%ebp) /* value of y in stack is updated with

            the value in %edx */

            當(dāng)使用 "r" 約束時(shí),GCC 在這里可以自由分配任何寄存器。在我們的示例中,它選擇 %edx 來(lái)存儲(chǔ) x。在讀取了 %edx 中 x 的值后,它為 y 也分配了相同的寄存器。

            因?yàn)?y 是在輸出操作數(shù)部分中指定的,所以 %edx 中更新的值存儲(chǔ)在 -8(%ebp),堆棧上 y 的位置中。如果 y 是在輸入部分中指定的,那么即使它在 y 的臨時(shí)寄存器存儲(chǔ)值 (%edx) 中被更新,堆棧上 y 的值也不會(huì)更新。

            因?yàn)?%eax 是在修飾列表中指定的,GCC 不在任何其它地方使用它來(lái)存儲(chǔ)數(shù)據(jù)。

            輸入 x 和輸出 y 都分配在同一個(gè) %edx 寄存器中,假設(shè)輸入在輸出產(chǎn)生之前被消耗。請(qǐng)注意,如果您有許多指令,就不是這種情況了。要確保輸入和輸出分配到不同的寄存器中,可以指定 & 約束修飾符。下面是添加了約束修飾符的示例。

            int main(void)
            {
            int x = 10, y;

            asm ("movl %1, %%eax;

            "movl %%eax, %0;"
            :"=&r"(y) /* y is output operand, note the

            & constraint modifier. */
            :"r"(x) /* x is input operand */
            :"%eax"); /* %eax is clobbered register */
            }

            以下是為該示例生成的匯編代碼,從中可以明顯地看出 x 和 y 存儲(chǔ)在 "asm" 中不同的寄存器中。

            main:
            pushl %ebp
            movl %esp,%ebp
            subl $8,%esp
            movl $10,-4(%ebp)
            movl -4(%ebp),%ecx /* x, the input is in %ecx */
            #APP
            movl %ecx, %eax
            movl %eax, %edx /* y, the output is in %edx */
            #NO_APP
            movl %edx,-8(%ebp)


            特定寄存器約束的使用

            現(xiàn)在讓我們看一下如何將個(gè)別寄存器作為操作數(shù)的約束指定。在下面的示例中,cpuid 指令采用 %eax 寄存器中的輸入,然后在四個(gè)寄存器中給出輸出:%eax、%ebx、%ecx、%edx。對(duì) cpuid 的輸入(變量 "op")傳遞到 "asm" 的 eax 寄存器中,因?yàn)?cpuid 希望它這樣做。在輸出中使用 a、b、c 和 d 約束,分別收集四個(gè)寄存器中的值。

            asm ("cpuid"
            : "=a" (_eax),
            "=b" (_ebx),
            "=c" (_ecx),
            "=d" (_edx)
            : "a" (op));

            在下面可以看到為它生成的匯編代碼(假設(shè) _eax、_ebx 等... 變量都存儲(chǔ)在堆棧上):

            movl -20(%ebp),%eax /* store 'op' in %eax -- input */
            #APP
            cpuid
            #NO_APP
            movl %eax,-4(%ebp) /* store %eax in _eax -- output */
            movl %ebx,-8(%ebp) /* store other registers in
            movl %ecx,-12(%ebp)
            respective output variables */
            movl %edx,-16(%ebp)

            strcpy 函數(shù)可以通過(guò)以下方式使用 "S" 和 "D" 約束來(lái)實(shí)現(xiàn):

            asm ("cld\n

            rep\n

            movsb"

            : /* no input */

            :"S"(src), "D"(dst), "c"(count));

            通過(guò)使用 "S" 約束將源指針 src 放入 %esi 中,使用 "D" 約束將目的指針 dst 放入 %edi 中。因?yàn)?rep 前綴需要 count 值,所以將它放入 %ecx 中。

            在下面可以看到另一個(gè)約束,它使用兩個(gè)寄存器 %eax 和 %edx 將兩個(gè) 32 位的值合并在一起,然后生成一個(gè)64 位的值:

            #define rdtscll(val) \
            __asm__ __volatile__ ("rdtsc" : "=A" (val))
            The generated assembly looks like this (if val has a 64 bit memory space).
            #APP
            rdtsc
            #NO_APP
            movl %eax,-8(%ebp) /* As a result of A constraint
            movl %edx,-4(%ebp)
            %eax and %edx serve as outputs */
            Note here that the values in %edx:%eax serve as 64 bit output.


            使用匹配約束

            在下面將看到系統(tǒng)調(diào)用的代碼,它有四個(gè)參數(shù):

            #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
            type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
            { \
            long __res; \
            __asm__ volatile ("int $0x80" \
            : "=a" (__res) \
            : "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \
            "d" ((long)(arg3)),"S" ((long)(arg4))); \
            __syscall_return(type,__res); \
            }

            在上例中,通過(guò)使用 b、c、d 和 S 約束將系統(tǒng)調(diào)用的四個(gè)自變量放入 %ebx、%ecx、%edx 和 %esi 中。請(qǐng)注意,在輸出中使用了 "=a" 約束,這樣,位于 %eax 中的系統(tǒng)調(diào)用的返回值就被放入變量 __res 中。通過(guò)將匹配約束 "0" 用作輸入部分中第一個(gè)操作數(shù)約束,syscall 號(hào) __NR_##name 被放入 %eax 中,并用作對(duì)系統(tǒng)調(diào)用的輸入。這樣,這里的 %eax 既可以用作輸入寄存器,又可以用作輸出寄存器。沒(méi)有其它寄存器用于這個(gè)目的。另請(qǐng)注意,輸入(syscall 號(hào))在產(chǎn)生輸出(syscall 的返回值)之前被消耗(使用)。


            內(nèi)存操作數(shù)約束的使用

            請(qǐng)考慮下面的原子遞減操作:

            __asm__ __volatile__(
            "lock; decl %0"
            :"=m" (counter)
            :"m" (counter));

            為它生成的匯編類似于:

            #APP
            lock
            decl -24(%ebp) /* counter is modified on its memory location */
            #NO_APP.

            您可能考慮在這里為 counter 使用寄存器約束。如果這樣做,counter 的值必須先復(fù)制到寄存器,遞減,然后對(duì)其內(nèi)存更新。但這樣您會(huì)無(wú)法理解鎖定和原子性的全部意圖,這些明確顯示了使用內(nèi)存約束的必要性。


            使用修飾寄存器

            請(qǐng)考慮內(nèi)存拷貝的基本實(shí)現(xiàn)。

               asm ("movl $count, %%ecx;

            up: lodsl;

            stosl;

            loop up;"
            : /* no output */
            :"S"(src), "D"(dst) /* input */
            :"%ecx", "%eax" ); /* clobbered list */

            當(dāng) lodsl 修改 %eax 時(shí),lodsl 和 stosl 指令隱含地使用它。%ecx 寄存器明確裝入 count。但 GCC 在我們通知它以前是不知道這些的,我們是通過(guò)將 %eax 和 %ecx 包括在修飾寄存器集中來(lái)通知 GCC 的。在完成這一步之前,GCC 假設(shè) %eax 和 %ecx 是自由的,它可能決定將它們用作存儲(chǔ)其它的數(shù)據(jù)。請(qǐng)注意,%esi 和 %edi 由 "asm" 使用,它們不在修飾列表中。這是因?yàn)橐呀?jīng)聲明 "asm" 將在輸入操作數(shù)列表中使用它們。這里最低限度是,如果在 "asm" 內(nèi)部使用寄存器(無(wú)論是明確還是隱含地),既不出現(xiàn)在輸入操作數(shù)列表中,也不出現(xiàn)在輸出操作數(shù)列表中,必須將它列為修飾寄存器。


            結(jié)束語(yǔ)

            總的來(lái)說(shuō),內(nèi)聯(lián)匯編非常巨大,它提供的許多特性我們甚至在這里根本沒(méi)有涉及到。但如果掌握了本文描述的基本材料,您應(yīng)該可以開(kāi)始對(duì)自己的內(nèi)聯(lián)匯編進(jìn)行編碼了。


            參考資料

            2010年1月11日

            飛鴿協(xié)議以及其使用的UDP數(shù)據(jù)包格式和文件傳輸邏輯

                 摘要: Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 ...  閱讀全文

            posted @ 2010-01-11 15:23 ChinaPanda 閱讀(2076) | 評(píng)論 (0)編輯 收藏

            2010年1月7日

            轉(zhuǎn) 部分飛鴿協(xié)議


            最近看到一些朋友在編寫(xiě)網(wǎng)絡(luò)程序是遇到一些問(wèn)題,故把以前做IPMSG時(shí)翻譯的文檔貼過(guò)來(lái),希望對(duì)網(wǎng)絡(luò)編程新手有所幫助,在尋找編程項(xiàng)目的同學(xué)們也可參照此文檔寫(xiě)出自己的IPMSG。

            本文只包含其中幾個(gè)比較重要的命令以及運(yùn)行機(jī)制的中文翻譯,更詳細(xì)的內(nèi)容請(qǐng)參照文后的IPMSG 協(xié)議英文文檔

            聲明:下述協(xié)議內(nèi)容略去了一些在編寫(xiě)程序過(guò)程中沒(méi)有用到協(xié)議內(nèi)容,最初的Ipmsg協(xié)議是用日文寫(xiě)的,下面協(xié)議內(nèi)容由本人(cugb_cat)翻譯自Mr.Kanazawa的英文文檔。本翻譯文檔可任意傳播和使用。

                    IP信使傳輸協(xié)議(第9版草案)         1996/02/21
                            2003/01/14 修訂

                            H.Shirouzu
                        shirouzu@h.email.ne.jp


            關(guān)于IP信使:
              IP信使使用TCP/UDP協(xié)議提供收發(fā)消息及文件(目錄)。
            特性:
            IP信使能夠安裝在任何一個(gè)安裝了TCP/IP協(xié)議棧的操作系統(tǒng)上,使用在線用戶的動(dòng)態(tài)識(shí)別機(jī)制,可以和在線所有用戶進(jìn)行信息交換。
            運(yùn)行機(jī)制介紹:
            使用TCP/UDP端口(默認(rèn)端口為2425),消息的收發(fā)使用UDP協(xié)議,文件(文件夾)的收發(fā)使用TCP協(xié)議。
            1、   命令字:
            1)   基本命令字(32位命令字的低8位)
                IPMSG_NOOPERATION     不進(jìn)行任何操作
                IPMSG_BR_ENTRY     用戶上線
                IPMSG_BR_EXIT         用戶退出
                IPMSG_ANSENTRY     通報(bào)在線
                IPMSG_SENDMSG         發(fā)送消息
                IPMSG_RECVMSG         通報(bào)收到消息
                IPMSG_GETFILEDATA     請(qǐng)求通過(guò)TCP傳輸文件
                IPMSG_RELEASEFILES   停止接收文件
                IPMSG_GETDIRFILES     請(qǐng)求傳輸文件夾
            2)   選項(xiàng)位(32位命令字的高24位)
            IPMSG_SENDCHECKOPT   傳送檢查(需要對(duì)方返回確認(rèn)信息)
            IPMSG_FILEATTACHOPT   傳送文件選項(xiàng)
            3)   附件類型命令(文件類型命令字的低8位)
            IPMSG_FILE_REGULAR   普通文件
            IPMSG_FILE_DIR     目錄文件
            IPMSG_FILE_RETPARENT   返回上一級(jí)目錄
            2、   數(shù)據(jù)包格式(使用字符串):
            1)   數(shù)據(jù)包格式(版本1的格式)
            版本號(hào)(1):包編號(hào):發(fā)送者姓名:發(fā)送者主機(jī)名:命令字:附加信息
            2)   舉例如下
            “1:100:shirouzu:Jupiter:32:Hello”
            3、   數(shù)據(jù)包處理總述:
            1)   用戶識(shí)別
            當(dāng)IPMSG 啟動(dòng)時(shí),命令I(lǐng)PMSG_BR_ENTRY被廣播到網(wǎng)絡(luò)中,向所有在線的用戶提示一個(gè)新用戶的到達(dá)(即表示“我來(lái)了”);所有在線用戶將把該新上線用戶添 加到自己的用戶列表中,并向該新上線用戶發(fā)送IPMSG_ANSENTRY命令(即表示“我在線”);該新上線用戶接收到IPMSG_ANSENTRY命 令后即將在線用戶添加到自己的用戶列表中。
            2)   收發(fā)消息
            使用IPMSG_SENDMSG命令發(fā)送消息,消息內(nèi)容添加在附加信息中;在接收消息時(shí),如果對(duì)方要求回信確認(rèn)(IPMSG_SENDCHECKOPT位打開(kāi)),則需發(fā)送IPMSG_RECVMSG命令并將對(duì)方發(fā)送的數(shù)據(jù)包的編號(hào)放在附加信息中一同發(fā)送至發(fā)送消息方
            3)   附加文件的擴(kuò)充(添加于第9版)
            帶有IPMSG_FILEATTACHOPT位的IPMSG_SENDMSG命令可用來(lái)傳輸文件,文件屬性及內(nèi)容添加在附加信息中,文件內(nèi)容添加在消息內(nèi) 容后并以’\0’與之分隔開(kāi)。傳輸文件時(shí)以下信息將被添加到消息內(nèi)容之后(包括格式):文件序號(hào):文件名:大小(單位:字節(jié)):最后修改時(shí)間:文件屬性 [: 附加屬性=val1[,val2…][:附加信息=…]]:\a:文件序號(hào)…
            (文件大小、最后修改時(shí)間和文件屬性為十六進(jìn)制數(shù),如果文件名中包含’:’則使用“::”代替)。
            接收端開(kāi)始接收文件時(shí),請(qǐng)求傳輸文件命令I(lǐng)PMSG_GETFILEDATA將發(fā)送到發(fā)送端的TCP端口(和UDP的發(fā)送端口相同),并將發(fā)送端發(fā)送的包 編號(hào):文件序號(hào):偏移量(全為十六進(jìn)制格式)寫(xiě)到附加信息區(qū)一同發(fā)送,文件發(fā)送端接收到該請(qǐng)求信息并進(jìn)行校驗(yàn)正確后即開(kāi)始發(fā)送文件(不使用任何格式,亦不 進(jìn)行加密)。
            當(dāng)接收端接收到目錄文件時(shí),將發(fā)送附加信息區(qū)為發(fā)送端發(fā)送的包編號(hào):文件序號(hào):偏移量(全為十六進(jìn)制格式)的 IPMSG_GETDIRFILES命令,以用來(lái)請(qǐng)求傳輸目錄文件;發(fā)送端則將頭信息長(zhǎng)度:文件名:文件大小:文件屬性:文件內(nèi)容添加到附加信息區(qū)(除了 文件名和文件內(nèi)容外,其余皆為十六進(jìn)制),頭信息長(zhǎng)度是從頭信息長(zhǎng)度開(kāi)始到文件內(nèi)容前的‘:’分割符為止的字符個(gè)數(shù)。
            當(dāng)文件屬性為IPMSG_FILE_DIR時(shí),IPMsg能夠自動(dòng)識(shí)別其為目錄,下一個(gè)文件的數(shù)據(jù)在該目錄之后。
            當(dāng)文件屬性為IPMSG_FILE_RETPARENT時(shí),IPMsg識(shí)別其動(dòng)作為返回上一級(jí)目錄,在這種情況下,文件名為‘.’其屬性為當(dāng)前目錄的值。

            附IPMSG協(xié)議英文版:



            Original ipmsg protocol specification is written in Japanese.
            This document was translated by Mr.Kanazawa.
            This document is not verified yet.

            ----------------------------------------------------------------------
                IP Messenger communication protocol (Draft-9) 1996/02/21
                                            Modified 2003/01/14

                                                H.Shirouzu
                                          shirouzu@h.email.ne.jp
            ----------------------------------------------------------------------

            About IP Messenger
                This is a Send/Receive message service using the TCP/UDP Port.

            Characteristics
                IP Messenger can be installed in any OS if TCP/IP is used on your machine.
                Dynamic member recognition can be done within your network or specified network.
                You can exchange messages between all IPMsg members.

            Function description
                Use TCP/UDP port(default:2425). See the following descriptions
                (Message Send/Receive: UDP, File Send/Receive: TCP)

            1. Command

              1) Command functions (Low 8 bits from command number 32 bits)

                IPMSG_NOOPERATION No Operation
                IPMSG_BR_ENTRY Entry to service (Start-up with a Broadcast command)
                IPMSG_BR_EXIT Exit from service (End with a Broadcast command)
                IPMSG_ANSENTRY Notify a new entry
                IPMSG_BR_ABSENCE Change absence mode

                IPMSG_BR_ISGETLIST Search valid sending host members
                IPMSG_OKGETLIST Host list sending notice
                IPMSG_GETLIST Host list sending request
                IPMSG_ANSLIST Host list sending

                IPMSG_SENDMSG Message transmission
                IPMSG_RECVMSG Message receiving check

                IPMSG_READMSG Message open notice
                IPMSG_DELMSG Message discarded notice
                IPMSG_ANSREADMSG Message open confirmation notice(added from version-8 )

                IPMSG_GETFILEDATA File Transfer request by TCP
                IPMSG_RELEASEFILES Discard attachment file
                IPMSG_GETDIRFILES Attachment hierarchical file request

                IPMSG_GETINFO Get IPMSG version info.
                IPMSG_SENDINFO Send IPMSG version info.

                IPMSG_GETABSENCEINFO Get absence sentence
                IPMSG_SENDABSENCEINFO Send absence sentence

                IPMSG_GETPUBKEY RSA Public Key Acquisition
                IPMSG_ANSPUBKEY RSA Public Key Response

              2) Option flag (High 24 bits from command number 32 bits)

                IPMSG_ABSENCEOPT Absence mode(Member recognition command)
                IPMSG_SERVEROPT Server(Reserved)
                IPMSG_DIALUPOPT Send individual member recognition command

                IPMSG_SENDCHECKOPT Transmission check
                IPMSG_SECRETOPT Sealed message
                IPMSG_READCHECKOPT Sealed message check(added from ver8 )
                IPMSG_PASSWORDOPT Lock
                IPMSG_BROADCASTOPT Broadcast message
                IPMSG_MULTICASTOPT Multi-cast(Multiple casts selection)
                IPMSG_NEWMUTIOPT New version multi-cast(reserved)
                IPMSG_AUTORETOPT Automatic response(Ping-pong protection)
                IPMSG_NOLOGOPT No log files
                IPMSG_NOADDLISTOPT Notice to the members outside of BR_ENTRY

                IPMSG_FILEATTACHOPT File attachment
                IPMSG_ENCRYPTOPT Code

                IPMSG_NOPOPUPOPT (No longer valid)
                IPMSG_RETRYOPT Re-send flag(Use when acquiring HOSTLIST)

              3) Extended code flag (hex format combination)

                IPMSG_RSA_512
                IPMSG_RSA_1024
                IPMSG_RSA_2048
                IPMSG_RC2_40
                IPMSG_RC2_128
                IPMSG_RC2_256
                IPMSG_BLOWFISH_128
                IPMSG_BLOWFISH_256
                IPMSG_SIGN_MD5

              4) Extended files for attachment (fileattr low 8 bits)

                IPMSG_FILE_REGULAR
                IPMSG_FILE_DIR
                IPMSG_FILE_RETPARENT
                IPMSG_FILE_SYMLINK
                IPMSG_FILE_CDEV
                IPMSG_FILE_BDEV
                IPMSG_FILE_FIFO
                IPMSG_FILE_RESFORK

              5) Attachment file extended attribute(fileattr high 24 bits)

                IPMSG_FILE_RONLYOPT
                IPMSG_FILE_HIDDENOPT
                IPMSG_FILE_EXHIDDENOPT
                IPMSG_FILE_ARCHIVEOPT
                IPMSG_FILE_SYSTEMOPT

              6) Extended file attribute for attachment file

                IPMSG_FILE_UID
                IPMSG_FILE_USERNAME
                IPMSG_FILE_GID
                IPMSG_FILE_GROUPNAME
                IPMSG_FILE_PERM
                IPMSG_FILE_MAJORNO
                IPMSG_FILE_MINORNO
                IPMSG_FILE_CTIME
                IPMSG_FILE_MTIME
                IPMSG_FILE_ATIME
                IPMSG_FILE_CREATETIME

                IPMSG_FILE_CREATOR
                IPMSG_FILE_FILETYPE
                IPMSG_FILE_FINDERINFO

                IPMSG_FILE_ACL
                IPMSG_FILE_ALIASFNAME
                IPMSG_FILE_UNICODEFNAME


            2.Command format(Use all character strings)

              1) Command(Format version-1)

                Ver(1) : PacketNo : SenderName : SenderHost : CommandNo : AdditionalSection

              2) An example for Message Send/Receive by using the current command format

                "1:100:shirouzu:jupiter:32:Hello"


            3.Command process overview

              1) Member recognition

                An IPMSG_BR_ENTRY command notifies a new entry to the current
                members at start-up.

                All members add the new member to their list after getting a notification message.
                An IPMSG_ANSENTRY command sends a message back to the new member.

                The new member gets the current member data by a
                IPMSG_ANSENTRY command. All members can communicate as long as an
                IP packet exists.

                An IPMSG_BR_ABSENCE command broadcasts absence mode cancel or
                nickname change to all members. However, an IPMSG_ANSENTRY command
                does not send a message back, which is different from an IPMSG_BR_ENTRY
                command.

                IPMSG_BR_ENTRY, IPMSG_ANSENTRY, and IPMSG_BR_ABSENCE commands
                use an IPMSG_ABSENCEOPT flag for absence mode. Input a nickname to
                additional command.
                Add an IPMSG_DIALUPOPT flag for dial-up users who can't be reached by
                a broadcast command. A member recognition command needs to be
                sent individually to the members with this optional flag.

                (Extended group)IPMSG_BR_ENTRY and IPMSG_BR_ABSENCE commands
                sends a group name by adding the new group name after the current
                command format character strings (Input '
            \0' between the current
                command and extended name).

              2) Send/Receive Message
                Send Message uses an IPMSG_SENDMSG command that can input a message
                in the extended area.
                Receive Message sends back an IPMSG_RECVMSG command only
                if an IPMSG_SENDCHECKOPT flag is ON. Input the original packet number
                to the extended area.

                Broadcast Message Send uses an IPMSG_BOADCASTOPT command
                and an IPMSG_SENDMSG flag should be ON.
                Auto-Send packet(absence notice) needs to be added to IPMSG_AUTORETOPT
                for ping-pong protection. If either one or another packet is ON, then
                confirmation/auto-send packet is not sent back.

                Send Message Sealing needs to be an IPMSG_SECRETOPT packet ON.
                In this case, Receive Message sends an IPMSG_READMSG command.
                Input the original packet number to the extended area.

                (Additional IPMSG_NOADDLISTOPT)
                When receiving an IPMSG_SENDMSG packet from a host that is
                not on your Send/Receive list, IPMsg will either confirm a host by
                sending an IPMSG_BR_ENTRY command or add a host name to
                the Send/Receive list.
                However, single-shot Message Send/Receive action needs to be avoided.
                Add an IPMSG_NOADDLISTOPT flag to an IPMSG_SENDMSG command.

                (Additional IPMSG_READCHECKOPT from version-8 )
                When an IPMSG_READMSG command contains an IPMSG_READCHECKOPT flag,
                IPMsg process is the same as IPMSG_SENDMSG with an
                IPMSG_SENDCHECKOPT flag.
                However, Send Message uses an IPMSG_ANSREADMSG command,
                not IPMSG_RECVMSG.

              3) Message Send/Receive 亅encrypted extension (Added in the version-9 )

                Use the combination of Public-key(RSA) and common key(RC2/Blowfish).
                (Encrypted extension area is used in hex format.)

                (Public key acquisition)Send an IPMSG_GETPUBKEY command to Receive
                Message. Receive Message gets an IPMSG_ANSPUBKEY that
                means receiving RSA public key from Send Message.

                IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY both require the value which is
                encryption capability (Exp. IPMSG_RSA_1024) flag uses "OR" at first
                part of extension

                In addition, In IPMSG_ANSPUBKEY, public key written as EE-NNNNNN
                E=Exponent丄N=method)devide by '
            :'. and Input the Fdelimiter '-'
                between E and N.

                This sequence can be skipped after the 2nd Send/Receive process by
                memorizing public key and encrypted data.
               
                (Encrypted message)After a sender creates a common key that is
                supported both sender and receiver, a common key can encrypt a message.
                In addition, a receiver'
            s public key encrypts the common key.


                (Encrypted message transmission) IPMSG_ENCRYPTOPT is used in
                IPMSG_SENDMSG. At the first part of extension, input the value which
                is 'or' resoult from Convination of public key and common key type .
                Then use common key which encrypt with public key devide by ':'.
                Then input message which is eccrypted by public key devide by ':'.
                If both supports IPMSG_SIGN_XXX, then add ':' and signeture.

                Also, In the method of encode padding, PKCS#1ECB key is used for RSA,
                PKCS#5 CBC common key is used for RC2/blowfish.

                Also, The Packet related to Entry manifestation the capability of
                ecryption support using IPMSG_ENCRYPTOPT

              4) Extension with file attachment(Available from version-9 )

                An IPMSG_SENDMSG command with an IPMSG_FILEATTACHOPT flag for
                File transfer (download permission)notification sends a message
                with attachment.
                Input '\0' after the message and attachment file data.
               

                fileID:filename:size:mtime:fileattr[:extend-attr=val1
                [,val2...][:extend-attr2=...]]:\a:fileID...
                (size, mtime, and fileattr describe hex format.
                  If a filename contains ':', please replace with "::".)

                When Receive Message downloads an attachment file, an IPMSG_GETFILEDATA
                command requests a data transmission packet to the TCP port that is the same number
                as the UDP sending port number. Input packetID:fileID: offset to the extended area.
                (Use all hex format.)
                File Transfer side receives the request. After recognizing that it's a correct request,
                then send the specified data (no format)

                When the data receiving side downloads a hierarchical attachment file,
                use an IPMSG_GETDIRFILES command and input a packetID:fileID
                to the extended area and send a data transmission request packet.
                (all hex format)

                Data sending side sends the following hierarchical data format.
                header-size:filename:file-size:fileattr[:extend-attr=val1
                [,val2...][:extend-attr2=...]]:contents-data
                Next headersize: Next filename...
                (All hex format except for filename and contetns-data)

                header-size is from the beginning of header-size to the delimiter '
            :'
                that is before contents-data. extend-attr can be omitted and used multiple
                extended attributes. Use '
            =' for data input.

                When fileattr is IPMSG_FILE_DIR, IPMsg recognizes that it is automatically
                in the directory, the next file data is after the directory.

                When fileattr is IPMSG_FILE_RETPARENT, IMPsg recognizes that it returns
                to the parent directory. In this case, File name is always "." and the attribute
                value is the current directory data.

                Sending process starts from the attachment directly and returns the
                IPMSG_FILE_RETPARENT command to the attachment directory.

                Add an IPMSG_FILEATTACHOPT flag for an Entry packet to support the
                attachment file.

              5) Other commands

                When acquiring different versions, send an IPMSG_GETINFO command.
                Receiving side sends the version information character string to
                extended area.

                Send an IPMSG_GETABSENCEINFO command for acquiring an absence message.
                Receiving side sends an IPMSG_SENDABSENCEINFO back if the status is absence mode.
                If the status is not absence mode, a character string "Not absence mode" will be sent back.

              6) Confirmation/Retry

                If a confirmation packet for IPMSG_SENDMSG or IPMSG_RECVMSG is not delivered
                within a specified time, then it will be sent again.
                A number of retry actions or interval period is depended on the current condition.


            4. Other

              1) Linefeed

                Linefeed characters in Send Message is standardized with UNIX type ('
            0x0a').
                Please change if needed.

              2) Delimiter '
            :'

                '
            :' is used as a delimiter. You can't use this delimiter for user name
                and host name.
                If the use/host names contain a ':', please replace with another sign,
                for an example ';'.
                Although using this delimiter isn

            posted @ 2010-01-07 11:15 ChinaPanda 閱讀(579) | 評(píng)論 (0)編輯 收藏

            2009年12月23日

            ACE about server

                 摘要:   閱讀全文

            posted @ 2009-12-23 15:59 ChinaPanda 閱讀(736) | 評(píng)論 (1)編輯 收藏

            2009年12月8日

            AT&T指令集

                 摘要: GAS中每個(gè)操作都是有一個(gè)字符的后綴,表明操作數(shù)的大小。 C聲明 GAS后綴 大小(字節(jié)) ...  閱讀全文

            posted @ 2009-12-08 15:48 ChinaPanda 閱讀(1875) | 評(píng)論 (1)編輯 收藏

            2009年10月18日

            一致與非一致性代碼段

                 摘要:   閱讀全文

            posted @ 2009-10-18 02:08 ChinaPanda 閱讀(1007) | 評(píng)論 (0)編輯 收藏

            2009年9月27日

            第二章 系統(tǒng)架構(gòu)瀏覽2.5

                 摘要:   閱讀全文

            posted @ 2009-09-27 23:13 ChinaPanda 閱讀(642) | 評(píng)論 (0)編輯 收藏
            copy on write

            copy on write是引用計(jì)數(shù)的概念中的一種重要的實(shí)現(xiàn)技術(shù)。  
               
              對(duì)象之間的復(fù)制只通過(guò)引用計(jì)數(shù)來(lái)表示,內(nèi)部其實(shí)只有一份對(duì)象實(shí)例。一旦對(duì)象發(fā)生變化,才創(chuàng)建對(duì)象,然后復(fù)制原對(duì)象。  
              這可以大大提高效率。

            posted @ 2009-09-27 19:41 ChinaPanda 閱讀(313) | 評(píng)論 (0)編輯 收藏

            2009年9月23日

            CPU結(jié)構(gòu)介紹

            64位處理器

            這里的64位技術(shù)是相對(duì)于32位而言的,這個(gè)位數(shù)指的是CPU GPRs(General-Purpose Registers,通用寄存器)的數(shù)據(jù)寬度為64位,64位指令集就是運(yùn)行64位數(shù)據(jù)的指令,也就是說(shuō)處理器一次可以運(yùn)行64bit數(shù)據(jù)。64bit處 理器并非現(xiàn)在才有的,在高端的RISC(Reduced Instruction Set Computing,精簡(jiǎn)指令集計(jì)算機(jī))很早就有64bit處理器了,比如SUN公司的UltraSparc Ⅲ、IBM公司的POWER5、HP公司的Alpha等。
            64bit計(jì)算主要有兩大優(yōu)點(diǎn):可以進(jìn)行更大范圍的整數(shù)運(yùn)算;可以支持更大的內(nèi)存。不能因?yàn)閿?shù) 字上的變化,而簡(jiǎn)單的認(rèn)為64bit處理器的性能是32bit處理器性能的兩倍。實(shí)際上在32bit應(yīng)用下,32bit處理器的性能甚至?xí)鼜?qiáng),即使是 64bit處理器,目前情況下也是在32bit應(yīng)用下性能更強(qiáng)。所以要認(rèn)清64bit處理器的優(yōu)勢(shì),但不可迷信64bit。
            要實(shí)現(xiàn)真正意義上的64位計(jì)算,光有64位的處理器是不行的,還必須得有64位的操作系統(tǒng)以及 64位的應(yīng)用軟件才行,三者缺一不可,缺少其中任何一種要素都是無(wú)法實(shí)現(xiàn)64位計(jì)算的。目前,在64位處理器方面,Intel和AMD兩大處理器廠商都發(fā) 布了多個(gè)系列多種規(guī)格的64位處理器;而在操作系統(tǒng)和應(yīng)用軟件方面,目前的情況不容樂(lè)觀。因?yàn)檎嬲m合于個(gè)人使用的64位操作系統(tǒng)現(xiàn)在就只有 Windows XP X64,而Windows XP X64本身也只是一個(gè)過(guò)渡性質(zhì)的64位操作系統(tǒng),在Windows Vista發(fā)布以后就將被淘汰,而且Windows XP X64本身也不太完善,易用性不高,一個(gè)明顯的例子就是各種硬件設(shè)備的驅(qū)動(dòng)程序很不完善,而且現(xiàn)在64位的應(yīng)用軟件還基本上沒(méi)有,確實(shí)硬件廠商和軟件廠商 也不愿意去為一個(gè)過(guò)渡性質(zhì)的操作系統(tǒng)編寫(xiě)驅(qū)動(dòng)程序和應(yīng)用軟件。所以要想實(shí)現(xiàn)真正的64位計(jì)算,恐怕還得等到Windows Vista普及一段時(shí)間之后才行。
            目前主流CPU使用的64位技術(shù)主要有AMD公司的AMD64位技術(shù)、Intel公司的 EM64T技術(shù)、和Intel公司的IA-64技術(shù)。其中IA-64是Intel獨(dú)立開(kāi)發(fā),不兼容現(xiàn)在的傳統(tǒng)的32位計(jì)算機(jī),僅用于Itanium(安 騰)以及后續(xù)產(chǎn)品Itanium 2,一般用戶不會(huì)涉及到,因此這里僅對(duì)AMD64位技術(shù)和Intel的EM64T技術(shù)做一下簡(jiǎn)單介紹。
            AMD64位技術(shù)
            AMD64的位技術(shù)是在原始32位X86指令集的基礎(chǔ)上加入了X86-64擴(kuò)展64位X86指 令集,使這款芯片在硬件上兼容原來(lái)的32位X86軟件,并同時(shí)支持X86-64的擴(kuò)展64位計(jì)算,使得這款芯片成為真正的64位X86芯片。這是一個(gè)真正 的64位的標(biāo)準(zhǔn),X86-64具有64位的尋址能力。
            X86-64新增的幾組CPU寄存器將提供更快的執(zhí)行效率。寄存器是CPU內(nèi)部用來(lái)創(chuàng)建和儲(chǔ)存 CPU運(yùn)算結(jié)果和其它運(yùn)算結(jié)果的地方。標(biāo)準(zhǔn)的32-bit x86架構(gòu)包括8個(gè)通用寄存器(GPR),AMD在X86-64中又增加了8組(R8-R9),將寄存器的數(shù)目提高到了16組。X86-64寄存器默認(rèn)位 64-bit。還增加了8組128-bit XMM寄存器(也叫SSE寄存器,XMM8-XMM15),將能給單指令多數(shù)據(jù)流技術(shù)(SIMD)運(yùn)算提供更多的空間,這些128位的寄存器將提供在矢量 和標(biāo)量計(jì)算模式下進(jìn)行128位雙精度處理,為3D建模、矢量分析和虛擬現(xiàn)實(shí)的實(shí)現(xiàn)提供了硬件基礎(chǔ)。通過(guò)提供了更多的寄存器,按照X86-64標(biāo)準(zhǔn)生產(chǎn)的 CPU可以更有效的處理數(shù)據(jù),可以在一個(gè)時(shí)鐘周期中傳輸更多的信息。
            EM64T技術(shù)
            Intel官方是給EM64T這樣定義的:EM64T全稱Extended Memory 64 Technology,即擴(kuò)展64bit內(nèi)存技術(shù)。EM64T是Intel IA-32架構(gòu)的擴(kuò)展,即IA-32e(Intel Architectur-32 extension)。IA-32處理器通過(guò)附加EM64T技術(shù),便可在兼容IA-32軟件的情況下,允許軟件利用更多的內(nèi)存地址空間,并且允許軟件進(jìn)行 32 bit線性地址寫(xiě)入。EM64T特別強(qiáng)調(diào)的是對(duì)32 bit和64 bit的兼容性。Intel為新核心增加了8個(gè)64 bit GPRs(R8-R15),并且把原有GRPs全部擴(kuò)展為64 bit,如前文所述這樣可以提高整數(shù)運(yùn)算能力。增加8個(gè)128bit SSE寄存器(XMM8-XMM15),是為了增強(qiáng)多媒體性能,包括對(duì)SSE、SSE2和SSE3的支持。
            Intel為支持EM64T技術(shù)的處理器設(shè)計(jì)了兩大模式:傳統(tǒng)IA-32模式(legacy IA-32 mode)和IA-32e擴(kuò)展模式(IA-32e mode)。在支持EM64T技術(shù)的處理器內(nèi)有一個(gè)稱之為擴(kuò)展功能激活寄存器(extended feature enable register,IA32_EFER)的部件,其中的Bit10控制著EM64T是否激活。Bit10被稱作IA-32e模式有效(IA-32e mode active)或長(zhǎng)模式有效(long mode active,LMA)。當(dāng)LMA=0時(shí),處理器便作為一顆標(biāo)準(zhǔn)的32 bit(IA32)處理器運(yùn)行在傳統(tǒng)IA-32模式;當(dāng)LMA=1時(shí),EM64T便被激活,處理器會(huì)運(yùn)行在IA-32e擴(kuò)展模式下。
            目前AMD方面支持64位技術(shù)的CPU有Athlon 64系列、Athlon FX系列和Opteron系列。Intel方面支持64位技術(shù)的CPU有使用Nocona核心的Xeon系列、使用Prescott 2M核心的Pentium 4 6系列和使用Prescott 2M核心的P4 EE系列。


            IA-32(Intel Architecture-32)稱為英特爾32位結(jié)構(gòu),表示指令集結(jié)構(gòu)ISA(Instruction Set Architecture)。

            IA-32處理器(或稱32位80x86處理器)就是指具有該指令集結(jié)構(gòu)的處理器,例如英特爾公司的80386、80486以及Pentium各代處理器。AMD的32位處理器兼容這個(gè)結(jié)構(gòu)。

            posted @ 2009-09-23 00:10 ChinaPanda 閱讀(445) | 評(píng)論 (0)編輯 收藏

            2009年9月22日

            第二章 系統(tǒng)架構(gòu)瀏覽2.2-2.4小節(jié)

                 摘要: v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} Normal 0 7.8 磅 0 2 false false false ...  閱讀全文

            posted @ 2009-09-22 23:59 ChinaPanda 閱讀(794) | 評(píng)論 (0)編輯 收藏
            僅列出標(biāo)題  下一頁(yè)
            久久久久久久97| 欧美精品一区二区久久| 精品久久久无码人妻中文字幕豆芽| 久久精品国产亚洲AV蜜臀色欲| 中文字幕久久精品无码| 天堂久久天堂AV色综合| 潮喷大喷水系列无码久久精品| 久久中文娱乐网| 久久经典免费视频| 久久99精品久久久久久动态图| 国产午夜精品理论片久久影视| a级毛片无码兔费真人久久| 亚洲国产视频久久| 久久精品九九亚洲精品| 久久精品国产99久久香蕉| 久久天天躁狠狠躁夜夜躁2014| 久久精品人成免费| 色婷婷噜噜久久国产精品12p| 无码人妻久久一区二区三区| 一本色道久久88加勒比—综合| 天天影视色香欲综合久久| 久久精品国产99国产精品亚洲 | 精品久久一区二区| 蜜臀久久99精品久久久久久| 久久久国产乱子伦精品作者| 久久夜色撩人精品国产| 国产91色综合久久免费分享| 香蕉久久久久久狠狠色| 91精品国产高清久久久久久91| 久久久噜噜噜久久中文字幕色伊伊| 久久精品国产99国产精品澳门| 国产精品成人久久久| 亚洲精品国产成人99久久| 久久亚洲精品国产精品婷婷| 久久国产精品一区二区| 日韩久久无码免费毛片软件| 国产精品免费看久久久| 午夜精品久久久久久久无码| 色综合久久久久网| 色欲综合久久躁天天躁蜜桃| 国产精品嫩草影院久久|