2010/01/28

[Driver] 新手上路

module_initmodule_exit 是特殊的核心巨集,
前者會在模組被載入核心時執行.
後者會在模組被卸載時執行.

Module 初始函式範例:
static int __init init_function_name(void)
{

//...
}
module_init(init_function_name);

__init 和 __initdev 告知 kernel 函式只用於初始期間,
在 Module 被順利載入後, 模組裝載器會丟棄初始函式,
釋放記憶體作為其他用途.
--
Kernel API 經常看到名稱開頭為雙底線 (__) 的函式,
以這種方式標記的函式,表示他們是相當低階的元件, 請小心使用.
("If you call this function, be sure you know what you are doing.")
--
modprobe 和 insmod 同樣可用來載入模組,
差別在於 modprode 會先檢查目標模組的懸置符號表,
若還有 kernel 符號表沒有的項目, 會在當時的模組搜尋路徑找尋,
若有找到則一併載入. insmod 則不會自動滿足模組相依關係.
通常直接出現 "unresolved symbols"
--
lsmod 是讀出 /proc/module 虛擬檔, 並以 Human Readable 呈現.

2010/01/25

[ssh notes]ssh config

在~/.ssh/config
可設定預設ssh連到主機的 Account 和 port.

example:

Host 名稱
HostName DomainName
User 預設登入帳號
Port port number

2010/01/19

開發 UPnP 時好用的小工具

1. miniupnpc
http://miniupnp.free.fr/


2. Intel(R) tools for UPnP(TM) Technology

http://software.intel.com/en-us/articles/intel-software-for-upnp-technology-technology-overview/



miniupnpc
是一個相當好用的 UPnP IGD Client
還是 Open Source, 透過 miniupnpc 可以簡單的控制 UPnP IGD Device
也有以編譯好的 windows dos executable 可直接使用

Intel(R) tools for UPnP(TM) Technology 則是很好用的輔助工具
常用的有Device Spy, Device Sniffer 等等,還有許多沒下去研究
今天用Device Sniffer 發現有簡單的介面可以輕易的對 UPnP Device 下 Request
除了基本的 HTTP/1.0 GET, HTTP/1.0 HEAD 外
也可客製化自己的 Request 然後對 UPnP Device 發送
就不用在辛苦的用 Wireshark 偷看 UPnP Client 和 Device 之間的對談囉XD

off_t 是32bit 還是64bit呢?

檔案位置的最大值受限於 off_t 資料型別本身的大小.
多數機器架構會定義為C的long 資料型別
若有需要將 off_t 由 32 bits 轉成 64bits
只要在 CPPFLAG 中加入 D_FILE_OFFSET_BITS=64 即可

ex:
CPPFLAG += -D_FILE_OFFSET_BITS=64

2010/01/14

[Programming] Difference of Struct Define between C and C++

今天和 Evan 一起找 Bug 時發現了一個被我忽略的 C/C++ 小細節,

在 C++ 中, 當宣告了一個 struct 後,

可以直接用這個結構來做為型態名稱,

例如:

struct sample_struct
{

char buffer[10];
int i, j, k;
};

在 C++ 裡, 可以直接使用

sample_struct test;


而在 C 語言中較為嚴謹, 需要在每個變數宣告之前加入關鍵字 struct :

struct sample_struct test;

若直接在 C 裡用 sample_struct test; 編譯時會看見 ERROR 唷!

2010/01/11

[vim skills] makeprg and errorformat

makeprg 與 errformat 讓 vim 結合了編譯器的功能

透過 makeprg 可以在vim 中執行 Makefile ,
而 errorformat 則記錄了編譯過程中的錯誤與警告,
讓我們可一邊撰寫程式碼, 一邊除錯

而 makeprg 選項的功能是定義編譯時執行的指令,
當我們在 vim 的command mode 輸入 :make 時,
makeprg 所代表的指令就會被執行, 預設為 make.



我們也可以將makeprg設定為其他的指令, 例如:

那我們在執行 :make 時, 就會執行 make clean啦!
(當然應該不會有人把make設定為make clean吧...)

而如果邊一時發生錯誤呢?
以下是一個錯誤示範:

當我們在 command line 敲下 :make後, 一堆錯誤就跑出來啦!

這邊我們可以用 :cl 來列出所有的錯誤訊息

第一個數字就是錯誤代號,可以用在 :cc 指令
:cc 會跳到最近一個錯誤發生的地方(沒用過當然就是跳到最開始的錯誤囉...)
而 :cc4 就會跳到錯誤代號4的程式碼的位置,





很方便吧:)

其他常用來觀察錯誤的指令如下

:cl 列出所有錯誤
:cn 跳到下一個錯誤
:cp 跳到上一個錯誤
:cc 跳到最近觀察過的錯誤,若cc後帶有數字,則跳到該錯誤
:cr 跳回第一個錯誤
:cla 跳到最後的錯誤

其他更詳細的設定與說明, 可以參考 vim的 help file 中的quickfix部分.


參考資料:
Anthony的<<用vim寫程式快n倍>>