公告版位

目前分類:LINUX (13)

瀏覽方式: 標題列表 簡短摘要

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)

pcman 發表在 痞客邦 留言(0) 人氣()

Block Device Driver是 以 固 定 大 小 長 度 來 傳 送 轉 移 資 料

Character Device Driver是 以 不 定 長 度 的 字 元 傳 送 資 料 。

 

且 所 連 接 的 Devices也 有 所 不 同 

Block Device大 致 是 可 以 隨 機 存 取 (Random Access)資 料 設 備 , 如 硬 碟 機 或 光 碟 機 ;

Character Device剛 好 相 反 , 依 循 先 後 順 序 存 取 資 料 的 設 備 , 如 印 表 機 、 終 端 機 等 皆 是 。

 


pcman 發表在 痞客邦 留言(0) 人氣()

QEMU 是一套 emulator 軟體,能在 PC 系統上模擬其他 processor 的運作方式,在 Linux 或 Windows 上都能執行。 QEMU 的相關介紹可參考維基百科或是其官方網站 

[5] http://en.wikipedia.org/wiki/Emulator
[6] http://bellard.org/qemu

 


pcman 發表在 痞客邦 留言(0) 人氣()

方法一:用 module 的方式撰寫 driver

將 driver 製作成 module 的好處是可以在不重開機的狀下,重複載入更新過的 driver ,在開發 driver 時是一個方便的許選擇。

在編譯 module 前,要先更新 ubuntu 的套件。請在終端機下鍵入:

sudo apt-get install module-assistant

1.調整 kernel 為接受 module

因為原本預設的 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 的相關步驟可參考實驗二

2 編譯 driver module

編譯 module 的方法和一般的程式有一些不同,請先到 opencsl 網站下載 Makefile :

wget http://opencsl.openfoundry.org/src/Makefile

將它和 demo.c 放到同一層目錄,並在上面鍵入 [4]

pcman 發表在 痞客邦 留言(0) 人氣()

  1. 引入標頭檔

    在撰寫 driver 前必須先 include 一些標頭檔:

    #include <linux/init.h>
    #include <linux/kernel.h>
    #include <linux/module.h>
    #include <linux/fs.h>

  2. 撰寫控制元件的函式

    struct file_operations 即為定義各個 function pointer 的 structure。

    static ssize_t drv_read(struct file *filp, char *buf, size_t count, loff_t *ppos)
    {

pcman 發表在 痞客邦 留言(0) 人氣()

在 Linux 中,所有的設備都是一個檔案,每個檔案都有自己特殊的編號和型態,我們可以在 /dev 中找到目前系統所有的 device ,這些 device 不一定是實際存在的硬體,也有可能是以虛擬的方式掛載上去的。例如,如果想要了解目前系統中總共有多少的 SATA 硬碟以及分割區,可以在終端機下鍵入:

ls -l /dev/sd*

 


pcman 發表在 痞客邦 留言(0) 人氣()

作者/陳俊宏
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);

pcman 發表在 痞客邦 留言(0) 人氣()

根據Linux驅動程式的一般化設計流程,我們來設計一個真正可以動的驅動程式。

作者/陳俊宏
www.jollen.org

根據流程寫程式

定義 file_operations

struct file_operations card_fops = 
{
open: card_open,
write: card_write,
release: card_release,

pcman 發表在 痞客邦 留言(0) 人氣()

一般化設計流程

依照驅動程式本身的實作,可以將 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二個部份。

 

流程解說

pcman 發表在 痞客邦 留言(0) 人氣()

打開電腦主機電源時主機板上的BIOS就開始測試電腦硬體及周邊設備,此時螢幕
左上角處將會看到RAM  數字從 0開始累加直至主機板上DRAM的數目為止,之後
你會聽到硬碟測試的聲音,且硬碟指示燈亮一下表示硬碟測試沒有問題,接下來
依序載入MBR(主開機程式)、DBR(DOS啟動記錄)、IO.SYS、MSDOS.SYS、
CONFIG.SYS、COMMAND.COM、AUTOEXEC.BAT等,待螢幕出現C:>或A:>時
即表示開機 成功。以圖式如下。


┌────┐  ┌────┐  ┌────┐
│POWER ON├→│BIOS測試├→│載入 MBR├→
└────┘  └────┘  └────┘

pcman 發表在 痞客邦 留言(0) 人氣()

什麼是 Device File

Device files 是 UNIX 系統的獨特觀念,在 UNIX 系統底下我們把外部的周邊裝置均視為一個檔案,並透過此檔案與實體硬體溝通,這樣的檔案就叫做 device files,或 special files。

 

可以去 /dev目錄下觀察

ls -l /dev

 

major number 為 1 為 null 虛擬裝置

Major number 主裝置

Minor number 代表裝置上的子裝置

pcman 發表在 痞客邦 留言(0) 人氣()

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 用來與硬體裝置溝通的介面。以下是一個簡單的範例:

 

pcman 發表在 痞客邦 留言(0) 人氣()

很多朋友都用vmware來測試不同的系統,我結合自己的經驗談一下對網絡設置的理解,不對的地方請指正。

  bridge:

 

  這種方式最簡單,直接將虛擬網卡橋接到一個物理網卡上面,和linux下一個網卡 綁定兩個不同地址類似,實際上是將網卡設置為混雜模式,從而達到偵聽多個IP的能力。

在此種模式下,虛擬機內部的網卡(例如linux下的eth0)直接連到了物理網卡所在的網絡上,可以想像為虛擬機和host機處於對等的地位,在網絡關係上是平等的,沒有誰在誰後面的問題。

  使用這種方式很簡單,前提是你可以得到1個以上的地址。對於想進行種種網絡實驗的朋友 不太適合,因為你無法對虛擬機的網絡進行控制,它直接出去了。

  nat方式:

  這種方式下host內部出現了一個虛擬的網卡vmnet8(默認情況下),如果你有過 做nat服務器的經驗,這裡的vmnet8就相當於連接到內網的網卡,而虛擬機本身則相當於運 行在內網上的機器,虛擬機內的網卡(eth0)則獨立於vmnet8

  你會發現在這種方式下,vmware自帶的dhcp會默認地加載到vmnet8界面上,這樣虛擬機就可以使用dhcp服務。更為重要的是,vmware自帶了nat服務,提供了從vmnet8到外網的地址轉 換,所以這種情況是一個實實在在的nat服務器在運行,只不過是供虛擬機用的。

  很顯然,如果你只有一個外網地址,此種方式很合適。

pcman 發表在 痞客邦 留言(0) 人氣()