ioctl初步理解

2021-05-28 08:23:22 字數 1427 閱讀 4702

ioctl系統呼叫是為使用者空間建立的一種控制硬體裝置的通道。比如控制串列埠的波特率,馬達的轉速等等。

是使用者空間和核心空間進行通訊的方式之一。要實現乙個ioctl,需要使用者空間和核心空間兩方面的配合。

如果想要乙個硬體支援ioctl,則要在其驅動函式中加入ioctl的實現,應用程式想要通過ioctl控制乙個裝置,

則要在使用者空間發起乙個iotcl系統呼叫。

它在使用者空間的系統呼叫函式原型為:

int ioctl ( int fd, unsigned long cmd, ...);

對應到核心空間的驅動函式為:

int (*ioctl) ( stuct inode *inode, struct file *filep,

unsigned int cmd, unsigned long arg);

兩個函式是通過驅動程式中的:

struct file_operations

結構體聯絡起來的,如:

struct file_operations fops = ;

由此可以看出ioctl是通過檔案來聯絡起來的,這樣就要求我們的裝置要有檔案的表示形式,也就是要在/dev

下生成裝置節點。驅動程式需要用以下函式實現這一要求:

int    alloc_chrdev_region(dev_t *dev,unsigned int firstminor,unsigned int count,char *name);

void cdev_init (struct cdev      *cdev, const struct file_operations *fops);

int    cdev_add (struct cdev    * p,   dev_t   dev,   unsigned      count);

struct class    *class_create(struct module *owner, const char *name);

struct device *device_create(struct class *class, struct device *parent,

dev_t devt, void *drvdata, const char *fmt, ...);

這樣就可以在自己的驅動程式中定義自己的ioctl函式了。

在這個例子中,此函式的實現就是  device_ioctl ,這個函式就要符合

int (*ioctl) ( stuct inode *inode, struct file *filep,

unsigned int cmd, unsigned long arg);

的形式了。

系統是怎麼知道核心空間的ioctl就是要操作這個驅動而不是那個驅動呢,這就是靠其引數fd來實現了。

應用程式首先通過open函式開啟裝置獲得fd,核心再通過fd確定裝置的檔案描述符,進而通過裝置檔名來找到具體裝置。

Linux下ioctl函式理解

一 什麼是ioctl ioctl是裝置驅動程式中對裝置的i o通道進行管理的函式。所謂對i o通道進行管理,就是對裝置的一些特性進行控制,例如串列埠的傳輸波特率 馬達的轉速等等。它的呼叫個數如下 int ioctl int fd,ind cmd,其中fd就是使用者程式開啟裝置時使用open函式返回的...

初步理解socket

在學習socket之前,先回顧下tcp ip協議。tcp ip transmission control protocol internet protocol 即傳輸控制協議 網間協議,定義了主機如何連入網際網路及資料如何再它們之間傳輸的標準,從字面意思來看tcp ip是tcp和ip協議的合稱,但實...

SVN初步理解

問題二 衝突 問題描述 為了解決超時問題,只能更新.而在更新過程中,如果幾個人修改了同一檔案的同一行 此時就會產生衝突。產生原因 版本控制器不會那麼智慧型,去決定應該使用誰的 作為最終 只能將選擇權拋給使用者,讓使用者解決。系統提供三種解決方案 p postpone,延遲處理 待會我自己處理 如果選...