2010年10月26日 星期二

Linux Device Driver的基本架構

每一種OS都會有驅動程式, 而驅動程式主要是做為應用程式要使用各種系統的週邊元件的一中間橋樑, kernel接收及管理應用程式的需求, 並將其需求轉送給驅動程式, 而kernel將會處理多工的問題, 為了讓各種驅動程式好撰寫, 所以每一種OS將會規定驅動程式的寫法, 就好像C語言也有規定應用程式的寫法, 而在linux的OS中規定驅動程式的寫法如下:
  • 目前都是使用C語言來撰寫驅動程式
  • 程式務必include & include
  • 每一個程式都會有一個進入點, 或者第一個指令的地方, linux device driver的進入點如下:
static int __init your_driver_name_init(void)
{
return 0;
}
module_init(your_driver_name_init);

其進入點的名字你可以隨意取一個名字, 但是其原型的宣告方式必須是固定的, 請參考上面的範例程式, 最後必須使用一個巨集指令module_init()來宣告其為程式進入點。
  • Linux的驅動程式可以是static link至kernel, 也可以是動態的方式, linux稱做module, 若是static的方式則必須要有完整的kernel source code, 並且在編譯時會將整個kernel source code編譯過, 而module的方式則不用, 只需要kernel的include檔即, 但是不管是static或者module其進入點宣告方式都一樣
  • 離開或者是下載驅動程式時的進入點宣告如下 :
static void __exit your_driver_name_exit(void)
{
}
module_exit(your_driver_name_exit);

這和進入點一樣, 名字可以隨意取, 但是原型宣告則必須固定, 並且使用module_exit()巨集指令來確定離開驅動式的進入點。

以上是Linux的驅動程式的基本概念。

2010年10月21日 星期四

如何使用NFS做為開機時的root file system

我們都知道Linux在開機時必須要mount一個檔案系統做為根目錄系統, 而這個根目錄通常會指定定在kernel bootup command line的root及rootfstype選項中指定, 但是初期我們在開發embedded系統時通常會有問題, 或者embedded flash的空間不大, 所以若可以使用NFS做為root file system, 將會對開發embedded系統來說會是一項非常方便的事情, 以下即是說明如何設定來使用NFS做為開機時的root file system。
若要使用NFS做為開機時的根目錄, 在kernel的選項中有幾個是必須被打開, 如NFS client (CONFIG_ROOT_NFS), 以及可以自動設定IP的選項, 如DHCP或者BOOTP或RARP, 這是讓kernel開機時即可取得IP address (CONFIG_IP_PNP), 因為NFS是架構在網路上。
而其中的boot command line的設定如下 :

root=/dev/nfs

而其中的/dev/nfs為一個虛擬的device node, 並不是真實存在, 所以也並不需要真的在檔案系統中建立這個device node

nfsroot=[{server-ip}:]{root-dir}[,{nfs-options}]

nfsroot是指定NFS server的資料, 若沒有指定nfsroot則會default使用/tftpboot/%s, 做為mount的點,其各個選項說明如下:
{server-ip} 是指定NFS server的IP address
{root-dir} 是指定NFS server export出來的目錄, 也是會被mount為根目錄的目錄
{nfs-options} 為選項如下:
  • port = portmap所使用的port number
  • rsize = 4096
  • wsize = 4096
  • timeo = 7
  • retrans = 3
  • acregmin = 3
  • acregmax = 60
  • acdirmin = 30
  • acdirmax = 60
  • flags = hard, nointr, noposix, cto, ac
ip={client-ip}:{server-ip}:{gw-ip}:{netmask}:{hostname}:{device}:{autoconf}

這是在設定embedded自已的IP address, 若沒有這個設定, 將會依照kernel中所設定的autoconf方法取得IP address, 這個設定可以如下各個情形:
  • ip="off"
  • ip="none"
  • ip=dhcp"
  • ip="autoconf"
其各選項說明如下 :
{client-ip} embedded自已本身的IP address
{server-ip} NFS server的IP address
{gw-ip} gateway IP address
{netmask} netmask
{hostname} embedded自已本身的名字
{device} embedded自已本身所使用的網路介面名字
{autoconf} 其可用的選項如下 :
  • off or none
  • on or any
  • dhcp
  • bootp
  • rarp
  • both (使用bootp & rarp)
  • default is any
以上若是使用正確將可以使用NFS來做為開機時的root file system,以下是一個範例:

root=/dev/nfs console=ttySAC0,115200 nfsroot=192.168.2.144:/home/work/embedded/filesystem/rootfs ip=dhcp

以上範例測試板是dhcp取得IP address,以下是另一個範例!為設定固定IP address :

root=/dev/nfs console=ttySAC0,115200 nfsroot=192.168.2.144:/home/work/embedded/filesystem/rootfs ip=192.168.2.90

2010年10月4日 星期一

在Linux一些好用的設定

  • 如何讓在Linux系統下ls指令時所顯示的檔名,會根據檔案屬性不同,顯示不同的顏色,其做法是在使用者的home directory之下編譯.bashrc檔案,加入一些設定如下
    export LS_OPTIONS='--color=auto'
    eval "`dircolors`"
    alias ls='ls $LS_OPTIONS'
    alias ll='ls $LS_OPTIONS -l'
    alias l='ls $LS_OPTIONS -lA'
  • 在debain系統按裝套件的指令
apt-get install package-name
apt-cache search package-name
  • 檢查有多少軟件已按裝
dpkg -l
  • 免設IP/ 免使用public IP / 使用P2P / Window, Ubuntu, iphone支援,可以穿透任何firewall

http://www.teamviewer.com
用過心得:還是VNC的效能較好,比較不會有延遲晝面及解析度較好。但是VNC無法透過internet使用。
  • 如何設定讓debain 6.0的Window可以用root權限登入:
default的debain 6.0是不讓人使用root來登錄,當然這是為了安全著想,但是有時debain我們是將它安裝在virtual machine中,只是自已使用,所以常常需使用su或者做權限的認證才能做事,其實是很麻煩的,所以可以直接用root來登錄是一件很方便的事。其實要讓root可以直接登入是一件很簡單的事,只要修改 /etc/pam.d/gdm3 的檔案,將以下的這行mark掉就好了:

auth required pam_succeed_if.so user != root quiet_success