天天看點

disk磁盤管理與Linux驅動編寫

磁盤管理

一.關于硬碟接口

安裝linux red hat系統,到分區時發現硬碟驅動器裝置

/dev/sda            #sata接口裝置名

    /dev/sda1#sda對應的實體分區

    /dev/sda2

    /dev/sda3

而又的安裝時硬碟驅動裝置名為

/dev/hda#IDE接口裝置目錄

   /dev/hda1

sda和hda有什麼差別那?

HDA是使用了ide接口的硬碟的名稱.SDA是sata接口的硬碟的名稱.在最新的2.6.19核心裡,所有的硬碟都叫SDA了.

GERUB裡填SDA.

硬碟接口分為:

ide  (integrated drive electronics)  把盤體和控制器內建在一起

scsi (small computer system interface)

光纖通道 fibre channel

sata (serial ATA(advanced technology attachment))

二.我司硬碟分區及挂載指令:

parted -s /dev/sda mklabel gpt

parted -s /dev/sda mkpart sashdisk ext3 0 100%

echo "y" | /sbin/mkreiserfs /dev/sda1

三.disk硬碟通路的準備步驟:

1.硬碟分區,需要2次分區:需要一次實體分區和一次邏輯分區   (fdisk or parted)

2.将硬碟格式化:即給硬碟格式化合适的檔案系統(格式化隻能是邏輯分區) (fdisk or parted)

3.将硬碟裝置/dev/sda挂載到Linux系統的某個檔案目錄下/opt/nsfocus/sda1  (mount)

四.硬碟在Linux中映射時的命名規則:

硬碟裝置命名為,sas接口為sda/sdb/sdc/...,ide接口為hda/hdb/hdc/...,

針對某一個裝置的邏輯分區命名為sda1/sda2/...,或/hda1/hda2/...   :表示sda或hda裝置的多個分區

fdisk -l  檢視目前的實體裝置及邏輯和實體分區

df  檢視已經挂載的實體裝置所挂載在作業系統檔案系統下的目錄

lspci -vvv    檢視目前主機上面所有的硬體配備

Linux驅動及核心編譯

一、編譯Linux核心

1.目前運作系統的Linux版本必須同待編譯系統的Linux版本一緻

檢視核心版本,以及主要和次要版本:

#uname -r

3.5.0-19-generic

要列印系統的體系架構類型,即的機器是32位還是64位,使用:

#uname -p

i686

2.下載下傳與目前系統相同的Linux源碼

下載下傳各個版本linux源碼https://www.kernel.org/

如機器3.5.0版本源碼下載下傳位址為:https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.5.tar.bz2

下載下傳完後,找一個路徑解壓,如我解壓到/linux-3.5/

3.設定源碼的次版本号

進入linux源碼目錄/linux-3.5/,編輯Makefile,将EXTRAVERSION =  修改為EXTRAVERSION= -19-generic,與編譯系統的次版本号相同。

這些都是要配置源碼的版本号與系統版本号,如果源碼版本号和系統版本号不一緻,在加載子產品的時候會出現如下錯誤:insmod: error inserting 'hello.ko': -1 Invalid module format。原因很明确:編譯時用的hello.ko的kenerl 不是我的pc的kenerl版本。

4.編譯Linux核心

執行指令cp /boot/config-3.5.0-19-generic ./config,覆寫原有配置檔案。

進入linux源碼目錄,執行make menuconfig配置核心,執行make編譯核心。

二、編譯Linux驅動

驅動源碼如下:hello.c

/*======================================================================

    Asimple kernel module: "hello world"

======================================================================*/

#include <linux/init.h>

#include <linux/module.h>

MODULE_LICENSE("zeroboundaryBSD/GPL");

static int hello_init(void){

printk(KERN_INFO"Hello World enter\n");

return0;

}

static void hello_exit(void){

printk(KERN_INFO"Hello World exit\n ");

module_init(hello_init);

module_exit(hello_exit);

MODULE_AUTHOR("zeroboundary");

MODULE_DESCRIPTION("A simple HelloWorld Module");

MODULE_ALIAS("a simplestmodule");

Makefile對源碼進行編譯

KERN_DIR = /linux-3.5

all:

make-C $(KERN_DIR) M=`pwd` modules

clean:

make-C $(KERN_DIR) M=`pwd` clean

obj-m += hello.o    #子產品名

module-objs := hello.o [file1.o file2.o] #所有的.o檔案

1.編譯核心将得到hello.ko,将hello.ko拷貝到目标系統,執行

>insmod hello.ko  #需要root權限,将插入子產品,此時在核心日志中會有列印輸出

>dmesg|tail   #檢視核心日志

>rmmod hello.ko  #可以解除安裝該驅動

>lsmod#檢視已經插入的驅動

>modinfo file

>cat /proc/modules    能夠顯示驅動子產品大小、在核心空間中的位址

>cat /proc/devices    隻顯示驅動的主裝置号,且是分類顯示 

2.mknod

insmod插入驅動後,檢視/dev目錄下是否存在對應的節點,如果沒有需要建立一個,這樣應用程式才能引用

>mknod /dev/hello  c 123 0    #建立nod

3.prink的輸出(到終端)

# cat /proc/sys/kernel/printk

6       4       1       7

第一個6表示級别高于(小于)6的消息才會被輸出到控制台,第二個4表示如果調用printk時沒有指定消息級别(宏)則消息的級别為4,第三個1表示接受的最高(最小)級别是1,第四個7表示系統啟動時第一個6原來的初值是7。

是以,如果你發現在控制台上看不到你程式中某些printk的輸出,請使用echo 8 > /proc/sys/kernel/printk來解決。

4.SAS Linux核心中驅動存放位置 drivers/scsi/

5.硬碟狀态檢視

lspci -vvv

fdisk -l

6.将驅動編譯進核心的方法

a.找到驅動要添加的目錄,比如scsi總線驅動 ?/drivers/scsi/

在該目錄下建立驅動目錄,比如megaraid1

b.将所有與該驅動相關的源檔案放在該目錄下,比如?/drivers/scsi/megaraid1

并在該目錄下添加Makefile和Kconfig 2個檔案

c.在Makefile種添加所有的.o檔案及子產品名,如

obj-$(CONFIG_MEGARAID1_SAS)     += megaraid1_sas.o

megaraid1_sas-objs := megaraid1_sas_base.o megaraid1_sas_fusion.o megaraid1_sas_fp.o

很簡單。在Kconf下配置該驅動是否需要編譯進核心的菜單選項

config MEGARAID1_SAS

        tristate "LSI Logic MegaRAID1 SAS RAID1 Module"

        depends on PCI && SCSI

        help

        Module for LSI Logic's SAS based RAID1 controllers.

        To compile this driver as a module, choose 'm' here.

        Module will be called megaraid1_sas

也很簡單。該tristate是三态選項:y編譯進核心,m手動添加,n不編譯

d.回到?/drivers/scsi目錄,配置該目錄下的Makefile和Kconfig

在Makefile中需要添加megaraid1中的Makefile檔案路徑

obj-$(CONFIG_MEGARAID1_SAS)     += megaraid1/

在Kconfig中需要添加megaraid1中的Kconfig檔案路徑

source "drivers/scsi/megaraid1/Kconfig"

e.ok啦,回到?/目錄進行make,此時會提示配置需要編譯的子產品,按提示配置即可,

也可以在檔案?/include/config/auto.conf中手動配置

三.Linux裝置

1.Linux裝置種類很多,比如字元裝置、塊裝置、管道裝置、網絡裝置等

每個裝置必須對應一個裝置檔案才能通路

常見的裝置檔案:裝置檔案通常儲存在/dev:

/dev/hd*   IDE接口的硬碟

/dev/sd*   SCSI/USB裝置

/dev/cda*  序列槽裝置

/dev/lp*   并口裝置

/dev/tty*  終端裝置

/dev/lonsok 控制台裝置

/dev/eth*  以太網裝置

/dev/cdrom 光驅

/dev/fd*   軟驅

/dev/audio 音頻裝置

/dev/scd   SCSI的光驅

/dev/ppp   PPP裝置

/dev/isdn*  ISDN裝置

2.建立裝置檔案

驅動insmod之後,有時需要根據主次裝置号建立裝置檔案,以通路裝置

主裝置号對應驅動,次裝置号對應要通路的裝置。

>cat /proc/devices  檢視裝置對應的主裝置号

建立裝置檔案:

   # mknod

格式:mknod 檔案名  類型  主裝置号   從裝置号

  類型:C字元裝置/B塊裝置/P管道裝置

如:# mknod /dev/fdo b 1 2       //主裝置号必須與驅動對應,次裝置号可以随意取值 

ls -l  /dev/   可以檢視主次裝置号

應用程式調用底層硬體:實體硬體--(端口通路:軟體抽象)>驅動裝置--(主次裝置号)>裝置檔案-(檔案名)>應用程式

本文轉自 a_liujin 51CTO部落格,原文連結:http://blog.51cto.com/a1liujin/1878832,如需轉載請自行聯系原作者

繼續閱讀