• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            mknod 詳解

            Posted on 2009-05-26 18:28 Prayer 閱讀(1378) 評論(0)  編輯 收藏 引用 所屬分類: LINUX/UNIX/AIX
            mknod - make block or character special files
            mknod [OPTION]... NAME TYPE [MAJOR MINOR]
                option 有用的就是 -m 了
                name   自定義
                type 有 b 和 c 還有 p
                主設(shè)備號
                次設(shè)備號


            主設(shè)備號是由/usr/src/linux/include/linux/major.h定義的,如下定義了一個DOC設(shè)備:
            #define IGEL_FLASH_MAJOR 62

            假如有一個命令mknod doc b 62 0 :
            其中的doc為定義的名字,b指塊設(shè)備,0指的是整個DOC。如果把0換為1,則1指的是DOC的第一個分區(qū)。2是第2個,依次類推。

            至于mknod console c 5 1 的意思也很相似:
            console是設(shè)備的名字
            c指字符設(shè)備
            5是該設(shè)備在major.h中定義的標記
            1是第一個子設(shè)備

            mknod console c 5 1
            console為設(shè)備文件名,自己隨便取
            c是指字符型設(shè)備 (可選b,塊設(shè)備)
            5是主設(shè)備號 /dev/devices里面記錄現(xiàn)有的設(shè)備
            找個沒有用的就可以了
            1是次設(shè)備號,當你要給兩個同樣的設(shè)備上一個驅(qū)動的時候就要分了,從0開始,1就是第二個了


            設(shè)備文件

            對于每種硬件設(shè)備,系統(tǒng)內(nèi)核有相應(yīng)的設(shè)備驅(qū)動程序負責對它的處理。而在Unix中,使用設(shè)備文件的方式來表示硬件設(shè)備,每種設(shè)備驅(qū)動程序都被抽象為設(shè)備文件的形式,這樣就給應(yīng)用程序一個一致的文件界面,方便應(yīng)用程序和操作系統(tǒng)之間的通信。

            習(xí)慣上,所有的設(shè)備文件都放置在/dev目錄下。

            $ ls -l /dev/rfd0 /dev/fd0

            brw-r-----   9 root   operator     2,    0 Nov 12 13:32 /dev/fd0

            crw-r-----   9 root   operator     9,    0 Nov 12 13:32 /dev/rfd0

            在上面的列表中可以看到原來顯示文件大小的地方,現(xiàn)在改為顯示兩個用逗號分隔的數(shù)字。這是系統(tǒng)用來表示設(shè)備的兩個重要的序號,第一個為主設(shè)備號(major number),用來表示設(shè)備使用的硬件驅(qū)動程序在系統(tǒng)中的序號;第二個為從設(shè)備號(minor number),硬件驅(qū)動程序使用它來區(qū)分不同的設(shè)備和判斷如何進行處理。FreeBSD下主設(shè)備號用8位表示,而從設(shè)備號用24位來表示。事實上設(shè)備文件的名字并不重要,重要的是這兩個設(shè)備號,操作系統(tǒng)使用它確定硬件驅(qū)動程序,并與硬件驅(qū)動程序進行通信。

            1) 磁盤和塊設(shè)備文件
            在Unix下將設(shè)備分為兩種,塊設(shè)備和字符設(shè)備,其中塊設(shè)備主要用于隨機存取的目的,磁盤為這一類設(shè)備的代表,而字符設(shè)備用于順序存取的目的,例如磁帶或終端設(shè)備就屬于這個類別。

            磁盤設(shè)備的命名方式在前一章中提到過,磁盤設(shè)備由磁盤名、磁盤的序號、分區(qū)的序號、以及FreeBSD子分區(qū)的序號來表示,例如在設(shè)備 wd0s1a中,wd為驅(qū)動程序,此后為設(shè)備序號,0表示為這個驅(qū)動程序的第一個設(shè)備,Unix習(xí)慣上從0開始計數(shù),第三部分的分區(qū)序號為s1,注意這里為第一個分區(qū),因為s1是從1開始向下排列的,與一般Unix的習(xí)慣不同,這是因為分區(qū)的概念是一個DOS概念,因此這里也使用與DOS相對應(yīng)的順序,最后一個a為FreeBSD子分區(qū)的順序,每個UFS基本分區(qū)可以有8個子分區(qū),這8個分區(qū)按照習(xí)慣用于不同的目的,例如wd0s1a用于根文件系統(tǒng), wd0s1b用做交換分區(qū),使用wd0s1c表示整個硬盤分區(qū)wd0s1。因此可以將fd0c用于對整個軟盤fd0進行存取,wcd0c用于對整個光盤 wcd0進行存取等。

            傳統(tǒng)名字,例如wd0a,可以用于表示第一個UFS分區(qū)上的a子分區(qū),如wd0s1a。一般一個硬盤上只有一個UFS分區(qū),因此可以直接使用傳統(tǒng)名字標識磁盤分區(qū)。

            在使用ls命令列表時,系統(tǒng)使用c(character)標識一個字符設(shè)備文件,使用b(block)標識塊設(shè)備文件。

            $ ls -l /dev/*wd0s1

            crw-r-----   1 root   operator     3, 131072 Oct 31 19:59 /dev/rwd0s1

            brw-r-----   1 root   operator     0, 131072 Oct 31 19:59 /dev/wd0s1

            雖然硬盤設(shè)備為塊設(shè)備,用于隨機存取的目的。但它也可以被順序存取,這種方式稱為raw方式。使用raw方式存取硬盤,就需要一個對應(yīng)的字符類型的設(shè)備文件,對應(yīng)wd0s1硬盤設(shè)備的字符類型硬盤設(shè)備為rwd0s1,設(shè)備名中第一個字母使用r表示對硬盤的raw方式順序存取。

            由于設(shè)備文件就代表了整個設(shè)備,就可以使用FreeBSD的標準命令以raw方式直接操作設(shè)備文件,從而直接訪問硬件設(shè)備。利用這種方式,能完成很多有用的工作,但是這種方式也非常危險,例如對硬盤設(shè)備文件的操作失誤會破壞整個硬盤的數(shù)據(jù)。幸好大部分直接訪問設(shè)備的操作都為讀取相應(yīng)數(shù)據(jù)的操作,而不需要寫入磁盤設(shè)備。

            當某個設(shè)備不可使用,則其對應(yīng)的設(shè)備文件也不能正常訪問,因此直接訪問設(shè)備文件可以判斷對應(yīng)的設(shè)備是否真正正常。例如,判斷連接到第一個串口, ttyd0上的鼠標是否正常工作,使用命令 “cat </dev/ttyd0” 來查看ttyd0上的輸入數(shù)據(jù),如果連接的有鼠標且工作正常,那么在移動鼠標的同時屏幕上就會顯示出接收到的雜亂數(shù)據(jù)。如果沒有反應(yīng),說明鼠標工作不正確。

            但是如果存在其他的程序接管了這個設(shè)備,有可能就不能得到正確的結(jié)果。例如系統(tǒng)運行了moused,由moused控制了鼠標端口,那么”cat </dev/ttyd0”就不能正常工作,而 “cat < /dev/sysmouse” 會給出答案。

            cat或其他命令,沒有控制具體接收到數(shù)據(jù)的多少,更有效的系統(tǒng)工具是dd,它能精確輸入輸出一定數(shù)量的數(shù)據(jù)。例如:

            # dd if=/dev/rwd0 of=mbr count=1 bs=512

            這將以512字節(jié)為單位,讀取硬盤wd0上一個單位的數(shù)據(jù),保存到名字為mbr的文件中,通常這是硬盤wd0上的主引導(dǎo)扇區(qū)。

            2) 設(shè)備文件的創(chuàng)建
            通常情況下,安裝系統(tǒng)時已經(jīng)創(chuàng)建了常用的設(shè)備文件,可以直接訪問這些設(shè)備文件來訪問設(shè)備。但在用戶重新定制內(nèi)核,并添加了新硬件驅(qū)動程序之后,新驅(qū)動程序?qū)?yīng)的設(shè)備文件就可能不存在。在FreeBSD中,最常見的例子就是在內(nèi)核中增加聲卡的驅(qū)動程序時,就需要創(chuàng)建相應(yīng)設(shè)備文件。

            創(chuàng)建設(shè)備文件的基本方式是使用mknod,但是必須知道該設(shè)備的正確設(shè)備號才可以。另一種簡單的方式是使用/dev目錄下的shell程序 MAKEDEV來完成,MAKEDEV實質(zhì)上就是記錄了很多設(shè)備的名字與其設(shè)備號之間的關(guān)系的程序,因此它能使用正確的設(shè)備號來創(chuàng)建設(shè)備。首先進入 /dev目錄,然后再執(zhí)行MAKEDEV。

            # cd /dev

            # sh MAKEDEV snd0

            MAKEDEV將使用設(shè)備名作參數(shù)創(chuàng)建設(shè)備文件,同時也創(chuàng)建這個設(shè)備文件依賴的其他相關(guān)設(shè)備文件。MAKEDEV的參數(shù),并不一定為創(chuàng)建的設(shè)備文件名。例如建立 “MAKEDEV vty8” 將建立ttyv0到ttyv7共8個設(shè)備文件,使用 “MAKEDEV wd1s1a” 命令,將建立 wd1、wd1s1、wd1s2等,以及wd1s1a、wd1s1b等設(shè)備文件。也可以使用all做MAKEDEV的參數(shù),這將首先清除/dev目錄下的所有設(shè)備文件,然后MAKEDEV創(chuàng)建所有預(yù)設(shè)的設(shè)備文件。一般情況下這將創(chuàng)建足夠多的設(shè)備文件,其中的大部分設(shè)備文件在具體的系統(tǒng)中不會用得到。

            如果對一個系統(tǒng)中沒有(或者即使有但內(nèi)核沒有支持或探測到)的設(shè)備對應(yīng)的設(shè)備文件進行操作,則系統(tǒng)返回Device not configured的錯誤信息。

            MAKEDEV將使用mknod和對應(yīng)設(shè)備的正確參數(shù),包括字符或塊設(shè)備、主設(shè)備號和從設(shè)備號來建立相應(yīng)的設(shè)備文件。管理員也可以直接使用 mknod創(chuàng)建設(shè)備文件,但這就必須將這些設(shè)備參數(shù)統(tǒng)統(tǒng)指定正確才行。因此除非對系統(tǒng)中的硬件驅(qū)動程序特別熟悉,一般不直接使用mknod來創(chuàng)建設(shè)備文件。




            [root@can]# ll /dev/hd
            hda   hda1 hda2 hda3 hda4 hda5 hdc
            [root@can]# ll /dev/hda
            brw-r----- 1 root disk 3, 0 2008-12-18 /dev/hda
            [root@can]# ll /dev/hda4
            brw-r----- 1 root disk 3, 4 2008-12-18 /dev/hda4
            [root@can]#
            久久久久国产精品熟女影院| 久久久无码精品午夜| 亚洲AV无码久久精品色欲| 久久久久久久精品妇女99| 精品午夜久久福利大片| 亚洲国产精品综合久久一线 | 国产99久久久国产精品~~牛| 久久精品一区二区三区中文字幕| 国内精品九九久久精品| 久久久久无码精品| 97精品伊人久久大香线蕉app | 一本色道久久综合亚洲精品| 国产精品久久国产精麻豆99网站| 区久久AAA片69亚洲| 国产69精品久久久久9999| 久久er99热精品一区二区| 久久亚洲2019中文字幕| 国产精品久久久久久影院| 久久午夜无码鲁丝片| 久久婷婷国产剧情内射白浆| 久久久久国产精品嫩草影院| 香蕉久久一区二区不卡无毒影院| 久久精品人人做人人爽97| 丁香色欲久久久久久综合网| 久久久久久久91精品免费观看| 精品久久久久久无码人妻热 | 思思久久99热只有频精品66| 久久综合成人网| 久久夜色精品国产www| 久久AⅤ人妻少妇嫩草影院| 国产成人久久777777| 国产精品美女久久久久av爽 | 久久棈精品久久久久久噜噜| 亚洲欧美日韩中文久久| 久久亚洲美女精品国产精品| 日韩av无码久久精品免费| 亚洲女久久久噜噜噜熟女| 欧洲成人午夜精品无码区久久 | 亚洲精品乱码久久久久久自慰| 亚洲女久久久噜噜噜熟女| 色综合久久久久综合体桃花网|