• <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

            統計

            • 隨筆 - 21
            • 文章 - 0
            • 評論 - 2
            • 引用 - 0

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            2010年10月25日

            Linux 中 x86 的內聯匯編

            如果您是 Linux 內核的開發人員,您會發現自己經常要對與體系結構高度相關的功能進行編碼或優化代碼路徑。您很可能是通過將匯編語言指令插入到 C 語句的中間(又稱為內聯匯編的一種方法)來執行這些任務的。讓我們看一下 Linux 中內聯匯編的特定用法。(我們將討論限制在 IA32 匯編。)

            GNU 匯編程序簡述

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

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

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

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

            操作數大小
            根據操作數是字節 (byte)、字 (word) 還是長型 (long),指令的后綴可以是 b、w 或 l。這并不是強制性的;GCC 會嘗試通過讀取操作數來提供相應的后綴。但手工指定后綴可以改善代碼的可讀性,并可以消除編譯器猜測不正確的可能性。

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

            立即操作數
            通過使用 $ 指定直接操作數。

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

            間接內存引用
            任何對內存的間接引用都是通過使用 ( ) 來完成的。

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


            內聯匯編

            GCC 為內聯匯編提供特殊結構,它具有以下格式:

            GCG 的 "asm" 結構

               asm ( assembler template

            : output operands (optional)

            : input operands (optional)

            : list of clobbered registers
            (optional)

            );

            本例中,匯編程序模板由匯編指令組成。輸入操作數是充當指令輸入操作數使用的 C 表達式。輸出操作數是將對其執行匯編指令輸出的 C 表達式。

            內聯匯編的重要性體現在它能夠靈活操作,而且可以使其輸出通過 C 變量顯示出來。因為它具有這種能力,所以 "asm" 可以用作匯編指令和包含它的 C 程序之間的接口。

            一個非?;镜苤匾膮^別在于 簡單內聯匯編只包括指令,而 擴展內聯匯編包括操作數。要說明這一點,考慮以下示例:

            內聯匯編的基本要素

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

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

            在上例中,我們使用匯編指令使 "b" 的值等于 "a"。請注意以下幾點:

            • "b" 是輸出操作數,由 %0 引用,"a" 是輸入操作數,由 %1 引用。
            • "r" 是操作數的約束,它指定將變量 "a" 和 "b" 存儲在寄存器中。請注意,輸出操作數約束應該帶有一個約束修飾符 "=",指定它是輸出操作數。
            • 要在 "asm" 內使用寄存器 %eax,%eax 的前面應該再加一個 %,換句話說就是 %%eax,因為 "asm" 使用 %0、%1 等來標識變量。任何帶有一個 % 的數都看作是輸入/輸出操作數,而不認為是寄存器。
            • 第三個冒號后的修飾寄存器 %eax 告訴將在 "asm" 中修改 GCC %eax 的值,這樣 GCC 就不使用該寄存器存儲任何其它的值。
            • movl %1, %%eax 將 "a" 的值移到 %eax 中, movl %%eax, %0 將 %eax 的內容移到 "b" 中。
            • 因為 "b" 被指定成輸出操作數,因此當 "asm" 的執行完成后,它將反映出更新的值。換句話說,對 "asm" 內 "b" 所做的更改將在 "asm" 外反映出來。

            現在讓我們更詳細的了解每一項的含義。


            匯編程序模板

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

            如果希望確保編譯器不會在 "asm" 內部優化指令,可以在 "asm" 后使用關鍵字 "volatile"。如果程序必須與 ANSI C 兼容,則應該使用 __asm__ 和 __volatile__,而不是 asm 和 volatile。


            操作數

            C 表達式用作 "asm" 內的匯編指令操作數。在匯編指令通過對 C 程序的 C 表達式進行操作來執行有意義的作業的情況下,操作數是內聯匯編的主要特性。

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

            可以在輸入和輸出部分中同時使用多個操作數。每個操作數由逗號分隔開。

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


            修飾寄存器列表

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

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


            操作數約束

            前面提到過,"asm" 中的每個操作數都應該由操作數約束字符串描述,后面跟用括弧括起的 C 表達式。操作數約束主要是確定指令中操作數的尋址方式。約束也可以指定:

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

            約束還要求兩個操作數匹配。


            常用約束

            在可用的操作數約束中,只有一小部分是常用的;下面列出了這些約束以及簡要描述。有關操作數約束的完整列表,請參考 GCC 和 GAS 手冊。

            寄存器操作數約束 (r)
            使用這種約束指定操作數時,它們存儲在通用寄存器中。請看下例:

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

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

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

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

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

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

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

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

            • 輸入從變量中讀取,或者變量被修改后,修改寫回到同一變量中
            • 不需要將輸入操作數和輸出操作數的實例分開

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


            一般內聯匯編用法示例

            以下示例通過各種不同的操作數約束說明了用法。有如此多的約束以至于無法將它們一一列出,這里只列出了最經常使用的那些約束類型。

            "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 的值復制為 "asm" 中的 y。x 和 y 都通過存儲在寄存器中傳遞給 "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 */

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

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

            因為 %eax 是在修飾列表中指定的,GCC 不在任何其它地方使用它來存儲數據。

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

            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 存儲在 "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)


            特定寄存器約束的使用

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

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

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

            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 函數可以通過以下方式使用 "S" 和 "D" 約束來實現:

            asm ("cld\n

            rep\n

            movsb"

            : /* no input */

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

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

            在下面可以看到另一個約束,它使用兩個寄存器 %eax 和 %edx 將兩個 32 位的值合并在一起,然后生成一個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.


            使用匹配約束

            在下面將看到系統調用的代碼,它有四個參數:

            #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); \
            }

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


            內存操作數約束的使用

            請考慮下面的原子遞減操作:

            __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 的值必須先復制到寄存器,遞減,然后對其內存更新。但這樣您會無法理解鎖定和原子性的全部意圖,這些明確顯示了使用內存約束的必要性。


            使用修飾寄存器

            請考慮內存拷貝的基本實現。

               asm ("movl $count, %%ecx;

            up: lodsl;

            stosl;

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

            當 lodsl 修改 %eax 時,lodsl 和 stosl 指令隱含地使用它。%ecx 寄存器明確裝入 count。但 GCC 在我們通知它以前是不知道這些的,我們是通過將 %eax 和 %ecx 包括在修飾寄存器集中來通知 GCC 的。在完成這一步之前,GCC 假設 %eax 和 %ecx 是自由的,它可能決定將它們用作存儲其它的數據。請注意,%esi 和 %edi 由 "asm" 使用,它們不在修飾列表中。這是因為已經聲明 "asm" 將在輸入操作數列表中使用它們。這里最低限度是,如果在 "asm" 內部使用寄存器(無論是明確還是隱含地),既不出現在輸入操作數列表中,也不出現在輸出操作數列表中,必須將它列為修飾寄存器。


            結束語

            總的來說,內聯匯編非常巨大,它提供的許多特性我們甚至在這里根本沒有涉及到。但如果掌握了本文描述的基本材料,您應該可以開始對自己的內聯匯編進行編碼了。


            參考資料

            posted @ 2010-10-25 11:28 ChinaPanda 閱讀(298) | 評論 (0)編輯 收藏

            2010年1月11日

            飛鴿協議以及其使用的UDP數據包格式和文件傳輸邏輯

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

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

            2010年1月7日

            轉 部分飛鴿協議


            最近看到一些朋友在編寫網絡程序是遇到一些問題,故把以前做IPMSG時翻譯的文檔貼過來,希望對網絡編程新手有所幫助,在尋找編程項目的同學們也可參照此文檔寫出自己的IPMSG。

            本文只包含其中幾個比較重要的命令以及運行機制的中文翻譯,更詳細的內容請參照文后的IPMSG 協議英文文檔

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

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

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


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

            附IPMSG協議英文版:



            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) | 評論 (0)編輯 收藏

            2009年12月23日

            ACE about server

                 摘要:   閱讀全文

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

            2009年12月8日

            AT&T指令集

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

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

            2009年10月18日

            一致與非一致性代碼段

                 摘要:   閱讀全文

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

            2009年9月27日

            第二章 系統架構瀏覽2.5

                 摘要:   閱讀全文

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

            copy on write是引用計數的概念中的一種重要的實現技術。  
               
              對象之間的復制只通過引用計數來表示,內部其實只有一份對象實例。一旦對象發生變化,才創建對象,然后復制原對象。  
              這可以大大提高效率。

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

            2009年9月23日

            CPU結構介紹

            64位處理器

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


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

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

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

            2009年9月22日

            第二章 系統架構瀏覽2.2-2.4小節

                 摘要: 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) | 評論 (0)編輯 收藏
            僅列出標題  下一頁
            久久国产劲爆AV内射—百度| 91精品国产91久久综合| 国产精品久久久亚洲| 青青草原综合久久大伊人| 欧美一级久久久久久久大片| 久久国产精品二国产精品| 999久久久国产精品| 精品久久久久久久中文字幕| 久久九九免费高清视频| 久久久青草青青国产亚洲免观| 久久国产V一级毛多内射| 久久久综合香蕉尹人综合网| 亚洲欧美另类日本久久国产真实乱对白 | 亚洲精品乱码久久久久久不卡| 青青热久久国产久精品| 午夜精品久久久久久久无码| 久久亚洲AV无码精品色午夜| 色欲久久久天天天综合网| 成人久久久观看免费毛片| 久久久精品免费国产四虎| 久久成人18免费网站| 久久中文字幕人妻丝袜| 久久精品国产亚洲AV高清热| 精品久久人人做人人爽综合| 久久久久久久女国产乱让韩| 久久国产热精品波多野结衣AV| 亚洲精品高清国产一久久| 国产精品久久久久蜜芽| 久久精品国产精品亚洲精品| 欧美与黑人午夜性猛交久久久| 久久久久人妻一区精品色| 国产亚洲美女精品久久久| 亚洲精品乱码久久久久久蜜桃不卡| 久久精品无码专区免费青青 | 亚洲国产精品热久久| 亚洲伊人久久成综合人影院| .精品久久久麻豆国产精品| 中文字幕久久亚洲一区| 久久er国产精品免费观看2| 狠狠色丁香婷婷久久综合五月| 成人资源影音先锋久久资源网|