static functions are functions that are only visable to other functions in the same file.
也就是說static function在C語言內並不跟static variable的語意一致,static在java上面是一致的
C語言static function的控制是visability,但是在static variable則是life time
2012年4月22日 星期日
2012年4月21日 星期六
一些kernel的process/thread
ps -ef可以看到一堆kernel啟動的程式是使用[中括弧]括弧起來的,底下是我知到的有
ksoftirqd/0:軟體中斷的daemon,後面的號碼表示thread個數,比方說2cores 4threads
kworker:APIC的wait queue
kthreadd:kernel thread的parent daemon
kswapd0:swap daemon
migration:將process由某個core移動到另外一個core
其中有些process在ubuntu上面找不到
pdflush:將一些dirty pages作輸出
events/n:working queue
其實在過程中有看到kernel thread,我很好奇kernel thread在概念上跟thread有何差異?對於kernel thread跟process的對應關係又是如何也感到很好奇
參考資料
http://hi.baidu.com/nixsql/blog/item/c8f042ef2018863127979116.html
http://ubuntuforums.org/showthread.php?t=1630347
ksoftirqd/0:軟體中斷的daemon,後面的號碼表示thread個數,比方說2cores 4threads
kworker:APIC的wait queue
kthreadd:kernel thread的parent daemon
kswapd0:swap daemon
migration:將process由某個core移動到另外一個core
其中有些process在ubuntu上面找不到
pdflush:將一些dirty pages作輸出
events/n:working queue
其實在過程中有看到kernel thread,我很好奇kernel thread在概念上跟thread有何差異?對於kernel thread跟process的對應關係又是如何也感到很好奇
參考資料
http://hi.baidu.com/nixsql/blog/item/c8f042ef2018863127979116.html
http://ubuntuforums.org/showthread.php?t=1630347
2012年4月18日 星期三
Cloud Projector
最近都在弄硬體的東西,反倒是忽略了這個blog,先放一兩張之前用BeagleBoard做的projector,理想上就是利用BB加連上投影機,然後用瀏覽器,比如說平板上面的瀏覽器來作遠端遙控,至於投影片是放在網際網路上面的
螢幕試用台代替投影機,可以看到BB只有外加上一個USB無線網卡,本來電源是想要用電池的,可惜市面上買到的電池組裝起來電流不夠穩定,所以電源還是接到變壓器,改天有空自己再來作一個。可以看到平板上面會顯示跟投影機上面一樣的縮圖
可以看到上面細項的參數,主要就是一個URL跟一個頁數還有目前頁數的顯示以及一些簡單的跳頁、上一頁、下一頁
目前可以轉換網頁跟pdf檔案,以後應該開始考慮轉換google的投影片,一樣有空在研究吧
螢幕試用台代替投影機,可以看到BB只有外加上一個USB無線網卡,本來電源是想要用電池的,可惜市面上買到的電池組裝起來電流不夠穩定,所以電源還是接到變壓器,改天有空自己再來作一個。可以看到平板上面會顯示跟投影機上面一樣的縮圖
可以看到上面細項的參數,主要就是一個URL跟一個頁數還有目前頁數的顯示以及一些簡單的跳頁、上一頁、下一頁
目前可以轉換網頁跟pdf檔案,以後應該開始考慮轉換google的投影片,一樣有空在研究吧
2012年4月9日 星期一
硬體教我的事
有一陣子沒有更新了,最近看到都在使用硬體,把以前已經忘記的電子電路在撿回來,發現其實很多網路賣的產品有問題,另外就是有時候硬體並不是如我想像中的方式運作
以上是一些硬體教我的事情,算是野人獻曝的分享吧
- 如果電子零件正負極接反了可以運作嗎?我本來以為不行,或者會燒掉,答案是可能還是可以運作,如果知道確定的電阻,可以依照分壓定律等等地去量測一下電壓,有時候接反了,元件的電阻會變得很大,但是還是可以通電
- 網路上一些號稱使用18650組合的電路,號稱可以上5V2A,請實際量測,我發現電壓是夠了,很可惜,電流不夠,只有1.36A,看來網路上寫的跟賣的東西未必可以盡信,難怪接到beagleboard會不斷重新開機,我猜應該是開機有時候瞬間用電吃很兇,然後導致電流不足所產生的問題
- 硬體電子零件沒那麼容易壞?這是我以前認知上的問題,我一直以為電子零件已經技術成熟,不是精密如cpu應該不會那麼容易壞(其實我還沒遇過壞掉的cpu),事實上,我使用電子零件損壞率還蠻高的,以電容式麥克風來說,十個已經壞掉三個了
- 接頭等同規格?這是許多人的誤解,以beagleboard來說,雖然有hdmi接頭,可是實際上只有DVI-D的輸出,另外有時候硬體設計的時候,也會因為面積的關係,有時候會精簡,又比方如rs232指拉出了5個pin腳,這時候你就得小心了,可能你的程式沒問題是硬體有問題
以上是一些硬體教我的事情,算是野人獻曝的分享吧
2012年3月28日 星期三
Linux驅動程式--chapter 5
這章的重點是concurrency的問題,介紹的工具是semaphore、mutexes、spinlock、atomic operations、seqlock、Read-Copy-Update(RCU)
基本上快都是作業系統(OS)介紹過的東西,如果上過這個課程,對這些東西應該不陌生。雖然很想這樣結束,但是我要說,書中介紹的原則往往比教科書來的多,也來的更貼近實際狀況;另外也讓我體驗到driver有時候設計真的充滿了trade off
一般而言,我們希望使用semaphore因為會比spinlock容易(因為高階),但是spinlock會比較有效率,但是spinlock又可能引起沒效率,這種弔詭的說法有舉例
一般而言,spinlock使用的時候會取消cpu preemption的功能,希望目前的task趕緊完成工作,儘快釋放lock,很不幸很多function call會引發目前的工作釋放cpu,比方說kmalloc,而且沒有完整的列表。其次中斷也會引發目前task帶著lock且釋放出cpu,這時候可能會有很不幸的事情發生,那就是如果該中斷要求同一個spinlock,這就好玩了,他會因為拿不到,重新觸發,然後就一直浪費cpu的時間在等待task釋放cpu,但是可能又因為cpu preemption功能被關閉,本來的task進不到cpu產生了dead lock,如果不會dead lock也有可能cpu空轉上好一段時間。這也是為何說spin lock可能引起效率低落的原因。
作者給spin lock幾個建議:
對於種種同步的建議是:
atomic operation則適用於int以及bit運算,因為有時候我們希望有些簡單但是重要的count功能或者加減的功能是使用atomic operations,但是有點要認知到,就是運算的串聯次序本身並沒有被保證,也就是兩個以上task執行了各十個atomic operations,你並不能知道他們之間的次序是如何排列的。
至於詳細的API使用方式,可以參考書本
基本上快都是作業系統(OS)介紹過的東西,如果上過這個課程,對這些東西應該不陌生。雖然很想這樣結束,但是我要說,書中介紹的原則往往比教科書來的多,也來的更貼近實際狀況;另外也讓我體驗到driver有時候設計真的充滿了trade off
一般而言,我們希望使用semaphore因為會比spinlock容易(因為高階),但是spinlock會比較有效率,但是spinlock又可能引起沒效率,這種弔詭的說法有舉例
一般而言,spinlock使用的時候會取消cpu preemption的功能,希望目前的task趕緊完成工作,儘快釋放lock,很不幸很多function call會引發目前的工作釋放cpu,比方說kmalloc,而且沒有完整的列表。其次中斷也會引發目前task帶著lock且釋放出cpu,這時候可能會有很不幸的事情發生,那就是如果該中斷要求同一個spinlock,這就好玩了,他會因為拿不到,重新觸發,然後就一直浪費cpu的時間在等待task釋放cpu,但是可能又因為cpu preemption功能被關閉,本來的task進不到cpu產生了dead lock,如果不會dead lock也有可能cpu空轉上好一段時間。這也是為何說spin lock可能引起效率低落的原因。
作者給spin lock幾個建議:
- 使用spin lock不要有cpu preemption,這點kernel會處理,不至於太擔心
- 使用spin lock不要讓task sleep,要非常小心,因為如上所說function call & interrupt
- 使用spin lock要儘快釋放,免得schedule的功能"失去作用",因為spin lock取走了大部分cpu時間
對於種種同步的建議是:
- 儘量事前規劃好,省得事後debug很困難
- 對於鎖定的資源依序取得,可以避免一些dead lock的可能性
- 不要呼叫交互取得lock或者資源的function,這樣也很容易dead lock
atomic operation則適用於int以及bit運算,因為有時候我們希望有些簡單但是重要的count功能或者加減的功能是使用atomic operations,但是有點要認知到,就是運算的串聯次序本身並沒有被保證,也就是兩個以上task執行了各十個atomic operations,你並不能知道他們之間的次序是如何排列的。
至於詳細的API使用方式,可以參考書本
2012年3月27日 星期二
Linux驅動程式--chapter 4
這一章已經超過了單純driver,還包含到了kerenel debug的技巧,首先介紹一些在kernel hacking裡面的選項,為了debug有時候是必須打開的,接著介紹不同的技巧以及他們應用的時機
printk() : 最簡單最直接的一種,大致上分成八個level只有當設定的訊息的level小於console_loglevel的時候,訊息才會直接被送到console,作者還介紹了一個小工具程式,讓我們可以設定輸出的console。接著printk的問題就是如果在code裡面埋了一堆debugger information,要如何在編譯階段可以清理掉,作者定義了幾個macro來處理這件事情
/proc : 從2.6開始procfs被引入作為顯示系統狀態的vfs,如果老是使用printk在動作很多的時候,訊息量可以淹沒整個console畫面,反過來如果可以在適當時機將需要的資料拿出來看,這樣除錯就可以輕鬆許多,要在/proc底下註冊建立/proc檔案需要用到
struct proc_dir_entry *create_proc_read_entery(const char *name, mode_t mode, struct proc_dir_entry *base, read_proc_t *read_proc, void *data)
這一個function,可以註冊需要的路徑跟虛擬裝置,同時要提供可以讀取資料的函數(跟自己寫的module在同一檔案/空間之中),將目前module的狀態讓使用者可以用類似cat /proc/scullmem的方式取出。這種方式有個限制就是基本上是以page size,在運作,操作複雜結構的資訊並不是很容易,另外就是/proc已經開始有濫用的趨勢,/proc已經不只是讀取,還可以寫入,有點跟/dev一樣的問題。linux已經開始引入sysfs來處理這樣的問題,他要求更有架構性的資料
ioctl() : 最靈活的方式,但是程式設計師必須自行處理,在此章節作者也還不打算詳細介紹,他另外有個好處就是code獨立,不是類似printk會"汙染"到原本的code,所以忘記把它拿掉只是佔據記憶體空間:P
strace : 用來追蹤一些system call的次序,但是可讀性低於printk,有許多參數,如-o表示將輸出轉移到檔案內
strace -o /tmp/x1 ls -R > /dev/scull0
Ooops information : 當系統fault的時候(不是panic/死當),會產生類似coredump檔案的輸出,包含了CPU register等等information(P.S>我不大清楚它會產生到哪裡去@@a)
magic SysRq key : 一些特殊的組合鍵,讓使用者可以做一些事情,請參考書內內容
debugger tools : gdb、kdb、kgdb、Linux Trace Toolkit (LTT)、Dynamic Probes
裡面有提到一個有趣的User-Mode Linux,這是一個虛擬機器的機構,但是她不能讓使用者直接存取硬體
最後,其實作者的sample code的scull包含了chapter 3跟4,所以如果光看了chapter 3就去看code會感到怎麼還有很多多出來的東西
參考資料:
http://zh.wikipedia.org/wiki/Sysfs
http://blog.linux.org.tw/~asho/archives/001816.html
http://184.82.2.112/wordpress/?p=505
printk() : 最簡單最直接的一種,大致上分成八個level只有當設定的訊息的level小於console_loglevel的時候,訊息才會直接被送到console,作者還介紹了一個小工具程式,讓我們可以設定輸出的console。接著printk的問題就是如果在code裡面埋了一堆debugger information,要如何在編譯階段可以清理掉,作者定義了幾個macro來處理這件事情
/proc : 從2.6開始procfs被引入作為顯示系統狀態的vfs,如果老是使用printk在動作很多的時候,訊息量可以淹沒整個console畫面,反過來如果可以在適當時機將需要的資料拿出來看,這樣除錯就可以輕鬆許多,要在/proc底下註冊建立/proc檔案需要用到
struct proc_dir_entry *create_proc_read_entery(const char *name, mode_t mode, struct proc_dir_entry *base, read_proc_t *read_proc, void *data)
這一個function,可以註冊需要的路徑跟虛擬裝置,同時要提供可以讀取資料的函數(跟自己寫的module在同一檔案/空間之中),將目前module的狀態讓使用者可以用類似cat /proc/scullmem的方式取出。這種方式有個限制就是基本上是以page size,在運作,操作複雜結構的資訊並不是很容易,另外就是/proc已經開始有濫用的趨勢,/proc已經不只是讀取,還可以寫入,有點跟/dev一樣的問題。linux已經開始引入sysfs來處理這樣的問題,他要求更有架構性的資料
ioctl() : 最靈活的方式,但是程式設計師必須自行處理,在此章節作者也還不打算詳細介紹,他另外有個好處就是code獨立,不是類似printk會"汙染"到原本的code,所以忘記把它拿掉只是佔據記憶體空間:P
strace : 用來追蹤一些system call的次序,但是可讀性低於printk,有許多參數,如-o表示將輸出轉移到檔案內
strace -o /tmp/x1 ls -R > /dev/scull0
Ooops information : 當系統fault的時候(不是panic/死當),會產生類似coredump檔案的輸出,包含了CPU register等等information(P.S>我不大清楚它會產生到哪裡去@@a)
magic SysRq key : 一些特殊的組合鍵,讓使用者可以做一些事情,請參考書內內容
debugger tools : gdb、kdb、kgdb、Linux Trace Toolkit (LTT)、Dynamic Probes
裡面有提到一個有趣的User-Mode Linux,這是一個虛擬機器的機構,但是她不能讓使用者直接存取硬體
最後,其實作者的sample code的scull包含了chapter 3跟4,所以如果光看了chapter 3就去看code會感到怎麼還有很多多出來的東西
參考資料:
http://zh.wikipedia.org/wiki/Sysfs
http://blog.linux.org.tw/~asho/archives/001816.html
http://184.82.2.112/wordpress/?p=505
system log
sysklogd套件主要包含兩個訊息紀錄程式,一個是klogd(Kernel Log Daemon),另一個為 syslogd(System Log Daemon),兩個工具主要的不同在於klogd是紀錄Linux 核心訊息與Linux核心模組訊息,每當核心程式呼叫printk時,就可以由這個User-Mode的klogd程式來負責把此時的核心訊息紀錄下來,而syslogd則是負責User-Mode程式所需紀錄的系統訊息(例如紀錄在/var/log/messages的系統訊息)。
syslogd的控制可以由/etc/syslog.conf來控制,其次klogd是記錄在一個環狀的紀錄中,當紀錄太多的時候,新來的紀錄會覆蓋掉舊有的紀錄
訂閱:
文章 (Atom)