當前位置:首頁 » 生產設備 » 如何製作一個字元設備

如何製作一個字元設備

發布時間: 2021-02-21 00:19:05

『壹』 linux用mknod怎麼創建設備怎麼用

首先要明白什麼是設備文件,簡單的我們說,操作系統與外部設備(入磁碟驅動器,列印機,modern,終端 等等)都是通過設備文件來進行通信的,在Unix/Linux系統與外部設備通訊之前,這個設備必須首先要有一個設備文件,設備文件均放在/dev目錄下。

一般情況下在安裝系統的時候系統自動創建了很多已檢測到的設備的設備文件,但有時候我們也需要自己手動創建,命令行生成設備文件的方式有 insf,mksf,mknod等等

根據mknod命令的使用參數來看【mknod Name { b | c } Major Minor 】,使用mknod之前,至少要明白以下幾點:

  1. 設備文件類型:分為塊設備和字元設備。ls -l /dev 結果顯示第一個欄位有b*** 和 c****,這里即標識了塊設備和字元設備。

  2. 字元設備文件----字元設備文件傳送數據給設備的時候,一次傳送一個字元,終端,列印機,繪圖儀,modern等設備都經過字元設備文件傳送數據

  3. 塊設備---系統通過塊設備文件存取一個設備的時候,先從內存中的buffer中讀或寫數據,而不是直接傳送數據到物理磁碟,這種方式能有效的提高磁碟和CD-ROMS的I/O性能。磁碟和CD-ROMS即可以使用字元設備文件也可使用塊設備文件。

  4. 主號和次號

    主號:當在任意目錄使用ls -l 時,結果的第5個欄位就是主號,設備主號代表了這個設備使用的是哪個設備驅動程序

    次號:次號是一個24位的十六進制數字,定義了設個設備在系統中的物理的位置

就拿我們常用的創建卷組來看:

先來看看mknod 命令,如果該設備文件你想放在一個特定的文件夾下當然就先創建文件夾

mknod 設備文件名[/dev/xyz] b/c 主號 次號

{ mkdir /dev/vg01

mknod /dev/vg01/group c 64 0X010000}

創建之後,就可以使用你想要創建的設備對於德創建命令了,如我現在的卷組的創建命令:

vgcreate /dev/vg01 /dev/dsk/c*t*d*

一直進行下去,之後的步驟根據不同的設備而不盡相同。

『貳』 linux用mknod怎麼創建設備,創建了設備怎麼用

mknod命令用於創建一個設備文件,即特殊文件
首先要明白什麼是設備文件,簡單的我們說 操作系統與外部設備(入磁碟驅動器,列印機,modern,終端 等等)都是通過設備文件來進行通信的,在Unix/Linux系統與外部設備通訊之前,這個設備必須首先要有一個設備文件,設備文件均放在/dev目錄下
一般情況下在安裝系統的時候系統自動創建了很多已檢測到的設備的設備文件,但有時候我們也需要自己手動創建,命令行生成設備文件的方式有 insf,mksf,mknod等等
根據mknod命令的使用參數來看【mknod Name { b | c } Major Minor 】,使用mknod之前,至少要明白以下幾點:
設備文件類型:分為塊設備和字元設備。ls -l /dev 結果顯示第一個欄位有b*** 和 c****,這里即標識了塊設備和字元設備。
字元設備文件----字元設備文件傳送數據給設備的時候,一次傳送一個字元,終端,列印機,繪圖儀,modern等設備都經過字元設備文件傳送數據
塊設備---系統通過塊設備文件存取一個設備的時候,先從內存中的buffer中讀或寫數據,而不是直接傳送數據到物理磁碟,這種方式能有效的提高磁碟和CD-ROMS的I/O性能。磁碟和CD-ROMS即可以使用字元設備文件也可使用塊設備文件。
主號和次號:
主號:當在任意目錄使用ls -l 時,結果的第5個欄位就是主號,設備主號代表了這個設備使用的是哪個設備驅動程序
次號:次號是一個24位的十六進制數字,定義了設個設備在系統中的物理的位置

就拿我們常用的創建卷組來看;
先來看看mknod 命令,如果該設備文件你想放在一個特定的文件夾下當然就先創建文件夾
mknod 設備文件名[/dev/xyz] b/c 主號 次號
{ mkdir /dev/vg01
mknod /dev/vg01/group c 64 0X010000
}
創建之後,就可以使用你想要創建的設備對於德創建命令了,如我現在的卷組的創建命令:
vgcreate /dev/vg01 /dev/dsk/c*t*d*
一直進行下去
之後的步驟根據不同的設備而不盡相同

『叄』 linux中什麼是塊設備和字元設備

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

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

(3)如何製作一個字元設備擴展閱讀:

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

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

參考資料來源:

網路——塊設備

網路——字元設備

『肆』 字元型設備驅動如何編譯

字元設備驅動程序框架

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;
}

『伍』 在虛擬機linux操作系統上怎麼編寫一個簡單的字元設備驅動程序

下載 virtualbox 下載一個 linux iso
用virtualbox 建立虛擬系統 配置好 載入iso 啟動安裝
VMware安裝完畢後,利用它可以建立多個虛擬機,每新建一個虛擬機,就會要求你建立一個配置文件。這個配置文件實際上相當於新電腦的「硬體配置」,你可以在配置文件中決定虛擬機的硬碟如何配置,內存多大.准備運行哪種操作系統,是否有網路等。配置Linux虛擬機的步驟如下。

(1)選擇File菜單下的「New Virtual Machine」出現新虛擬機向導後單擊「下一步」,選擇「Typical」典型安裝。

(2)再單擊「下一步」,在選擇操作系統界面的「Guest Operation System」中選擇 「Linux」,然後單擊Version對應的下拉菜單選擇具體的Linux版本, 此處我們選擇「Red Hat LinuX」。

(3)單擊「下一步」進入安裝目錄選擇界面。該界面上面的文本框是系統的名字,保持默認值即可,下面的文本框需要選擇虛擬機操作系統的安裝位置。

(4)根據需要選擇好後,單擊「下一步」按鈕,出現設置虛擬機內存大小的界面。Linux9.O對內存的要求是:文本模式至少需要64MB;圖形化模式至少需要128MB,推薦使用192MB。此處我們選擇192MB:

(5)單擊「下一步」按鈕進入網路連接方式選擇界面。VMware有四種網路設置方式,一般來說,Bridged方式使虛擬機就像網路內一台獨立的計算機一樣,最為方便好用(四種連網方式的區別大家可參考VMware的有關資料)。在此、我們選擇Brided方式。

(6)單擊「下一步」按鈕進入虛擬磁碟的設置界面。 這里有三種方式(Create a new virtual disk、Use an existing virtual disk、Use a physical disk)可供選擇、建議初學者選擇「Create a new Virtual disk」,其含義是新建一個虛擬磁碟,該虛擬磁碟只是主機—卜的一個獨立文件。

(7)在「下一步」中設置磁碟大小。在此、我們採用默認的4GB。

(8)單擊「下一步」進入文件存放路徑選擇界面。

在此界面可單擊Browse按鈕進行設置。此處我們使用默認值,單擊「完成」按鈕。

至此,完成一個虛擬機的配置。

『陸』 如何寫一個簡單的字元設備驅動

下載 virtualbox 下載一個 linux iso
用virtualbox 建立虛擬系統 配置好 載入iso 啟動安裝
VMware安裝完畢後,利用它可內以建立多個容虛擬機,每新建一個虛擬機,就會要求你建立一個配置文件。這個配置文件實際上相當於新電腦的「硬體配置」,你可以在配置文件中決定虛擬機的硬碟如何配置,內存多大.准備運行哪種操作系統,是否有網路等。配置Linux虛擬機的步驟如下。

(1)選擇File菜單下的「New Virtual Machine」出現新虛擬機向導後單擊「下一步」,選擇「Typical」典型安裝。

(2)再單擊「下一步」,在選擇操作系統界面的「Guest Operation System」中選擇 「Linux」,然後單擊Version對應的下拉菜單選擇具體的Linux版本, 此處我們選擇「Red Hat LinuX」。

『柒』 字元設備怎麼調用device

C庫中通過open/read/write/seek等來操作抄文襲件,所謂字元設備驅動,簡單來說就是實現這幾個函數的具體內容,linux能把設備抽象為文件,用戶調用open/read/write/seek對抽象的文件進行操作就可以操作實際硬體設備(或抽象的設備)。所以字元設備驅動的重點,在於編寫內核空間的open/read/write/seek等函數。
可見,字元設備並不是一個完整的main函數,其框架更像是一個支持fileOperations的lib。用戶空間通過系統調用(int 80,軟中斷)來使用這個lib,lib之間的調用通過內核符號表來完成解析。

『捌』 編寫一個簡單的字元設備驅動程序。要求該字元設備包括scull_open() scull_write() scull_read() scull_i

|第一部分 字元設備驅動程序

1.1 函數scull_open()

int scull_open(struct inode *inode,struct file *filp) {

MOD_INC_USE_COUNT; // 增加該模塊的用戶數目

printk(「This chrdev is in open\n」);

return 0;

}

1.2 函數scull_write()

int scull_write(struct inode *inode,struct file *filp,const char *buffer,int count) {

if(count < 0)

return –EINVAL;

if(scull.usage || scull.new_msg)

return –EBUSY;

scull.usage = 1;

kfree(scull.data);

data = kmalloc(sizeof(char)*(count+1),GFP_KERNEL);

if(!scull.data) {

return –ENOMEM;

}

_from_user(scull.data,buffer,count + 1);

scull.usage = 0;

scull.new_msg = 1;

return count;

}

1.3 函數scull_read()

int scull_read(struct inode *inode,struct file *filp,char *buffer,int count) {

int length;

if(count < 0)

return –EINVAL;

if(scull.usage)

return –EBUSY;

scull.usage = 1;

if(scull.data == 0)

return 0;

length = strlen(scull.data);

if(length < count)

count = length;

_to_user(buf,scull.data,count + 1);

scull.new_msg = 0;

scull.usage = 0;

return count;

}

1.4 函數scull_ioctl()

#include <linux/ioctl.h>

#define SCULL_MAJOR 0

#define SCULL_MAGIC SCULL_MAJOR

#define SCULL_RESET _IO(SCULL_MAGIC,0) // reset the data

#define SCULL_QUERY_NEW_MSG _IO(SCULL_MAGIC,1) // check for new message

#define SCULL_QUERY_MSG_LENGTH _IO(SCULL_MAGIC,2) //get message length

#define IOC_NEW_MSG 1

static int usage,new_msg; // control flags

static char *data;

int scull_ioctl(struct inode *inode,struct file *filp,unsigned long int cmd,unsigned long arg) {

int ret=0;

switch(cmd) {

case SCULL_RESET:

kfree(data);

data = NULL;

usage = 0;

new_msg = 0;

break;

case SCULL_QUERY_NEW_MSG:

if(new_msg)

return IOC_NEW_MSG;

break;

case SCULL_QUERY_MSG_LENGTH:

if(data == NULL){

return 0;

}

else {

return strlen(data);

}

break;

default:

return –ENOTTY;

}

return ret;

}

1.5 函數scull_release()

void scull_release(struct inode *inode,struct file *filp) {

MOD_DEC_USE_COUNT; // 該模塊的用戶數目減1

printk(「This chrdev is in release\n」);

return 0;

#ifdef DEBUG

printk(「scull_release(%p,%p)\n」,inode,filp);

#endif

}

1.6 測試函數

在該字元設備驅動程序編譯載入後,再在/dev目錄下創建字元設備文件chrdev,使用命令: #mknod /dev/chrdev c major minor ,其中「c」表示chrdev是字元設備,「major」是chrdev的主設備號。(該字元設備驅動程序編譯載入後,可在/proc/devices文件中獲得主設備號,或者使用命令: #cat /proc/devices | awk 」\\$2==」chrdev\」{ print\\$1}」 獲得主設備號)

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/ioctl.h>

#include <stdlib.h>

#include <string.h>

#include <fcntl.h>

#include <unistd.h>

#include <errno.h>

#include 「chardev.h」 // 見後面定義

void write_proc(void);

void read_proc(void);

main(int argc,char **argv) {

if(argc == 1) {

puts(「syntax: testprog[write|read]\n」);

exit(0);

}

if(!strcmp(argv[1],「write」)) {

write_porc();

}

else if(!strcmp(argv[1],「read」)) {

read_proc();

}

else {

puts(「testprog: invalid command!\n」);

}

return 0;

}

void write_proc() {

int fd,len,quit = 0;

char buf[100];

fd = open(「/dev/chrdev」,O_WRONLY);

if(fd <= 0) {

printf(「Error opening device for writing!\n」);

exit(1);

}

while(!quit) {

printf(「\n Please write into:」);

gets(buf);

if(!strcmp(buf,「exit」))

quit = 1;

while(ioctl(fd,DYNCHAR_QUERY_NEW_MSG))

usleep(100);

len = write(fd,buf,strlen(buf));

if(len < 0) {

printf(「Error writing to device!\n」);

close(fd);

exit(1);

}

printf(「\n There are %d bytes written to device!\n」,len);

}

close(fd);

}

void read_proc() {

int fd,len,quit = 0;

char *buf = NULL;

fd=open(「/dev/chrdev」,O_RDONLY);

if(fd < 0) {

printf(「Error opening device for reading!\n」);

exit(1);

}

while(!quit) {

printf(「\n Please read out:」);

while(!ioctl(fd,DYNCHAR_QUERY_NEW_MSG))

usleep(100);

// get the msg length

len = ioctl(fd,DYNCHAR_QUERY_MSG_LENGTH,NULL);

if(len) {

if(buf != NULL)

free(buf);

buf = malloc(sizeof(char)*(len+1));

len = read(fd,buf,len);

if(len < 0) {

printf(「Error reading from device!\n」);

}

else {

if(!strcmp(buf,「exit」) {

ioctl(fd,DYNCHAR_RESET); // reset

quit = 1;

}

else

printf(「%s\n」,buf);

}

}

}

free(buf);

close(fd);

}

// 以下為chrdev.h定義

#ifndef _DYNCHAR_DEVICE_H

#define _DYNCHAR_DEVICE_H

#include <linux/ioctl.h>

#define DYNCHAR_MAJOR 42

#define DYNCHAR_MAGIC DYNCHAR_MAJOR

#define DYNCHAR_RESET _IO(DYNCHAR_MAGIC,0) // reset the data

#define DYNCHAR_QUERY_NEW_MSG _IO(DYNCHAR_MAGIC,1) // check for new message

#define DYNCHAR_QUERY_MSG_LENGTH _IO(DYNCHAR_MAGIC,2) // get message length

#define IOC_NEW_MSG 1

#endif

『玖』 如何寫一個字元驅動

file_operations結構的每一個成員的名字都對應著一個系統調用。用戶進程利用系統調用在對設備文件進行諸如read/write操作時,系統調用通過設備文件的主設備號找到相應的設備驅動程序,然後讀取這個數據結構相應的函數指針,接著把控制權交給該函數。這是linux的設備驅動程序工作的基本原理。編寫設備驅動程序的主要工作就是編寫子函數,並填充file_operations的各個域。
2.簡單驅動程序的編寫:
(1)包含一些基本的頭文件。
(2)編寫一些功能函數,比如read(),write()等。這些函數被調用時系統進入核心態。
(3)定義struct file_operations結構的對象,填充結構體。結構體中功能的順序不能改變,若一些功能沒有實現就用NULL填充,已經實現的功能如read()、write()分別添加到對應的位置。這步實現的是函數的注冊。到這里驅動程序的主體可以說是寫好了。現在需要把驅動程序嵌入內核。
(4)注冊設備驅動程序,使用register_chrdev注冊字元型設備。函數原型為:int register_chrdev(0, "test_name", &test_file_operations)函數返回主設備號,若注冊成功返回值大於0。第一個參數:主設備號。第二個參數:注冊的設備名。第三個參數:結構體名(設備相關操作方式,驅動程序實際執行操作的函數的指針)。這個函數由int init_mole(void)函數調用,這個函數在系統啟動時注冊到內核時調用。
(5)在用rmmod卸載模塊時,cleanup_mole函數被調用,執行unregister_chrdev()釋放字元設備在系統字元設備表中佔有的表項,到這里基本就編寫完成了。一個簡單的字元設備可以說寫好了。
3.編譯$ gcc -O2 -DMODULE -D__KERNEL__ -c test.o test.c
得到文件test.o就是一個設備驅動程序。
如果設備驅動程序有多個文件,把每個文件按上面的命令行編譯,然後
ld -r file1.o file2.o -o molename
驅動程序已經編譯好了,現在把它安裝到系統中去。
$ insmod -f test.o
安裝成功在/proc/devices文件中就可以看到設備test,並可以看到主設備號。要卸載運行:
$ rmmod test
4.創建設備節點

熱點內容
線切割怎麼導圖 發布: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