跳到主要內容

發表文章

目前顯示的是 2016的文章

ASUS zenbook UX330U - Ubuntu 安裝筆記

最近剛換筆電,身為資工人,當然一定要裝上Linux 作業系統,Ubuntu自然是首選。 關於Ubuntu安裝過程就省略,本篇主要是紀錄一些安裝Ubuntu之後所遇到的問題,以及要如何解決。 Ubuntu安裝之道可以參考 我是安裝 Ubuntu 16.04的版本,以下的方法都是通用的 ! Ubuntu 16.04製作Live USB隨身碟的軟體Unetbootin https://goo.gl/UX3kLZ 安裝Ubuntu 15.04 https://goo.gl/9JWwbh 安裝後遇到的問題 (我認為是大眾都會遇到問題)

編譯入門 - gcc toolchain

程式編譯的過程是很複雜的,初學者在學習寫程式的時候,大部份是透過IDE來編譯程式的,所以將內部的編譯流程都隱藏了起來。其實過程是很複雜的,我打算先以觀察gcc 編譯程式的的過程以及中間的產物來開始學習。 以下資料是透過閱讀 「 程式設計師的自我修養 - 連結、載入、程式庫 」並在自己的電腦上驗證結果。 先透過一個最簡單的入門程式開始學起, Hello World !! 接下來我們使用 gcc 來編譯它巴 $gcc hello.c $./a.out Hello World! 上面看似簡單的編譯指令,其實中間包括了4個階段 前置處理 (Preprocessing) 編譯 (Compilation) 組譯 (Assembly) 連結 (Linking) 圖示 : 下面我會使用 gcc 一步一步的編譯 Hello World 這隻程式,將結果呈獻出來。

藉由select & poll來學習 Linux device driver programming

最近因為想學習撰寫一隻 Linux device driver,所以先藉由 Linux Device Driver Programming 驅動程式設計 ,這本書裡的select & poll 的範例程式開始學習。但是因為這本書當時再寫的時候,kernel版本大致分為 2.4 和 2.6,版本比較舊,有些函式已有變動,所以有做一些修改。(我的Kernel版本為4.2版) 驅動程式筆記與程式碼講解 函式加上 static ,讓命名空間限制在檔案內。不過在這裡就算不加static也不會影響kernel整體的符號表。這是只緊限於kernel module的時候,也就是動態載入的驅動程式來說。如果是希望其他module能夠呼叫的話,就必須要使用EXPORT_SYMBOL來明確匯出函式。 驅動程式內部能夠使用到 printf(),因為kernel space沒有直接對應的console (鍵盤,畫面)。但是還是有可代用的function printk()。它輸出的資料會跑到kernel buffer內。kernel buffer 可以用 dmesg 指令查閱,不過空間才只有 128KB(default),而且是環狀的形式(所以心資料會蓋過最舊的資料)。因此不能一直把資料保留在裏面,可以用syslogd 或是 klogd 之類的程式把資料寫到 syslog 裡(var/log/message),不過這種方法還是可能會漏掉訊息。 下面是訊息等級,在 kernel 4.2 版本,預設等級是 log level。但是在 kernel 2.6 版本預設等級是 4。 驅動程式的進入點並不是 main() ,因為驅動程式與一般應用程式是不同的,而且必須準備多個,其中至少要兩個進入點 insmod 與 modprobe 呼叫的初始化函式 rmmod 呼叫的結束函式 對於這隻driver來說就是 devone_init()與devone_exit()。 其他進入點還包含 系統呼叫 中斷服務程序 計時器程序 驅動程式碼