Linux patch 的產生與使用

假如要 merge code 的話, SVN 有些現成的 function 可以用. 不過對於兩個沒有直接血緣關係的 branch (或者說因為 merge 又 copy 把原來的關係弄混了), merge function 就會失靈. 我猜 merge code 的時候, 看到 skipped missing target 或許就是這樣來的.

此時, diff 和 patch 應該可以幫得上忙. 首先產生 diff.

diff -parameter oldURL newURL>patch_file

parameter 可能是 ruNp 或是 ruNa

r 表示 recursive 比較下面的所有子目錄 

u 表示以統一的方式來表示檔案間的不同, ‘-‘ 表示刪除, ‘+’表示新增.

N (= new-file) 表示某個 file 可以對應到同一個目錄底下的空 file, 因為這個 file 本身可能是新增或是刪除的.

p 對 C 語言的意義是: 可以比較兩者 function 的不同

a 表示是 ascii file, text file

例如: diff -ruNa oldDirectory newDirectory > patch_file

—————————————————

接著要 patch, patch 的格式是 patch -pX

X = 0, 表示從第一層目錄 patch, X = 1, 表示從第二層目錄 patch,…

例如:

cd /D1/D2/D3

cd ../../..

patch -p2 < patch_file

這樣會 patch 到 D3 這一層

__VA_ARGS__ 與 ## 小檔案

 

我大致整理出要點, 供急功近利的新手參考.

1. __VA_ARGS__ 顧名思義, 就是一個可變的參數.

例如: #define ABC(format,…)   printf(format, __VA_ARGS__);

注意最後這個分號.

2. 假如實際參數是 0 的話, 會發生下面的問題

 ABC(“%s") –> printf(“%s",);

為了除去這個逗號, 可以用 ## 來提示 compiler.

例如: #define ABC(format,…)   printf(format, ##__VA_ARGS__);

3. 由於 __VA_ARGS__ 有點礙眼, 所以它可以被抽象化成一個變數.

例如: #define ABC(format,…)   printf(format, ##arg);

4. 以上講的是 macro 的使用, 在 function 當中一樣可以用

例如: int function(char *argv, …)

這個可以用來處理 command line 參數的情況, 因為參數可多可少.

function 當中可以用 ##__VA_ARGS__ 來傳遞 … 所代表的值給其他 function.

或是透過 va_list, va_start, va_arg, va_end 這四個標準函式庫把 argv 裡面放的東西一一取出來. 用法參見:

http://www.cplusplus.com/reference/clibrary/cstdarg/va_start.html 有使用範例

http://ehome.hifly.to/showthread.php?s=&threadid=329 有原始 macro code, 也有範例, 呃…, 還有一連串的討論.

———————————————

關於如何巧妙運用 __VA_ARGS_, 在網路上的這篇文章, 有很好的介紹, 大家可以去看.

http://www.jeffhung.net/blog/articles/jeffhung/1012/ 

Pre-arbitration 小辭典

Bus 的 arbitration 通常是指把 bus 的控制權交給哪一個發出需求的 device, 沒拿到控制權的 request 就要排隊.

而 arbitration 就像高速公路的匝道管制, pre-arbitration 就像是匝道的燈號. 當燈號在紅燈的時候, 任何車輛都不准再上高速公路了. 反之, 綠燈的時候, 就依照優先權 (載客量) 或是先到先行 (按排隊順序) 來決定誰先通行.

當一次綠燈過後 (arbitration), 燈號會出現一個特定數字 (pre-arbitration count). 比方說停在 3, 那麼載客 3 人以下的車輛就可以上高速公路. 若是出現了 60, 那麼載客 60 人大客車和 9 人以下小客車都有機會開上來. 至於匝道裡 (command buffer) 的那麼多輛車 (request), 誰可以開上高速公路呢? 就是還是由 arbitratior 決定. 

為何要對高速高路做這樣的管制呢? 因為在系統裡面, 有些 request 可能是 real-time 的, 不管它載客量大還是小, priority 都很高. 因此我們會希望只要看見這些車開上匝道, 就給他們先上路的機會. 因此何時開綠燈就很有學問了.

Pre-arbitration 管制了綠燈開起的時間. 當 pre-arbitration count 的值設到最大, 服務就會最好, 民怨最低. 不過即使救護車可能都一時上不了路. 當這個值設到最小, 就是等於直接綠燈跳紅燈. 每次重新篩選誰可以上路之後, 才把綠燈開給它.

24P 與 pull down

由於 HDMI 的 video 需要設定輸出格式, 在考慮畫質最佳化的時候, 就必須要處理 24P 的問題.

24P 的影片來自電影, 每秒播放 24 張 progressive 的畫面. 而傳統的隔行掃瞄電視的畫質不如電影, 多是 NTSC 或是 PAL 的 interleave 輸出, 因此需要使用 pull down 技術將 24P 塞進 29.997 frame/sec (約 60 field/sec) 或是 25 frame / sec (50 field/sec).

對於 NTSC 來說, 24P –> 60I (I = interleave) 相當於 2 frames 變成 5 個 fields. 也就是第一個 frame 變成 2 個 fields, 第二個 frame 變成 3 個 fields 即可. 此為 3:2 pull down (telecine pull down, 或是更能反映真實狀況的 2:3 pull down).

(24 / 2) * 2 + (24 / 2) * 3 = 60

對於 NTSC 來說, 24P –> 50I (I = interlaev) 相當於 2 frames 變成 4.167 個的 fields. 取其近似值, 可以將第一個 frame 變成 2 個 fields, 第二個 frame 變成 2 個 fields 即可. 此為 2:2 pull down.

(24 / 2) * 2 + (24 / 2) * 2 = 48

因為是採用近似值的關係, 平均播放速度增加為 50/48 = 104.167%, 速度會變快. 若是聲音的輸出頻率與 video 連動, 則聲音 pitch 也會變高一點點. 若聲音的輸出頻率沒有與 video 連動, 則 video 播完了, audio 還沒有播完. 因此, 另外一種可行方式就是 video 每 50 張 frame 再多補 2 張進去. 這樣就可以讓 audio、video 脫鉤.

對於新的逐行掃瞄電視而言, 畢竟 24P 和 60P/50P 也不是整數倍的關係. 所以 pull down 的過程仍然存在.

總結來說, 早期的電視技術並不發達, 所以制定的 interleave 規格以現在的眼光來看, 是比較落後的. 隨著電視進入 120 Hz 的境界, 電影的 24P 技術又顯得不夠看. 從藍光 DVD 播出的訊號, 仍然要經過 pull down 轉換到逐行掃描電視是一種額外損失. 因此, 透過 HDMI 介面的告知, 電視也直接支援 24P 的輸入, 的確是比較明智的做法.

當然電影拍攝技術也會往 48P 邁進, 大家都在進步. 身為 display 關鍵角色的 TV, 理當去支援各種 native (未經再處理的) 輸入才是王道.

RTSP MMS HTTP RTMP 小檔案

RTSP = real time streaming protocol: 當初是由 RealNetworks 和 Netscape 共同提出, 主要是支援 streaming 功能. Streaming 讓 Realplayer 可以播出媒體, 但是沒辦法存起來.

MMS = Microsoft Media Server: 顯然這是微軟所提出的, 用於取代 RTSP. Windows Media Player 可以透過這個協議, 播出某個 URL 上面的媒體. 2008 年就會廢棄這個協議.

HTTP = hyper text transfer protocol: 其實這不是一個 real time protocol. 當 client 向 server 發出需求, server 就一股腦地向 client 送出整個媒體. 一旦中間受到某些因素而中斷, 整個傳輸就要重來一次. 

RTMP = Real Time Messaging Protocol: 這是 Adobe 專用的格式, 主要用於 flash media server 將 flash 的媒體送到 client 上.

參考 WIKI 的  OSI Protocol
5-7. 應用層 (包括應用層, 表示層, 會話層)
DHCP · DNS · FTP · Gopher · HTTP · IMAP4 · IRC · NNTP · XMPP · POP3 · SIP · SMTP · SNMP · SSH · TELNET · RPC · RTCP · RTSP · TLS · SDP · SOAP · GTP · STUN · NTP · MMS · RTMP
4. 傳輸層
TCP · UDP · DCCP · SCTP · RTP · RSVP · PPTP
3. 網路層
IP (IPv4 · IPv6) · ARP · RARP · ICMP · ICMPv6 · IGMP · RIP · OSPF · BGP · IS-IS · IPsec
2. 資料鏈結層
802.11 · 802.16 · Wi-Fi · WiMAX ·ATM · DTM · Token Ring · Ethernet · FDDI · Frame Relay · GPRS · EVDO · HSPA · HDLC · PPP · L2TP · ISDN 
1. 實體層
乙太網路實體層 · PLC · SONET/SDH · G.709 · 光纖 · 同軸電纜 · 雙絞線