虛擬機Linux Redhat 9與目標開發板進行系統編程方面的問題總結(轉載)

總結的知識點有:1、VMWare裏Linux使用MINICOM實現與開發板的通訊;2、PC機中Linux系統與目標開發板的NFS文件系統的掛接;3、修改文件的使用權限;4、在Linux系統下設置NFS共享;5、tar壓縮、解壓用法(platinum);6、NFS網絡文件系統的設置;7、修改外殼腳本的權限;8、內核的編譯和移植(以PXA270爲例);9、編寫Red hat內核驅動程序前需要注意的;10、調試過程中利用printk跟蹤;11、編寫Makefile文件需要注意的;12、設備文件和設備文件系統;13、Linux驅動程序的編寫細節點;14、嵌入式根文件系統;15、查看/dev目錄下的設備的主次設備號的命令

1、VMWare裏Linux使用MINICOM實現與開發板的通訊
MINICOM是Linux提供的和Windows超級終端一樣的工具,一般用做串口與開發板通信,當然有的板子也用USB,這裏總結串口的設置:

一、VMWARE虛擬機添加串口(如果沒用虛擬機可以跳過這步)
如果在VMWARE虛擬機下 一定要記得先確認這步 要不不好使 很多朋友的問題就在這裏!
先關閉虛擬機下的LINUX,然後設置一下虛擬機:在vm-〉settings-〉hardware裏添加串口 COM1 COM2都加上吧

二 設置MINICOM
進LINUX系統 開個控制檯 字符裏輸入minicom 就啓動了
這時一般還要設置一下
Ctrl+A進入控制界面(Esc返回)按Z進設置
一般設置兩個
1 按O(注意:是O不是零)設置第三第四項,分別是串口設置與MODEM設置
串口設置:不用說了吧 進去都看明白了 敲字母 設置相應項目 比如“115200 8-N-1”
MODEM設置:也要設置一下 要不有的看不到東西 把上面兩個選項都清空 就是按那行前面的字母(好象是‘A’和什麼)然後光標就跳過去了 刪之
回車 到開始選第三第四項的菜單 選下面的保存(別忘了保存 菜鳥們常犯)
2 回到剛纔按O的界面 看一下P 裏面的串口設置對不對
對就不用改了 不對改之

提醒一下:LINUX設備的編號是從0開始的 比如串口1也就是COM1在LINUX裏的設備號叫ttyS0
串口設置裏面要用到 那裏添全部路徑也就是"/dev/ttyS0"
好了 就這麼簡單

在這次的連接開發板的實驗過程中,主要的問題有:

1、在試用VMware虛擬機的時候沒有給虛擬機添加上串口,所以在Linux虛擬機下的minicom是無法識別到連接到主機的串口上的。解決方法如上所示,在VMware中添加了串口,纔可以通過虛擬機訪問到串口設備。

2、在啓動的時候沒有關閉掉windows中的“超級終端”,所以在啓動了虛擬機以後顯示“com1”不能正常工作,發現該問題後,關閉了Windows中的“超級終端”,然後重啓了虛擬機。呵呵,從此Linux虛擬機下終於可以順利的進行串口的連接了。

最後退出設置菜單就可以使用minicom與開發板通訊了。

2、PC機中Linux系統與目標開發板的NFS文件系統的掛接

設置好相對應的IP地址後,一般我設的Linux系統的IP地址是192.168.0.14,網關是192.168.0.255,子網掩碼是255.255.255.0

目標開發板的IP地址操作是:

mount eth0 192.168.0.5 broadcast 192.168.0.255 netmask 255.255.255.0

建立好對接後先ping下各自的IP地址看是否都連通了。

用指令mount -t nfs 192.168.0.14:/home /tmp/nfs進行掛接

3、修改文件的使用權限

chmod 777 文件名

4、在Linux系統下設置NFS共享
    網絡文件系統(NFS,Network File System)是一種將遠程主機上的分區(目錄)經網絡掛載到本地系統的一種機制,通過對網絡文件系統的支持,用戶可以在本地系統上像操作本地分區一樣來對遠程主機的共享分區(目錄)進行操作。
  在嵌入式Linux 的開發過程中,開發者需要在Linux 服務器上進行所有的軟件開發,交叉編譯後,通用FTP 方式將可執行文件下載到嵌入式系統運行,但這種方式不但效率低下,且無法實現在線的調試。因此,可以通過建立NFS,把Linux 服務器上的特定分區共享到待調試的嵌入式目標系統上,就可以直接在嵌入式目標系統上操作Linux 服務器,同時可以在線對程序進行調試和修改,大大的方便了軟件的開發。因此,NFS 的是嵌入式Linux 開發的一個重要的組成部分,本部分內容將詳細說明如何配置嵌入式Linux 的NFS 開發環境。
  嵌入式Linux 的NFS 開發環境的實現包括兩個方面:一是Linux 服務器端的NFS 服務器支持;二是嵌入式目標系統的NFS 客戶端的支持。因此,NFS 開發環境的建立需要配置linux 服務器端和嵌入式目標系統端。
  一、Linux 服務器端NFS 服務器的配置
  以root 身份登陸Linux 服務器,編輯/etc 目錄下的共享目錄配置文件exports,指定共享目錄及權限等。
  執行如下命令編輯文件/etc/exports:
  # vi /etc/exports
  在該文件裏添加如下內容:
  /home/work 192.168.0.*(rw,sync,no_root_squash)
  然後保存退出。
  添加的內容表示:允許ip 地址範圍在192.168.0.*的計算機以讀寫的權限來訪問/home/work 目錄。
  /home/work 也稱爲服務器輸出共享目錄。
  括號內的參數意義描述如下:
  rw:讀/寫權限,只讀權限的參數爲ro;
  sync:數據同步寫入內存和硬盤,也可以使用async,此時數據會先暫存於內存中,而不立即寫入硬盤。
  no_root_squash:NFS 服務器共享目錄用戶的屬性,如果用戶是 root,那麼對於這個共享目錄來說就具有 root 的權限。
  接着執行如下命令,啓動端口映射:
  # /etc/rc.d/init.d/portmap start
  最後執行如下命令啓動NFS 服務,此時NFS 會激活守護進程,然後就開始監聽 Client 端的請求:
  # /etc/rc.d/init.d/nfs start
  用戶也可以重新啓動Linux 服務器,自動啓動NFS 服務。
  在NFS 服務器啓動後,還需要檢查Linux 服務器的防火牆等設置(一般需要關閉防火牆服務),確保沒有屏蔽掉NFS 使用的端口和允許通信的主機,主要是檢查Linux 服務器iptables,ipchains 等選項的設置,以及/etc/hosts.deny,/etc/hosts.allow 文件。
  我們首先在Linux 服務器上進行NFS 服務器的迴環測試,驗證共享目錄是否能夠被訪問。在Linux 服務器上運行如下命令:
  # mount –t nfs 192.168.0.20:/home/work /mnt
  # ls /mnt
  命令將Linux 服務器的NFS 輸出共享目錄掛載到/mnt 目錄下,因此,如果NFS 正常工作,應該能夠在/mnt 目錄看到/home/work 共享目錄中的內容。

    二、嵌入式目標系統NFS 客戶端的配置
  在Linux 服務器設置好後,還需要對客戶端進行相關配置。在配置內核時選擇Load an Alternate Configuration File輸入配置文件的路徑和文件名添加內核對NFS的支持:
  選中networking options-》IP:kernel level auloconfiguralion項
  選中file systems-》network file systems-》下的root file system on nfs
  和nfs file system support重新編譯內核下載bootloader和kernel到開發板上
  在嵌入式目標系統的Linux Shell 下,執行如下命令來進行NFS 共享目錄掛載:
  # mkdir /mnt/nfs //建立Linux 服務器輸出共享目錄的掛載點;
  # mount –t nfs 192.168.0.20:/home/work /mnt/nfs –o nolock
  # cd /mnt/nfs
  # ls
  此時,嵌入式目標系統端所顯示的內容即爲Linux 服務器的輸出目錄的內容,即Linux 服務器的輸出目。
  錄/home/work 通過NFS 映射到了嵌入式目標系統的/mnt/nfs 目錄。用戶可以用增/刪/修改文件的方式來驗證實際效果。mount 命令中的192.168.0.20 爲Linux 服務器的IP 地址,/home/work 爲Linux 服務器端所配置的共享輸出目錄,/mnt/nfs 爲嵌入式設備上的本地目錄。
  在開發過程中,來回輸入命令非常煩人,我寫了兩個簡單的腳本來完成nfs的啓動,掛載。
  host啓動nfs:
  snfs
  #!/bin/bash
  ifconfig eth0 192.168.0.20
  /etc/rc.d/init.d/portmap start
  /etc/rc.d/init.d/nfs start
  嵌入式目標機掛載nfs:
  mnfs:

  #!/bin/sh
  mount -t nfs 192.168.0.20:/home/work/nfs /mnt/nfs -o nolock
  echo “nfs ok!”

總結:

1、在配置NFS服務器之前用ping命令確保兩個linux系統正常連接,如果無法連接關閉圖形界面中的防火牆#service iptables stop
2、在配置中確保輸入的命令是正確的
3、更改完“exports”文件後要輸入exportfs –rv ,使得“exports”文件生效。
4、檢查nfs服務是否開啓,默認是關閉的。
5、卸載的時候不能在/mnt目錄中卸載,必須註銷系統後卸載。
卸載系統中已掛載的NFS共享目錄:命令# umount /mnt/

5、tar壓縮、解壓用法(platinum)
解壓:x
壓縮:c
針對gz:z
針對bz2:j
用於顯示:v

解壓實例
gz文件:tar xzvf xxx.tar.gz
bz2文件:tar xjvf xxx.tar.bz2

壓縮實例
gz文件:tar czvf xxx.tar.gz /path
bz2文件:tar cjvf xxx.tar.bz2 /path

6、NFS網絡文件系統的設置

    NFS本身不提供信息傳輸的協議和功能,但它的確能夠透過網絡實現信息的分享,它是Linux系統中廣泛使用的文件系統,可以方便地實現異構網絡系統的文件共享、數據交換,以及其他分佈式的應用。

Linux會默認安裝NFS文件系統,查看NFS是否安裝,可以執行以下命令:

rpm -qa |grep nfs

啓動NFS服務器主要分爲以下兩步:

portmap start

/etc/rc.d/init.d/nfs start

NFS服務器的共享配置保存在/etc/exports文件中,如果用戶修改了這個文件,可以運行以下的命令行,以便馬上生效。

/etc/rc.d/init.d/nfs restart

掛接可以使用mount進行,掛接前必須創建好要掛接到的目標目錄

例如:mount -t nfs 192.168.8.188:/install /home/install

另外如果用戶希望開機時自動掛接,也可以用以下方法編輯/etc/fstab文件,在/etc/fstab文件中追加一行:(以IP爲192.168.8.188爲例

192.168.8.188:/install /home/install nfs defaults,auto 0 0

192.168.8.188:/Downloads /home Downloads   nfs ro 0 0

/etc/fstab文件格式如下:

fs_spec fs_file fs_type fs_options fs_dump fs_pass

fs_spec-該字段定義要加載的文件系統所在的設備或遠程文件系統,對於NFS文件系統一般配置爲:192.168.8.188:/install的格式

fs_file-本地的掛載目標路徑

fs_type-對於NFS來說文件系統爲nfs

fs_options-掛載的參數,這個參數可以參考mount命令行

fs_dump-該選項可以設置爲0

fs_pass-該選項可以設置爲0

7、修改外殼腳本的權限
chmod u+x filename 只用自己可以執行,其他人不能執行

chmod ug+x filename 只有自己以及同一工作組的人可以執行,其他人不能執行

chmod +x filename 或者 chmod 777 filename 所有人都可以執行

8、內核的編譯和移植(以PXA270爲例)

    針對目前嵌入式系統中最流行的ARM平臺,它的這部分工作就是由英國ARM公司的工程師完成的,我們所要做的就是從其網站上下載相關版本Linux內核的補丁(Patch)。把它打到我們的Linux內核上,再進行交叉編譯就行。
其基本過程是這樣的(以Linux2.6.9爲例):
1)、到
ftp://ftp.arm.linux.org.uk 上下載Linux2.6.9 內核及其關於ARM 平臺的補丁
2)、給Linux2.6.9 打補丁
3)、準備交叉編譯環境。交叉編譯環境工具鏈一般包括binutils(含AS 彙編器,LD 鏈接器等),arm-gcc,glibc 等。交叉編譯環境的搭建也是個複雜的過程,後面我將做進一步介紹。
4)、修改內核目錄下的makefile 文件,主要是以下幾行:
註釋掉ARCH:=$(shell uname –m | sed –e s/i.86/i386/-e s/sun4u/sparc64/ -e s/arm.
/ */arm/ - e s/sa110/arm/)這一行。
ARCH := 改爲 ARCH := arm
CROSS_COMPILE := 改爲 CROSS_COMPILE = 您的交叉編譯工具中arm-linux 所在目錄/arm-linux-
例如:CROSS_COMPILE = /opt/crosstool/arm-linux/bin/arm-linux-
5)此後就可以進行編譯。
6)以上可以使您的目標板上跑起linux 系統,但是您的pxa270 目標板上的一些硬件還沒有驅
動起來,這需要您編寫相應的硬件驅動程序。

修改Linux的內核源碼:

    在Linux啓動的第一階段,內核與體系結構相關部分(arch目錄下)首先執行,它完成硬件寄存器設置,內存映像等初始化工作。然後把控制權轉給內核中與系統結構無關部分。而我們移植工作中要改動的代碼主要集中在與體系結構相關部分。

    在arch 目錄中我們可以看到有許多子目錄,它們往往是用芯片命名的,表示是針對該芯片體系結構的代碼。爲arm 系列芯片編譯內核,就應修改ARM目錄下的相關文件。在ARM的子目錄下我們可以找到一個boot/bootp目錄,在bootp下有一個init.S 的文件,.S表示它是彙編語言文件。這裏init.S是用ARM彙編寫成的。這個init.S就是引導Linux內核在Arm平臺上啓動的初始化代碼。它裏頭定義了一個全局符號_start,它定義了默認的起始地址。同時它也是整體內核二進制鏡像的起始標誌。Init.S主要完成以下功能:(具體的代碼可以查閱UP-TECHPXA270A-LINUX實驗指導書V5.0
1) 定義數據段、代碼段、bbs(未初始化數據段)起始地址變量並對bbs段進行初始化。
2) 設置寄存器以初始化系統硬件。
3) 關閉中斷。
4) 初始化LCD顯示。
5) 將數據段數據複製到內存。
6) 跳轉到內核起始函數start_kernel繼續執行。
7) 對主寄存器的修改。

Linux 內核的編譯菜單有好幾個版本,您運行:
1)make config:進入命令行,可以一行一行的配置,這不好使用所以我們不具體介紹.
2)make menuconfig:進入我們熟悉的menuconfig 菜單,相信很多人對此都不陌生.
3)make xconfig:在2.4.X 以及以前版本中xconfig 菜單是基於TCL/TK 的圖形庫的。(本人推薦使用這種)

編譯內核:
進入目錄
tar xjvf up-linux-2.6.9-release.tar.bz2 -C /up-techpxa270/kernel/
ln –s linux-2.6.9 linux
cd linux
make clean
make dep
make bzImage(或者make zImage)
生成的二進制文件爲zImage 存儲在./arch/arm/boot/zImage。

把生成的zImage 文件拷貝到PC 機的tftp 服務目錄/tftpboot/下,在進行以下操作前請確保已配置好您的PC 機TFTP 服務器。(安裝軟件tftp32)

燒錄內核:
1. 啓動pxa270 開發板,按ctl+c 組合鍵進入blob
2. 配置tftp 服務:
打開PC 機的tftp 服務,關閉防火牆;
在blob 下使用ifconfig server 192.168.0.43(192.168.0.43 爲您的tftp 服務器ip)配置服務器IP,
注意只能一次配置有效,若重啓開發板需要再次配置。
3. 可以輸入help 查看blob 下的命令,輸入help command 查看命令參數。
4. 按照以下命令燒寫zImage 到Ram:
tdownload kernel
5. 按照以下命令燒寫zImage 到flash:
flash kernel

至此,內核映象文件的燒寫完成。

另外,若在vivi的Bootloader引導下,還可以通過串口的方式燒寫內核和根文件系統(分別爲zImageroot.cramfs兩個文件)

vivi>load flash kernel x

vivi>load flash root x

9、編寫Red hat內核驅動程序前需要注意的

    需要在usr/src/ 目錄下建立指向linux內核的符號連接。若PC機的linux系統內核路徑是/usr/src/linux-2.4.xxx,那麼執行建立符號連接的命令是:
#ln -s /usr/src/linux-2.4.xxx /usr/src/linux

before make , please cd /up-techpxa270/kernel/linux-2.6.9/ directory and run " make zImage"
then go back to this directory ,run make

10、調試過程中利用printk跟蹤

    printk是一個很有用的函數,利用它可以實現從內核向Linux控制檯的格式化輸出。其用法與標準C的printf類似。在調試驅動程序時,依靠printk輸出信息跟蹤程序,也是很有效的方法。

    與標準C的printf不同的是,printk支持分級輸出。在include/linux/kernel.h中,爲輸出定義瞭如下8個級別:

#define    KERN_EMERG       "<0>"    /* system is unusable,緊急情況 */
#define    KERN_ALERT        "<1>"    /* action must be taken immediately,需要立即被注意到的 */
#define    KERN_CRIT           "<2>"    /* critical conditions,臨界情況 */
#define    KERN_ERR            "<3>"    /* error conditions,錯誤 */
#define    KERN_WARNING "<4>"    /* warning conditions,警告 */
#define    KERN_NOTICE      "<5>"    /* normal but significant condition,普通的,需要注意 */
#define    KERN_INFO            "<6>"    /* informational,非正式的 */
#define    KERN_DEBUG      "<7>"    /* debug-level messages,一般的調試信息 */

未指定優先級的默認級別定義在/kernel/printk.c中:
#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */

可以用這種方式,即使用:printk(KERN_INFO"your message/n"); 在指定的級別下輸出。未使用輸出級別定義的printk調用,則用DEFAULT_MESSAGE_LOGLEVEL作爲默認的輸出級別,它在kernel/printk.c中被定義爲第4級的輸出,即KERN_WARNING。在include/linux/kernel.h中,定義了宏console_loglevel.任何小於console_loglevel級別的輸出,都會被顯示在Linux控制檯(console)上。console_loglevel的初始值爲DEFAULT_CONSOLE_LOGLEVEL(在kernel/printk.c中被定義爲7),而且該值可通過sys_syslog系統調用修改。如命令:klogd -C 4 就是利用sys_syslog系統調用把console_loglevel的值改成了4。

    爲了調試方便,建議在驅動程序中定義DPRINTK宏實現在調試過程中的跟蹤。

其命令如下:#define DPRINTK(x... )    printk("s3c2410 - led: " ##x)

用法如下:DPRINTK("write: led=0x%x,count=%d/n",ledstatus,count);

DPRINTK("open/n");

DPRINTK("release/n");

11、編寫Makefile文件需要注意的

編寫hello.c文件
利用vi編輯器,我們鍵入下面的代碼,並保存爲hello.c文件。
/**
* hello.c
*     ------Test for kernel module
*/
#i nclude <linux/init.h>         
#i nclude <linux/module.h>       
                               
MODULE_LICENSE("MYGPL");                      //(1)     
                                
static int hello_init(void)                   //(2)
{                               
    printk(KERN_ALERT "Hello, world/n");      //(3)
    return 0;                           
}                                       

static void hello_exit(void)    
{
    printk(KERN_ALERT "Goodbye, cruel world/n");
}

module_init(hello_init);                      //(4)
module_exit(hello_exit);                      //(5)
對上面這段代碼中有5個地方需要加以說明:
    (1):本句代碼可以不要,但不要的話,運行時會出現"hello: module license 'unspecified' taints kernel.",詞典上對taints的解釋是"感染,污點".
    (2):我們可以看出,對模塊內的函數一般需要加上static關鍵字進行修飾,這樣可防止模塊外訪問該函數,這是應該養成的一個好習慣。
    (3):printk函數相當於C標準庫函數printf, KERN_ALERT是指的輸出消息的優先級別,且KERN_ALERT優先級別最高。
    (4)(5):模塊初始化和模塊退出時有專門的函數,我們只需要爲這兩個函數指定初始化和退出時的具體調用的函數名即可。

編寫下面的makefile:
# Makefile for hello module
# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.

ifneq($(KERNELRELEASE),)
obj-m := hello.o

# Otherwise we were called directly from the command
# line; invoke the kernel build system.

else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules

endif

clean:
$(shell rm -f *.bak)
$(shell rm -f hello.o)
$(shell rm -f hello.ko)
$(shell rm -f hello.mod.c)
$(shell rm -f hello.mod.o)
對這段腳本需要說明下面幾點:
    (1)、將上面的腳本保存爲Makefile,注意必須保存爲M爲大寫的Makefile。這是因爲編譯的時候首先看環境變量KERNELRELEASE是否定義,如果沒定義則調用Linux內核編譯build腳本。該腳本會首先編譯內核,其間會創建環境變量KERNELRELEASE,接着編譯當前工作目錄下的hello模塊,此時會第二遍讀取Makefile,再次判斷環境變量KERNELRELEASE是否定義,已經定義的情況下開始編譯hello模塊。
如果將該腳本保存爲小寫m開頭的makefile,編譯時會出現這樣的提示:
scripts/Makefile.build:13: /root/zhou/Makeifle: No such file or directory.
    (2)、因爲build腳本會首先判斷有無必要重新編譯內核,所以如果需要先重新編譯內核的話,編譯過程會運行一段時間。
    (3)、在Makefile中行首縮進需要用Tab鍵,否則會出問題(這個問題曾經摺磨我很長一段時間,後來改用Tab鍵縮進,問題一下子就得到了解決)。
    (4)、在default部分,原書中原來的語句是:
             $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
         利用man make命令查看make的使用手冊發現,對-m的說明:
             -m   These options are ignored for compatibility with other version of make.     
       即-m參數被忽略掉了,所以編譯時會出現:
           Nothing to be done for '/root/zhou'.
       爲了避免上述問題,可將M=$(PWD)改成SUBDIRS=$(PWD),即重新定義環境變量SUBDIRS,供編譯時使用。
編譯完成後,在當前工作目錄下會多了幾個文件:hello.o, hello.ko, hello.mod.c, hello.mod.o。其中hello.ko就是我們需要的。

.ko是2.6內核使用的動態連接文件的後綴名,也就是模塊文件。

另:在編譯內核並安裝時,系統會改變或新增哪些文件?
會在/boot/下增加新的內核文件,新的initrd和map文件,修改grub的配置
文件/boot/grub/grub.conf

運行
    必須有root用戶的權限,才能進行內核模塊操作。
    (1)、
掛載模塊
         執行insmod hello.ko命令,即可掛載並運行hello模塊。insmod意思是insert module。成功掛載上hello模塊後,會輸出:
             Hello, world
    (2)、卸載模塊
         執行rmmod hello命令(也可以執行rmmod hello.ko命令),即可卸載模塊。rmmod意思是remove module。成功卸載模塊後,會輸出:
             Goodbye, cruel world

    在內核上成功掛載和卸載了hello模塊。知道在執行rmmod hello命令後,hello模塊已經卸載了。如果此時我們再執行一遍rmmod hello命令,則會出現類似下面的提示:
      ERROR: Module hello does not exist in /proc/modules
    從這句提示中,可以知道,掛載模塊時,hello被放在了/proc/modules文件中,卸載模塊時,從/proc/modules文件中刪除了對應的記錄行。爲了驗證這一點,利用insmod hello.ko命令重新掛載hello模塊,然後,我們利用more /proc/modules命令來查看該文件的內容,可以看到在第一行就是我們剛掛上的hello模塊:
     hello 1152 0 - Live 0xca8c9000
    關閉該文件。我們再利用rmmod hello命令卸載掉hello模塊,然後我們再次利用more /proc/modules命令再次查看該文件,可以發現已經沒有了這一行內容。其實每次執行lsmod命令,就是讀取和顯示/proc/modules文件中的內容

12、設備文件和設備文件系統

    在Linux系統中,字符設備和塊設備是通過文件節點訪問的。習慣上,這些設備文件存在於系統的/dev目錄下。因爲系統不是靠路徑去關聯設備文件和對應的驅動程序的,所以也可通過mknod命令把設備文件創建在其他位置。通過如下命令:ls -l /dev 可以列出系統的設備文件。

    其中:對應的字母表示的是:字符設備文件(c),准予讀取(r),准予寫入(w),塊設備文件(b),所有者(root),組(floppy);第一個數字對應的是主設備號,第二個數字對應的是次設備號。

    Linux系統是依靠主次設備號來聯繫驅動程序和設備文件節點的(而不是設備文件的路徑)。系統依靠主設備號標識不同的驅動程序,因此,在同一個系統中,一類設備的主設備號是惟一的。每一個Linux驅動程序都對應了一個主設備號。可以使用以下命令:cat /proc/devices 列出系統內核支持的設備驅動程序和對應的主設備號。

    同一個驅動程序可以管理多個設備,它們依靠次設備號來區別。次設備號只在驅動程序內部使用,系統內核直接把次設備號傳遞給驅動程序,由驅動程序去管理。

    對於字符設備和塊設備,Linux內核對這些操作進行了統一 的抽象,把它們定義在結構體file_operations中。

Linux下的設備驅動程序通常放在/dev目錄下。如果我們進入到/dev目錄,然後執行ls -l|more命令,我們會發現下面幾點:
(1)、以b開頭的代表block device
(2)、以c開頭的代表character device
(3)、以l開頭的代表link文件
(4)、以d開頭的代表directory
(5)、在last modified的前面有兩個數字,用逗號隔開,分別是該設備的major number和minor number,即主設備號和次設備號。
例如:
brw-rw---- 1 root disk 34, 70 Dec 29 2005 hdh6

13、Linux驅動程序的編寫細節點
    嵌入式Linux操作系統下通過fd=open(DEVICE_NAME,O_RDER)把驅動程序和應用程序連接起來,便可以通過應用層程序操控硬件設備。

    通常,程序員會通過一個判斷語句來觀察設備是否被正確打開,如果被正確打開會進行所要的操作,否則便會報錯。實現方法如下面的代碼所示:

if(fd==-1) {printf("open device %s error /n",DEVICE_NAME);}

else{//文件打開成功,進行具體的文件操作}

driver_register是2.6內核中提供的註冊驅動程序的方法,其原型在drivers/base/driver.c中定義:

int driver_register(struct device_driver * drv)

它使得系統加載、檢測、卸載驅動程序有一個統一的接口。

程序在最外一層的local_irq_restore調用才把中斷打開,而__cli__sti宏則不能嵌套調用。

14、嵌入式根文件系統

目錄 習慣用法
bin:用戶命令所在目錄
dev:硬件設備文件及其它特殊文件
etc:系統配置文件,包括啓動文件等
home:多用戶主目錄
lib:鏈接庫文件目錄
mnt:裝配點,用於裝配臨時文件系統或其他的文件系統
opt:附加的軟件套件目錄
proc:虛擬文件系統,用來顯示內核及進程信息
root:root 用戶主目錄
sbin:系統管理員命令目錄
tmp:臨時文件目錄
usr:用戶命令目錄
var:監控程序和工具程序所存放的可變數據

對於用途單一的嵌入式系統,上邊的一些用於多用戶的目錄可以省略,例如/home、/opt、/root目錄等。而/bin、/dev、/etc、/lib、/proc、/sbin 和/usr 目錄,是幾乎每個系統必備的目錄,也是不可或缺的目錄。

15、查看/dev目錄下的設備的主次設備號的命令

查看/dev目錄下的設備的主次設備號使用如下的命令:ls /dev -l
在系統/dev下查看設備的命令:
#pwd
/dev
#ll

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章