1.記 憶 體 配 置 、 釋 放 和 轉 移
void *kmalloc(unsigned int size, int priority)
void *kfree_s(void * obj, int size)
kfree(char *)
memcpy_fromfs(dest, src, size)
memcpy_tofs(dest, src, size)
1.記 憶 體 配 置 、 釋 放 和 轉 移
void *kmalloc(unsigned int size, int priority)
void *kfree_s(void * obj, int size)
kfree(char *)
memcpy_fromfs(dest, src, size)
memcpy_tofs(dest, src, size)
Block Device Driver是 以 固 定 大 小 長 度 來 傳 送 轉 移 資 料
Character Device Driver是 以 不 定 長 度 的 字 元 傳 送 資 料 。
且 所 連 接 的 Devices也 有 所 不 同
Block Device大 致 是 可 以 隨 機 存 取 (Random Access)資 料 的 設 備 , 如 硬 碟 機 或 光 碟 機 ;
Character Device剛 好 相 反 , 依 循 先 後 順 序 存 取 資 料 的 設 備 , 如 印 表 機 、 終 端 機 等 皆 是 。
QEMU 是一套 emulator 軟體,能在 PC 系統上模擬其他 processor 的運作方式,在 Linux 或 Windows 上都能執行。 QEMU 的相關介紹可參考維基百科或是其官方網站
[5] | http://en.wikipedia.org/wiki/Emulator |
[6] | http://bellard.org/qemu |
將 driver 製作成 module 的好處是可以在不重開機的狀下,重複載入更新過的 driver ,在開發 driver 時是一個方便的許選擇。
在編譯 module 前,要先更新 ubuntu 的套件。請在終端機下鍵入:
sudo apt-get install module-assistant
因為原本預設的 kernel config 並不接受動態掛載 module ,我們要新增對 loadable module 的支援。
首先找到在實驗二中所使用的 linux kernel 原始碼,接著在的 menuconfig 中 [3] ,找到 「 Loadable Module Support 」,並將它裡面的 「 Enable loadable module support 」、「 Module unloading 」以及「 Forced module unloading 」勾選為 built-in ,再存檔離開即可。
接著請重新編譯 kernel ,即可產生支援動態掛載 module 的 kernel image 了。
[3] | 編譯 linux kernel 的相關步驟可參考實驗二 |
編譯 module 的方法和一般的程式有一些不同,請先到 opencsl 網站下載 Makefile :
wget http://opencsl.openfoundry.org/src/Makefile
將它和 demo.c 放到同一層目錄,並在上面鍵入 [4]
引入標頭檔
在撰寫 driver 前必須先 include 一些標頭檔:
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
撰寫控制元件的函式
struct file_operations 即為定義各個 function pointer 的 structure。
static ssize_t drv_read(struct file *filp, char *buf, size_t count, loff_t *ppos)
{
在 Linux 中,所有的設備都是一個檔案,每個檔案都有自己特殊的編號和型態,我們可以在 /dev 中找到目前系統所有的 device ,這些 device 不一定是實際存在的硬體,也有可能是以虛擬的方式掛載上去的。例如,如果想要了解目前系統中總共有多少的 SATA 硬碟以及分割區,可以在終端機下鍵入:
ls -l /dev/sd*
作者/陳俊宏
www.jollen.org
I/O 存取的觀念
I/O device必須透過I/O port來存取與控制,每個I/O port都會被指定一個memory address,稱為I/O port address(或port address),此即所謂的memory mapped I/O。
memory mapped I/O的意義為,我們可以透過I/O port被指定的memory address來存取I/O device,如此可將複雜的I/O device存取變成簡單的memory存取,也不需要使用 assembly 來存取 I/O device。
Memory-mapped I/O的觀念是將I/O port或I/O memory “mapping” 到 memory address上,此位址稱為I/O port address。採用memory-mapped I/O觀念的主要好處是可以將I/O device的存取變成記憶體存取。因此,對使用者而言,存取I/O裝置就會變成跟CPU的記憶體存取一樣。
RISC 架構的處理器,在 system design 方面,也都採取 memory-mapped I/O (I/O memory) 的觀念。
Linux I/O Port 存取介面
在 x86 平臺上,I/O port與I/O memory可以看成是一樣的東西。但在學習Linux驅動程式實作時,則是要把二者清楚的分開來。若是要存取I/O port,Linux提供以下的I/O port存取介面:
˙ unsigned inb(unsigned port);
根據Linux驅動程式的一般化設計流程,我們來設計一個真正可以動的驅動程式。
作者/陳俊宏
www.jollen.org
根據流程寫程式
定義 file_operations
struct file_operations card_fops =
{
open: card_open,
write: card_write,
release: card_release,
一般化設計流程
依照驅動程式本身的實作,可以將 Linux 驅動程式分為 2 大部份:
virtual device driver與physical device driver。
struct file_operations
struct file_operations 是 kernel 提供的一個重要資料結構
Linux 驅動程式建構在 file_operations 之上。file_operations定義驅動程式的system call與實作system call的函數
file_operations能切成virtual device driver與physical device driver二個部份。
流程解說
打開電腦主機電源時主機板上的BIOS就開始測試電腦硬體及周邊設備,此時螢幕
左上角處將會看到RAM 數字從 0開始累加直至主機板上DRAM的數目為止,之後
你會聽到硬碟測試的聲音,且硬碟指示燈亮一下表示硬碟測試沒有問題,接下來
依序載入MBR(主開機程式)、DBR(DOS啟動記錄)、IO.SYS、MSDOS.SYS、
CONFIG.SYS、COMMAND.COM、AUTOEXEC.BAT等,待螢幕出現C:>或A:>時
即表示開機 成功。以圖式如下。
┌────┐ ┌────┐ ┌────┐
│POWER ON├→│BIOS測試├→│載入 MBR├→
└────┘ └────┘ └────┘
什麼是 Device File
Device files 是 UNIX 系統的獨特觀念,在 UNIX 系統底下我們把外部的周邊裝置均視為一個檔案,並透過此檔案與實體硬體溝通,這樣的檔案就叫做 device files,或 special files。
可以去 /dev目錄下觀察
ls -l /dev
major number 為 1 為 null 虛擬裝置
Major number 主裝置
Minor number 代表裝置上的子裝置
System call 是 user application 與 Linux device driver 的溝通介面。
User application 透過呼叫 system call 來「叫起」driver 的 task,user application 要呼叫 system call 必須呼叫 GNU C 所提供的「wrapper function」,每個 system call 都會對應到 driver 內的一個 task,此 task 即是 file_operation 函數指標所指的函數。
Linux 驅動程式與 user application 間的溝通方式是透過 system call,實際上 user application 是以 device file 與裝置驅動程式溝通。要達成此目的,驅動程式必須建構在此「file」之上,因此 Linux 驅動程式必須透過 VFS(virtual file system)層來實作 system call。
一個簡單的範例
點此 看device file的介紹
/dev目錄下的檔案稱為device file,是 user application 用來與硬體裝置溝通的介面。以下是一個簡單的範例:
很多朋友都用vmware來測試不同的系統,我結合自己的經驗談一下對網絡設置的理解,不對的地方請指正。
bridge:
這種方式最簡單,直接將虛擬網卡橋接到一個物理網卡上面,和linux下一個網卡 綁定兩個不同地址類似,實際上是將網卡設置為混雜模式,從而達到偵聽多個IP的能力。
在此種模式下,虛擬機內部的網卡(例如linux下的eth0)直接連到了物理網卡所在的網絡上,可以想像為虛擬機和host機處於對等的地位,在網絡關係上是平等的,沒有誰在誰後面的問題。
使用這種方式很簡單,前提是你可以得到1個以上的地址。對於想進行種種網絡實驗的朋友 不太適合,因為你無法對虛擬機的網絡進行控制,它直接出去了。
nat方式:
這種方式下host內部出現了一個虛擬的網卡vmnet8(默認情況下),如果你有過 做nat服務器的經驗,這裡的vmnet8就相當於連接到內網的網卡,而虛擬機本身則相當於運 行在內網上的機器,虛擬機內的網卡(eth0)則獨立於vmnet8。
你會發現在這種方式下,vmware自帶的dhcp會默認地加載到vmnet8界面上,這樣虛擬機就可以使用dhcp服務。更為重要的是,vmware自帶了nat服務,提供了從vmnet8到外網的地址轉 換,所以這種情況是一個實實在在的nat服務器在運行,只不過是供虛擬機用的。
很顯然,如果你只有一個外網地址,此種方式很合適。