當前位置:首頁 » 生產設備 » 字元設備有哪些

字元設備有哪些

發布時間: 2021-02-04 00:09:12

1. linux中什麼是塊設備和字元設備

塊設備復是I/O設備中的一類,是制將信息存儲在固定大小的塊中,每個塊都有自己的地址,還可以在設備的任意位置讀取一定長度的數據。數據塊的大小通常在512位元組到32768位元組之間。塊設備的基本特徵是每個塊都能獨立於其它塊而讀寫。

字元設備是在I/O傳輸過程中以字元為單位進行傳輸的設備。在linux系統中,字元設備以特別文件方式在文件目錄樹中占據位置並擁有相應的結點。結點中的文件類型指明該文件是字元設備文件。可以使用與普通文件相同的文件操作命令對字元設備文件進行操作。

(1)字元設備有哪些擴展閱讀:

在大多數的linux操作系統中,塊設備只支持以塊為單位的訪問方式,如磁碟等。KYLIN支持以字元方式來訪問塊設備,即支持以字元為單位來讀寫磁碟等塊設備。所以在/dev目錄中的塊設備,如磁碟等,均以字元設備的外觀出現。

當一台字元型設備在硬體上與主機相連之後,必須為這台設備創建字元特別文件。linux操作系統的mknod命令被用來建立設備特別文件。

參考資料來源:

網路——塊設備

網路——字元設備

2. unlx/linux操作系統中將設備分為字元設備和塊設備進行管理,有什麼特點

字元設備是一些串列埠的設備,比如鍵盤、滑鼠等,它的特點是串內行讀取,不能夠截斷輸容出(也就是不能隨機訪問)。比如滑鼠,它的移動是滑動而不是跳躍。
塊設備一般是存儲設備,比如硬碟、軟盤等。它的特點是讓系統隨機訪問,比如硬碟,你可以在硬碟的不同塊讀寫,也可以隨機訪問硬碟的數據。

3. Linux下字元設備文件的概念及舉例

不是後綴,記住linux不使用後綴來識別文件類型
你使用 ls -al
drwxr-xr-x. 4 root root 100 Apr 26 15:05 cpu
lrwxrwxrwx. 1 root root 13 Apr 26 15:05 fd -> /proc/self/fd
brw-rw----. 1 root disk 7, 0 Apr 26 15:05 loop0
crw-rw----. 1 root lp 6, 2 Apr 26 15:05 lp2
你仔細看第一位 d代表文件目錄文件,l代表鏈接文件,b代表塊設備文件,c代表字元設備文件
`-'
regular file

`b'
block special file

`c'
character special file

`C'
high performance ("contiguous data") file

`d'
directory

`D'
door (Solaris 2.5 and up)

`l'
symbolic link

`M'
off-line ("migrated") file (Cray DMF)

`n'
network special file (HP-UX)

`p'
FIFO (named pipe)

`P'
port (Solaris 10 and up)

`s'
socket

`?'
some other file type

4. 按什麼分類可以分成塊設備和字元設備

D、信息交換單位

塊與字元屬於不同的單位 跟屬性特性啥的沒關系 (基礎)

5. 塊設備文件和字元設備文件的本質區別是什麼

設備文件分為Block
Device Driver和Character Device Drive兩類。Character Device Drive又被稱為字元設備或裸設備raw
devices; Block Device Driver通常成為塊設備。而Block Device Driver是以固定大小長度來傳送轉移資料
;Character Device Driver是以不定長度的字元傳送資料 。且所連接的Devices也有所不同,Block
Device大致是可以隨機存取(Random Access)資料的設備,如硬碟機或光碟機;而Character
Device剛好相反,依循先後順序存取資料的設備,如印表機 、終端機等皆是。

/dev/dsk對應的為塊設備,文件系統的操作用到它,如mount。/dev/rdsk對應的為字元設備(裸設備,rdsk的r即為 raw),fsck
newfs等會涉及到。一般我們的操作系統和各種軟體都是以塊方式讀寫硬碟,這里的塊是邏輯塊,創建文件系統時可以選擇,windows里叫簇。可看 newfs or
mkfs的manual。oracle是比較常見的字元方式讀寫硬碟。

字元設備還是塊設備的定義屬於操作系統的設備訪問層,與實際物理設備的特性無必然聯系。設備訪問層下面是驅動程序,所以只要驅動程序提供的方式,都可以。也就是說驅動程序支持stream方式,那麼就可以用這種方式訪問,驅動程序如果還支持block方式,那麼你想用哪種方式訪問都可以,典型的比如硬碟式的裸設備,兩種都支持塊設備(block
device):是一種具有一定結構的隨機存取設備,對這種設備的讀寫是按塊進行的,他使用緩沖區來存放暫時的數據,待條件成熟後,從緩存一次性寫入設備或從設備中一次性讀出放入到緩沖區,如磁碟和文件系統等字元設備(Character
device):這是一個順序的數據流設備,對這種設備的讀寫是按字元進行的,而且這些字元是連續地形成一個數據流。他不具備緩沖區,所以對這種設備的讀寫是實時的,如終端、磁帶機等。

系統中能夠隨機(不需要按順序)訪問固定大小數據片(chunks)的設備被稱作塊設備,這些數據片就稱作塊。最常見的塊設備是硬碟,除此以外,還有軟盤驅動器、CD-ROM驅動器和快閃記憶體等等許多其他塊設備。注意,它們都是以安裝文件系統的方式使用的——這也是塊設備一般的訪問方式。

另一種基本的設備類型是字元設備。字元設備按照字元流的方式被有序訪問,像串口和鍵盤就都屬於字元設備。如果一個硬體設備是以字元流的方式被訪問的話,那就應該將它歸於字元設備;反過來,如果一個設備是隨機(無序的)訪問的,那麼它就屬於塊設備。

這兩種類型的設備的根本區別在於它們是否可以被隨機訪問——換句話說就是,能否在訪問設備時隨意地從一個位置跳轉到另一個位置。舉個例子,鍵盤這種設備提供的就是一個數據流,當你敲入「fox」這個字元串時,鍵盤驅動程序會按照和輸入完全相同的順序返回這個由三個字元組成的數據流。如果讓鍵盤驅動程序打亂順序來讀字元串,或讀取其他字元,都是沒有意義的。所以鍵盤就是一種典型的字元設備,它提供的就是用戶從鍵盤輸入的字元流。對鍵盤進行讀操作會得到一個字元流,首先是「f」,然後是「o」,最後是「x」,最終是文件的結束(EOF)。當沒人敲鍵盤時,字元流就是空的。硬碟設備的情況就不大一樣了。硬碟設備的驅動可能要求讀取磁碟上任意塊的內容,然後又轉去讀取別的塊的內容,而被讀取的塊在磁碟上位置不一定要連續,所以說硬碟可以被隨機訪問,而不是以流的方式被訪問,顯然它是一個塊設備。

內核管理塊設備要比管理字元設備細致得多,需要考慮的問題和完成的工作相比字元設備來說要復雜許多。這是因為字元設備僅僅需要控制一個位置—當前位置—而塊設備訪問的位置必須能夠在介質的不同區間前後移動。所以事實上內核不必提供一個專門的子系統來管理字元設備,但是對塊設備的管理卻必須要有一個專門的提供服務的子系統。不僅僅是因為塊設備的復雜性遠遠高於字元設備,更重要的原因是塊設備對執行性能的要求很高;對硬碟每多一分利用都會對整個系統的性能帶來提升,其效果要遠遠比鍵盤吞吐速度成倍的提高大得多。另外,我們將會看到,塊設備的復雜性會為這種優化留下很大的施展空間。

linux驅動程序中字元設備和塊設備的三點區別

1.字元設備只能以位元組為最小單位訪問,而塊設備以塊為單位訪問,例如512位元組,1024位元組等

2.塊設備可以隨機訪問,但是字元設備不可以

3.字元和塊沒有訪問量大小的限制,塊也可以以位元組為單位來訪問

6. 塊設備和字元設備有什麼區別

/dev/dsk對應的為塊設備,文件系統的操作用到它,如mount。/dev/rdsk對應的為字元設備(裸設備,rdsk的r即為 raw),fsck
newfs等會涉及到。一般我們的操作系統和各種軟體都是以塊方式讀寫硬碟,這里的塊是邏輯塊,創建文件系統時可以選擇,windows里叫簇。可看 newfs or
mkfs的manual。oracle是比較常見的字元方式讀寫硬碟。

字元設備還是塊設備的定義屬於操作系統的設備訪問層,與實際物理設備的特性無必然聯系。設備訪問層下面是驅動程序,所以只要驅動程序提供的方式,都可以。也就是說驅動程序支持stream方式,那麼就可以用這種方式訪問,驅動程序如果還支持block方式,那麼你想用哪種方式訪問都可以,典型的比如硬碟式的裸設備,兩種都支持塊設備(block
device):是一種具有一定結構的隨機存取設備,對這種設備的讀寫是按塊進行的,他使用緩沖區來存放暫時的數據,待條件成熟後,從緩存一次性寫入設備或從設備中一次性讀出放入到緩沖區,如磁碟和文件系統等字元設備(Character
device):這是一個順序的數據流設備,對這種設備的讀寫是按字元進行的,而且這些字元是連續地形成一個數據流。他不具備緩沖區,所以對這種設備的讀寫是實時的,如終端、磁帶機等。

7. LINUX,下面設備文件中那些是字元設備文件

/dev/audio是字元設備來文件,源其他的是塊設備文件
補充:對audio的存取是以位元組流方式來進行的。其它的設備/dev/cdrom, /dev/fd0, /dev/had都是磁碟(光碟機,軟碟機,主硬碟),它們的存取是通過數據塊來進行的

8. 字元驅動和字元設備驅動有什麼區別

可以講字元設備和抄字元設備驅動歸襲為一類,它們都是可以順序/隨機地進行讀取和存儲的單元,二者驅動主要在於塊設備需要具體的burst實現,對訪問也有一定的邊界要求。其他的沒有什麼不同。
網路設備是特殊設備的驅動,它負責接收和發送幀數據,可能是物理幀,也可能是ip數據包,這些特性都有網路驅動決定。它並不存在於/dev下面,所以與一般的設備不同。網路設備是一個net_device結構,並通過register_netdev注冊到系統里,最後通過ifconfig -a的命令就能看到。
不論是什麼設備,設備級的數據傳輸都是基本類似的,內核里的數據表示只是一部分,更重要的是匯流排的訪問,例如串列spi,i2c,並行dma等。

9. 字元設備驅動程序由哪幾部分組成

字元設備驅動程序框架

1、寫出open、write函數
2、告訴內核
1)、定義一個struct file_operations結構並填充好

static struct file_operations first_drv_fops = {
.owner = THIS_MODULE, /* 這是一個宏,推向編譯模塊時自動創建的__this_mole變數 */
.open = first_drv_open,
.write = first_drv_write,
};
2)、把struct file_operations結構體告訴內核
major = register_chrdev(0, "first_drv", &first_drv_fops); // 注冊, 告訴內核
相關參數:第一個,設備號,0自動分配主設備號,否則為主設備號0-255
第二個:設備名
第二個:struct file_operations結構體

4)、register_chrdev由誰調用(入口函數調用)
static int first_drv_init(void)

5)、入口函數須使用內核宏來修飾
mole_init(first_drv_init);
mole_init會定義一個結構體,這個結構體裡面有一個函數指針指向first_drv_init這個函數,當我們載入或安裝一個驅動時,內核會自動找到這個結構體,然後調用裡面的函數指針,這個函數指針指向first_drv_init這個函數,first_drv_init這個函數就是把struct file_operations結構體告訴內核

6)、有入口函數就有出口函數

mole_exit(first_drv_exit);
最後加上協議
MODULE_LICENSE("GPL");

3、mdev根據系統信息自動創建設備節點:

每次寫驅動都要手動創建設備文件過於麻煩,使用設備管理文件系統則方便很多。在2.6的內核以前一直使用的是devfs,但是它存在許多缺陷。它創建了大量的設備文件,其實這些設備更本不存在。而且設備與設備文件的映射具有不確定性,比如U盤即可能對應sda,又可能對應sdb。沒有足夠的主/輔設備號。2.6之後的內核引入了sysfs文件系統,它掛載在/sys上,配合udev使用,可以很好的完成devfs的功能,並彌補了那些缺點。(這里說一下,當今內核已經使用netlink了)。
udev是用戶空間的一個應用程序,在嵌入式中用的是mdev,mdev在busybox中。mdev是udev的精簡版。
首先在busybox中添加支持mdev的選項:
Linux System Utilities --->
[*] mdev
[*] Support /etc/mdev.conf
[*] Support subdirs/symlinks
[*] Support regular expressions substitutions when renaming device
[*] Support command execution at device addition/removal
然後修改/etc/init.d/rcS:
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
執行mdev -s :以『-s』為參數調用位於 /sbin目錄寫的mdev(其實是個鏈接,作用是傳遞參數給/bin目錄下的busybox程序並調用它),mdev掃描 /sys/class 和 /sys/block 中所有的類設備目錄,如果在目錄中含有名為「dev」的文件,且文件中包含的是設備號,則mdev就利用這些信息為這個設備在/dev 下創建設備節點文件。一般只在啟動時才執行一次 「mdev -s」。
熱插拔事件:由於啟動時運行了命 令:echo /sbin/mdev > /proc/sys/kernel/hotplug ,那麼當有熱插拔事件產生時,內核就會調用位於 /sbin目錄的mdev。這時mdev通過環境變數中的 ACTION 和 DEVPATH,來確定此次熱插拔事件的動作以及影響了/sys中的那個目錄。接著會看看這個目錄中是否「dev」的屬性文件,如果有就利用這些信息為 這個設備在/dev 下創建設備節點文件
重新打包文件系統,這樣/sys目錄,/dev目錄就有東西了
下面是create_class的原型:

#define class_create(owner, name) /
({ /
static struct lock_class_key __key; /
__class_create(owner, name, &__key); /
})
extern struct class * __must_check __class_create(struct mole *owner,
const char *name,
struct lock_class_key *key);

class_destroy的原型如下:
extern void class_destroy(struct class *cls);
device_create的原型如下:

extern struct device *device_create(struct class *cls, struct device *parent,
dev_t devt, void *drvdata,
const char *fmt, ...)
__attribute__((format(printf, 5, 6)));
device_destroy的原型如下:
extern void device_destroy(struct class *cls, dev_t devt);
具體使用如下,可參考後面的實例:
static struct class *firstdrv_class;
static struct class_device *firstdrv_class_dev;

firstdrv_class = class_create(THIS_MODULE, "firstdrv");
firstdrv_class_dev = class_device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xyz"); /* /dev/xyz */

class_device_unregister(firstdrv_class_dev);
class_destroy(firstdrv_class);

下面再來看一下應用程序如何找到這個結構體的
在應用程序中我們使用open打開一個設備:如:open(/dev/xxx, O_RDWR);
xxx有一個屬性,如字元設備為c,後面為讀寫許可權,還有主設備名、次設備名,我們注冊時 通過register_chrdev(0, "first_drv", &first_drv_fops)(有主設備號,設備名,struct file_operations結構體)將first_drv_fops結構體注冊到內核數組chrdev中去的,結構體中有open,write函數,那麼應用程序如何找到它的,事實上是根據打開的這個文件的屬性中的設備類型及主設備號在內核數組chrdev裡面找到我們注冊的first_drv_fops,
實例代碼:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static struct class *firstdrv_class;
static struct class_device *firstdrv_class_dev;
volatile unsigned long *gpfcon = NULL;
volatile unsigned long *gpfdat = NULL;
static int first_drv_open(struct inode *inode, struct file *file)
{
//printk("first_drv_open\n");
/* 配置GPF4,5,6為輸出 */
*gpfcon &= ~((0x3<<(4*2)) | (0x3<<(5*2)) | (0x3<<(6*2)));
*gpfcon |= ((0x1<<(4*2)) | (0x1<<(5*2)) | (0x1<<(6*2)));
return 0;
}
static ssize_t first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
{
int val;
//printk("first_drv_write\n");
_from_user(&val, buf, count); // _to_user();
if (val == 1)
{
// 點燈
*gpfdat &= ~((1<<4) | (1<<5) | (1<<6));
}
else
{
// 滅燈
*gpfdat |= (1<<4) | (1<<5) | (1<<6);
}

return 0;
}
static struct file_operations first_drv_fops = {
.owner = THIS_MODULE, /* 這是一個宏,推向編譯模塊時自動創建的__this_mole變數 */
.open = first_drv_open,
.write = first_drv_write,
};
int major;
static int first_drv_init(void)
{
major = register_chrdev(0, "first_drv", &first_drv_fops); // 注冊, 告訴內核
firstdrv_class = class_create(THIS_MODULE, "firstdrv");
firstdrv_class_dev = class_device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xyz"); /* /dev/xyz */
gpfcon = (volatile unsigned long *)ioremap(0x56000050, 16);
gpfdat = gpfcon + 1;
return 0;
}
static void first_drv_exit(void)
{
unregister_chrdev(major, "first_drv"); // 卸載
class_device_unregister(firstdrv_class_dev);
class_destroy(firstdrv_class);
iounmap(gpfcon);
}
mole_init(first_drv_init);
mole_exit(first_drv_exit);
MODULE_LICENSE("GPL");

編譯用Makefile文件

KERN_DIR = /work/system/linux-2.6.22.6
all:
make -C $(KERN_DIR) M=`pwd` moles
clean:
make -C $(KERN_DIR) M=`pwd` moles clean
rm -rf moles.order
obj-m += first_drv.o

測試程序:

#include
#include
#include
#include
/* firstdrvtest on
* firstdrvtest off
*/
int main(int argc, char **argv)
{
int fd;
int val = 1;
fd = open("/dev/xyz", O_RDWR);
if (fd < 0)
{
printf("can't open!\n");
}
if (argc != 2)
{
printf("Usage :\n");
printf("%s \n", argv[0]);
return 0;
}
if (strcmp(argv[1], "on") == 0)
{
val = 1;
}
else
{
val = 0;
}

write(fd, &val, 4);
return 0;
}

熱點內容
線切割怎麼導圖 發布:2021-03-15 14:26:06 瀏覽:709
1台皮秒機器多少錢 發布:2021-03-15 14:25:49 瀏覽:623
焊接法蘭如何根據口徑配螺栓 發布:2021-03-15 14:24:39 瀏覽:883
印章雕刻機小型多少錢 發布:2021-03-15 14:22:33 瀏覽:395
切割機三五零木工貝片多少錢 發布:2021-03-15 14:22:30 瀏覽:432
加工盜磚片什麼櫸好 發布:2021-03-15 14:16:57 瀏覽:320
北洋機器局製造的銀元什麼樣 發布:2021-03-15 14:16:52 瀏覽:662
未來小七機器人怎麼更新 發布:2021-03-15 14:16:33 瀏覽:622
rexroth加工中心亂刀怎麼自動調整 發布:2021-03-15 14:15:05 瀏覽:450
機械鍵盤的鍵帽怎麼選 發布:2021-03-15 14:15:02 瀏覽:506