X Server除了負責螢幕的繪圖動作,同時還負責mouse, keyboard的輸入,將這些輸入動作經由socket利用event傳給 client。
X Sever太大了,所以拿nanaX 的code來看。配合 "X Windows System Protocol"
srvmain.c 的 GsSelect( ) 中的GsHandleClient( ) 負責從stream中讀取command,parse and execute.
GsHandleClient 中 的nxReq 就是Request : ref protocol "Request Format"
typedef struct {reqType : opcode , 128 ~255 reserved for extension.
BYTE8 reqType; // opcode
BYTE8 hilength;
UINT16 length;
} nxReq;
extension 的定義不在X protocl 的core protocol定義中。
hilength - length 合併成一個24 bit的data,代表request packet的length (這個跟X protocol 講的好像不一樣,X protocol用一個16 bit的欄位代表,單位是4 bytes)。
ref /usr/X11R6/include/X11/Xproto.h 有類似的宣告:
typedef struct _xReq {接下來 Xproto.h 就宣告"Request codes",定義了1~127 的Code Name (Operation)。
CARD8 reqType;
CARD8 data;
CARD16 length B16;
} xReq;
這127個 operation 就是X Server提供的core protocol (?),可以對照pdf sect.9 的內容,解釋每個operation的動作和argument。
從這裡可以看到XServer提供的功能都是很基本的 。
--- 從Wiki上查到。X protocol 能一直維持 128個,不被增加的原因是X Server的設計理念: "如果不是 非他不可, 否則不用把他加進來"。
效能瓶頸大概有兩部份:
- Client/Server架構,decode/decode和透過socket傳輸,比較花時間。
- X Server本身提供的command很少。沒有辦法利用到hardware加速功能。
Client/Server架構就....不知道要怎麼解決了...
沒有留言:
張貼留言