logo资料库

X windows server 2D加速EXA框架官方文档.pdf

第1页 / 共38页
第2页 / 共38页
第3页 / 共38页
第4页 / 共38页
第5页 / 共38页
第6页 / 共38页
第7页 / 共38页
第8页 / 共38页
资料共38页,剩余部分请下载后查看
引言
X系统基本概念
X系统软件体系结构
准备源码
源码目录结构
XServer代码框架
八类资源
其他数据结构
资源管理
资源的组织
DIX层
main函数
初始化中的各层交互
InitExtensions
Dispatch事件循环
OS 层
调度和请求交付
新客户连接的建立
BlockHandler
DDX 层
数据结构
输入
输出
ephyr
其他
Wrappers 和 devPrivates
devPrivates
Wrappers
工作队列 WorkQueue
Understanding X From Source Code THOSS X Group blc03@mails.tsinghua.edu.cn December 21, 2006 Contents 1 ାṌ 1.1 X㈧㐋ദ᱘Ắᔡ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 X㈧㐋䒛Тѿ㈧㏿Ჰ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 ۲ำ⎼ⴭ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4 ⎼ⴭⰚᒁ㏿Ჰ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 XServerκᘶྑཐ 2.1 ڗㆧ䉰⎼ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 ڢЂ᪜ᢚ㏿Ჰ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 䉰⎼ネ⤲ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.4 䉰⎼⮰㏰㏳ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 DIX਒ 3.1 mainܩ᪜ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.1 ݉໷ࡂ͙⮰रᅮϐξ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 DispatchηТᓖ⣛ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . InitExtensions 4 OS ਒ 4.1 䄯Ꮢস䄣ⅮϐЄ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 ᫜჎ᝣ䔊ᣑ⮰ᐦ⿷ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 BlockHandler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 DDX ਒ 5.1 ᪜ᢚ㏿Ჰ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 䒿ڑ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 䒿ܦ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ephyr 6 ӱβ 6.1 Wrappers সdevPrivates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.1 devPrivates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.1.2 Wrappers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 ጑҈䭋݃WorkQueue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 4 4 4 5 6 8 9 11 12 12 14 14 15 18 18 21 24 25 25 25 28 32 36 36 36 36 36 1
զṌ 䔅ン᪳ᶏᄲϺX⮰⎼ⴭܦࣽ⌝ڑ⮰㔯ᄋX᰹ߍஔर⻹ദ᱘Ắᔡࣶڢ჊⣜᫥ᐻȠϺ͙喏᜽Иᄲⰷݜ ̬͖ᵸ䲎㈧㐋⮰ദ⵬ᵲ᳢᭛ຮҁ䃪䃍স჊⣜喏⌝ڑ⮰ܲ᲼ᄲҫ᜽И႒ݜ⣹䉡⮰㈧㐋䃪䃍⮰र⻹᫥ ∁ȟ㑂⼷⮰र⻹ឬጓȟ᫥ᵴं㜹⮰र⻹࣋݅Ƞ ⩝κर⻹Ắᔡ⮰ϐࣵ喏ߌ̶᪳ᶏ⮰̹᜼⛋喏䔅ン᪳ᶏᰬҟ⮰䬱䄧᫥ᐻຮ̷喝 Figure 1: 䬱䄧᫥∁ ౔ऺ㐙⮰「㞮͙喏᜽И౔⃻̬「⮰ᐬ๠᣼ܦ䔅̬「ᄲ㺭㼏۟⮰䬚䷄喏♢ऺڹ㏿ऴ⎼ⴭ⮰ܲ᲼স䬼 䛶͙ఊむ䔅χ䬚䷄Ƞ᪠ン᪳ᶏ⮰Ⱊᴳ࠱᠘喝 • ⌝ڑ⤲㼏XẮᔡ • ᢸᤍX᰹ߍஔ⮰Џⴭ 2
• ႒Ό㈧㐋䃪䃍᫥∁, ⛋ᖵ፤⩔⮰㑂⼷ឬጓ,႒ц჊⣜᫥ᵴ⮰ं㜹࣋݅ 1 ାṌ ౔じ̬「͙喏᜽ИᄲⰷⰷX⮰ദ᱘పᮛ喝X⮰ദ᱘Ắᔡসദ᱘㏿ᲰȠ㔯㭽ݜ䔅᭛̬ンڟκX⎼ⴭ⮰ ᪳ᶏ喏ఌₐ喏䔅䛸̹ц㐅ܦ๖ๆ⮰㏲㞮喏Ꭲ̀᜽Иц㏿ऴЏⴭᲑ㔯ᄋ䔅̬ദ᱘పᮛȠ 1.1 Xᠿᤱࡏ༊ဉய X᭛ู̬͖ᱮ⮰㈧㐋喏Ѳ᭛Ⴏᝬദκ⮰ദ᱘Ắᔡࢠガࢁᬿᛮ: • DisplaysসScreens: ᭪⹦㈧㐋সᅻᎁ • Server-Clinet Model: ᰹ߍஔ-჎ᝣ〛Ὅಷ • Window Management: ⿃एネ⤲ • Events: ηТ • X Extensions: Xផᆁ ສᚵᠿᤱڝਛૡ ౔X㈧㐋͙喏᭪⹦㈧㐋㷗჆͵ͦ⩝̬͖䩚Ⰴȟ̬͖呌ᴳȟ̬͖ᝂๆ͖ᅻᎁ㏰᜼⮰጑҈々Ƞ ໼֌ޜ-হ಻ᝩ၇ࠤ X᭛䲎ऽ㑽㐈⮰⿃ए㈧㐋喏̬͖Ꮐ⩔⼷Ꮋ̹䰬㺭౔჊䭱Ⴘ᜼᭪⹦⮰጑҈々̶䓼㵸喏ႯछБ҈ͦ჎ ᝣ〛䓼㵸౔䔈⼷ᱦஔ̶ȠX᰹ߍஔ䓼㵸κ᱘౜, ᣓݢ⼷Ꮋ⮰᭪⹦Ꭲ㣣ᓃ⩔ᝣ⮰䒿ڑȠ͐㔱䬠⮰ϐξ 䕆䓳ⰤᏀ⮰ࡻ䃚౔㑽㐈̶ь䒿Ƞ჎ᝣ〛䓼㵸κ䔈⼷喏᰹ߍஔ䓼㵸κ᱘౜喏䔅᭛̺ᮚ䕆⮰᰹ߍஔ-჎ ᝣ〛Ὅಷ⮰䛹㺭ࡦݗȠ ᣓݢ᭪⹦⮰⼷Ꮋ㷗⼜̬͖ͦ᰹ߍஔ(server), Ⴏ䰬㺭Ⴘ᜼⮰጑҈࠱᠘: 1. ᣓݢ᭪⹦㈧㐋喏٭䃤ๆ͖჎ᝣ⼷Ꮋ⮰䃫䬚Ƞ 2. ា⩔ᝣ䒿ڑь䔾㐅ⰤᏀ⮰჎ᝣȠ 3. 㼏䛶Ꭲន㵸Ბ㜖჎ᝣ⮰䄣ⅮȠ 4. 㐠័ูᱮ⮰᪜ᢚ㏿ᲰȠ ᝂسាᑩ ౔X㈧㐋͙喏̬͖Ꮐ⩔⼷ᎻᎢ̹჊䭱ᣓݢ⿃ए౔ਖ䛸᭪⹦ȟ๓ᄻ᭛ๆᄽふふηᗱȠ⩝κๆ͖ ჎ᝣ⮰ႄ౔喏̬͖჎ᝣ̹㘩Ӊ䊂κ➥჆⮰⿃ए䙹㒚喏Ⴏख㘩ॶ䃵Ⴏᝬጸ᱇⮰᭪⹦⮰ѹ㒚স ๓ᄻȠᅻᎁ⮰ጯᅬБࣶ⩔ᝣ⮰ϐξ᫥ᐻ⩝̬͖ࢁ⠘⮰⼷Ꮋᣓݢ喏⼜ͷͦ⿃एネ⤲ஔ(window manager)Ƞ ⿃एネ⤲ஔ჊䭱̶΋᭛ҫ⩔βXlib㑂ۅ⮰̬͖Ꮐ⩔⼷Ꮋ喏̹䓳Ⴏ㷗䉷δβ➥₶⮰ᱯ䭼喏Бӫネ⤲ ᅻᎁ̶⿃एጯᅬȠ 3
ͽυ X೒ਞ X㈧㐋᭛छផᆁ⮰喏Ⴏ჆͵β̬຃ផᆁᱦݢȠᎢ̹᭛⃻͖᰹ߍஔ䘩ᩛᠭᝬᰵ⮰ផᆁ喏ᝬБᏀ⩔⼷ Ꮋ౔ҫ⩔̬͖ផᆁ⮰ᬢՅ喏ᓱ䶧仂ٴ䄎䬚᰹ߍஔ᭛॒᣼Ӈ䄑ផᆁȠ 1.2 Xᠿᤱℒυϵᠿᤥ༶ 1.3 Ԝࢵሾᘶ छБݜXorg々◥࣮㔯⎼ⴭ⮰̷䒩স㑂䃽᫥∁: ⁎䓺ា㑂䃽͙䕳ݜ⮰䬚䷄ᩪݜ❴̶1䃔䃦ȠᎢᄲ䃔䃦⮰㏿᳈ߌڑݜ䔅ン᪳ᶏ͙ᲑȠ http://wiki.x.org/wiki/ModularDevelopersGuide ᣔ㡼ҫ⩔kscope䬱䄧⎼ⴭ喏ႯӉ䊂κcscope, dot, ctags̵͖⼷ᎻȠ 1.4 ሾᘶᗇଡ଼ᤥ༶ app 䔅͖Ⱊᒁ̷࠱ॗ̬χXᏀ⩔⼷Ꮋ喏࠱᠘twm䔅͖ᰬガࢁ⮰⿃एネ⤲ஔȠ doc 䔅͖Ⱊᒁ̷࠱ॗ⮰᪳ᶏ࠱᠘Xࡻ䃚㻰㠯喏X䘔ܲὍಃ(℀ຮႵڔὍಃ)ふ⮰䃪䃍᪳ᶏ喏Ѳ᭛㑦 ͻᄥXserver᪠ѿ䃪䃍⮰᣻䔜Ƞऒโ喏Xlib⮰࣮㔯᝷ڸछБ౔xorg-docs/hardcopy/X11 ̷ ឪݜȠ xserver 䔅͖Ⱊᒁ̷࠱ॗxserver⮰⎼ЏⴭȠ lib ࠱ॗX᰹ߍஔ䰬㺭ҫ⩔⮰Ꮏ喏ᰵχᎿ჊䭱̶ख㘩㷗X᰹ߍஔЏⴭҫ⩔喏ᄲႯИ⠘⿷ܦᲑ᭛ͦ βᰠຩ⮰ὍಃࡂȠ 1http://www.newsmth.org/bbsdoc.php?board=THOSS 4
2 XServerκᘶྑཐ xserverⰚᒁ̷࠱ॗๆ͖X᰹ߍஔ⮰⎼ⴭ喏࠱᠘Xorg, Xnestসദκkdrive⮰ๆ͖᰹ߍஔȠ X᰹ߍஔ⮰Џⴭܲͦఇ͖䘔ܲ㏰㏳喝 • 䃪ำᬌڟᅮ(DIX), 䔅̬䘔ܲ⮰Џⴭ㷗ᝬᰵXserver⮰჊⣜ڝϗȠ • ᧹҈㈧㐋ᅮ(OS), 䔅̬䘔ܲ⮰Џⴭ䮻ⱬ᧹҈㈧㐋⮰̹स㔸̹स喏Ѳ᭛㷗䔅͖᧹҈㈧㐋̶⮰ప ᒎ䃪ำڝϗȠ • 䃪ำⰤڟᅮ(DDX), 䔅̬䘔ܲ䮻ⱬ᧹҈㈧㐋সపᒎ䃪ำ⮰㏰ऴ⮰̹स㔸̹सȠ • ផᆁᣑए喏䔅̬䘔ܲͦ⩔㐋̬⮰᫥ᐻऽX serverߌڑ᫜⮰ߋ㘩᣼ӇᩛᠭȠ DIXᅮᰵຮ̷⮰ڗㆧ䉰⎼: • Window • Pixmap • Screen • Device • Colormap • Font • Cursor • Graphics Contexts ⃻⻹䉰⎼⩔ⰤᏀ⮰struct㶔⹦喏ڢ͙࠱᠘̵͖䘔ܲ喝 • ᆊᕓ⃡喏⩔κԉႄⰤᏀ⮰ԍᖛȠ • ܩ᪜ᠳ䦴 • ⻭ᰵႃ⃡喏DDXЏⴭ⩔ᲑԉႄѨᰵ᪜ᢚȠ 䔅χ㏿Ჰ჆͵౔ᰵᄥᏀह⼜⮰͖͐.h᪳Тڱ喏℀ຮscreenᄥᏀκscreenint.hসscrnintstr.hȠ screenint.h჆͵โ䘔ҫ⩔ᬢ䰬㺭⮰㏿Ჰসܩ᪜࣋ಷ喏Ѳ̹ᯠ䱞ڱ䘔⮰჊⣜; scrnintstr.h ͙჆ ͵ڱ䘔჊⣜⩔⮰᪜ᢚ㏿ᲰȠ DIX䕆䓳䄯⩔㏿Ჰ⮰ܩ᪜ᠳ䦴ᲑႸ᜼Ⴏ⮰጑҈Ƞ䔅χᠳ䦴⩝DDXⰠᣑᝂ䬠ᣑ⮰䃪჆Ƞᆊᕓ̬⃡㝘 ⩝DIXᅮ䃪჆喏DDX̹㘩ԚᩥႯИȠ DIXЏⴭᩪ㒚౔dix/Ⱊᒁ̷喏ԉ᠘ main.c window.c colormap.c, dispatch.c, events.c ... ⃻͖XẮᔡ喏ദ᱘̶䘩ᰵ̬͖ᄥᏀ⮰჊⣜᪳ТȠ ᰹ߍஔⰤڟ䘔ܲ⮰Џⴭᩪ㒚౔hw/Ⱊᒁ̷Ƞڢ͙喏hw/xfree86/Ⱊᒁ̷࠱ॗβXorg⮰Џⴭ; hw/kdrive̷ ࠱᠘βദκkdrive⮰ๆ͖᰹ߍஔȠ⩝κദκkdrive⮰᰹ߍஔ℀䒯⮰ガࢁ喏᜽ИᄲϺڢ͙⮰̬ ͖Xephyrڑ᝷Ƞڟκ䔅͖᰹ߍஔ⮰䄠ᬺ喏छБ࣮㻭hw/kdrive/ephyr/README, 䔅䛸ᑁ⩔̬䘔 ܲ: Xephyr is a a kdrive server that outputs to a window on a pre-existing ’host’ X display. Think Xnest but with support for modern extensions like composite, damage and randr. Unlike Xnest which is an X proxy, i.e. limited to the capabilities of the host X server, Xephyr is a real X server which uses the host X server window as "framebuffer" via fast SHM XImages. 5
It also has support for ’visually’ debugging what the server is painting. kdrive⮰Ϸ㏹छБ࣮㻭ⰤᏀ⮰man᪳Т,hw/kdrive/Xkdrive.man: man ./Xdrive.man 2.1 Ө᠋‚ሾ ̷䲎᜽И䕆䓳ᆁ⹦ⰤᏀ⮰᪜ᢚ㏿ᲰᲑ᥊⌱Ẇڗ⻹䉰⎼᭛ຮҁ౔X㈧㐋͙㐠័Ƞ Screen Xᩛᠭ̬͖᭪⹦㈧㐋࠱ॗๆ͖ᅻᎁȠะ⤲ᅻᎁᝬ䰬㺭⮰᪜ᢚԍᖛ㷗࠱ॗ౔ScreenRec ͙(xserver/- include/scrnintstr.h): typedef struct _Screen { int ATOM short short short unsigned char DepthPtr unsigned long unsigned long ... myNum; /* index of this instance in Screens[] */ id; width, height; mmWidth, mmHeight; numDepths; rootDepth; allowedDepths; rootVisual; defColormap; /* anybody can get a piece of this array */ DevUnion ... *devPrivates; CloseScreen; /* Random screen procedures */ CloseScreenProcPtr ... /* Window Procedures */ /* Pixmap procedures */ /* Font procedures */ /* Cursor Procedures */ ... } ScreenRec; ຮݹ䲎ᝬϷ㏹⮰喏ScreenᄥᏀ⮰㏿Ჰ࠱ॗ̵͖䘔ܲ喝 • ᆊᕓ⃡: ԉႄԍᖛȠ • ܩ᪜ᠳ䦴: ᠳऽႸ᜼ⰤᏀ⮰᧹҈ᝬ⩔⮰ҷ⼷喏⩝DDXЏⴭ䃪჆Ƞ • ⻭ᰵႃ⃡喏DDXЏⴭ⩔Ბԉႄ⻭ᰵ᪜ᢚȠ ڔᅬऄ䛻screenInfoԉႄβᠳऽᝬᰵScreenRec⮰ᠳ䦴᪜㏰: typedef struct _ScreenInfo { int int int int imageByteOrder; bitmapScanlineUnit; bitmapScanlinePad; bitmapBitOrder; 6
int PixmapFormatRec numPixmapFormats; int int ScreenPtr int } ScreenInfo; formats[MAXFORMATS]; arraySize; numScreens; screens[MAXSCREENS]; numVideoScreens; extern ScreenInfo screenInfo; सᬢ喏screenInfo΋ԉႄβ䄤ຮbitmap⮰bit-orderふ⮰ڔᅬ䙹㒚Ƞ Device Window,Pixmap,Drawable WindowসPixmap䘩᭛Drawable⮰ၼㆧ喏drawableछБ㻲̬͖ͦछБ౔ڢ㶔䲎⩧ప⮰᎟䲎喏Ⴏᝂ 㔱᭛̬͖ᅻᎁ̶⮰window, ᝂ㔱᭛̬͖ڱႄ͙pixmapȠ drawableᄥᏀ⮰᪜ᢚ㏿Ჰຮ̷(include/pixmapstr.h): typedef struct _Drawable { unsigned char unsigned char unsigned char unsigned char XID short short unsigned short unsigned short ScreenPtr unsigned long } DrawableRec; /* DRAWABLE_ */ type; class; /* specific to type */ depth; bitsPerPixel; id; x; y; width; height; pScreen; serialNumber; /* resource id */ /* window: screen absolute, pixmap: 0 */ /* window: screen absolute, pixmap: 0 */ typeႃ⃡⮰ंըͦDRAWABLE_PIXMAP, DRAWABLE_WINDOW, UNDRAWABLE_WINDOW; UNDRAWABLE_WINDOW⩔ κᴳ䃲InputOnlyㆧಷ⮰windowȠserialNumber ႃ⃡⮰ंը౔ᝬᰵ⮰drawable͙ਜ਼̬喏Ⴏ⩔κ⶚ 䃐GC͙㷭ޖԍᖛ⮰ᰵᩴᕓȠScreen͙ⰤᏀ⮰ܩ᪜ᠳ䦴ᠳऽβ⩔κ᧹҈drawable⮰ҷ⼷ȠpScreenႃ ⃡ᠳऽ䔅͖drawableڟ㖀⮰screenȠ pixmap㏿Ჰ჆͵ຮ̷喝 typedef struct _Pixmap { DrawableRec int int DevUnion #ifdef COMPOSITE short short #endif } PixmapRec; drawable; refcnt; devKind; devPrivate; screen_x; screen_y; 䕆䓳drawableႃ⃡喏pixmap᜼βdrawable⮰ၼㆧ喏䔅᭛C͙჊⣜ㆧ㐓ឫ⮰፤⩔᫥∁Ƞ 7
Colormap Graphics Contexts Font Cursor 2.2 ӱβ๎൝ᤥ༶ Client ⃻̬͖䔊ᣑ᰹ߍஔ⮰჎ᝣ⼷ᎻᄥᏀκ̬͖Client᪜ᢚ㏿Ჰ喏Ⴏ჆͵κinclude/dixstruct.h: typedef struct _Client { index; clientAsMask; requestBuffer; osPrivate; swapped; int Mask pointer pointer Bool ReplySwapPtr pSwapReplyFunc; XID int int int int errorValue; sequence; closeDownMode; clientGone; noClientException; /* for OS layer, including scheduler */ /* this client died or needs to be * killed */ lastDrawableID; lastGC; lastGCID; DrawablePtr lastDrawable; Drawable GCPtr GContext SaveSetElt int pointer int *saveSet; numSaved; screenPrivate[MAXSCREENS]; (**requestVector) ( ClientPtr /* pClient */); req_len; CARD32 Bool int ClientState clientState; DevUnion *devPrivates; big_requests; priority; /* length of current request */ /* supports large requests */ unsigned long replyBytesRemaining; struct _FontResolution * (*fontResFunc) ( /* no need for font.h */ ClientPtr int * /* pClient */, /* num */); } ClientRec; requestBuffer⩔κᩪ㒚Ბ㜖჎ᝣ⮰䄣ⅮȠosPrivate ⩔κԉႄosᅮ䰬㺭ҫ⩔⮰⻭ᰵ᪜ᢚ喏䔅 ౔OSᅮ̬「ᰵᝬ⊵ࣶȠ 8
分享到:
收藏