1. 程式人生 > >主裝置號和file_operations結構關係; ioctl和unlocked_ioctl, ioctl簡單測試例子

主裝置號和file_operations結構關係; ioctl和unlocked_ioctl, ioctl簡單測試例子

open一個字元裝置的過程是從
VFS層open系統呼叫 ===> def_chr_fops-->open ===> cdev->fops->open ===> device specific operation

如果是同一類裝置,比如系統中有多個framebuffer,那麼就把共有的操作放在cdev->fops->open ,這時向系統註冊的僅僅是這一個驅動程式;
將這類主裝置號相同的一類裝置(如/dev/fb0 /dev/fb1等)放在一個數組中,然後在cdev->fops->open 根據次裝置號作為Index來呼叫體現不同裝置差異的那些操作,即 device specific operation

, 這就是為什麼framebuffer/block 等硬體驅動中實現的都不是file_operations這種操作,而是跟具體裝置相關的那些操作。
這就是所謂的一類裝置都應一種驅動。


可以認為大多數簡單的裝置,僅僅需要實現到cdev->fops->open 這個位置,等他們變得複雜,能夠提煉出共性的時候就 需要實現到[紅色device specific operation 這個位置。

對於ioctl操作,優先執行f_op->unlocked_ioctl,如果沒有unlocked_ioctl,那麼執行f_op->ioctl

在學習ARM開發中.ioctl在內2.6.32中。file_operatioins中還有ioctl.自己升級到2.6.36時,使用vim 查錯原始碼時,發現沒有ioctl只有unlocked_ioctl與compat_ioctl函數了。

自己改寫這個unlocked_ioctl函式,但是,不知如何用應用程式測試,
當在核心使用ioctl函式時,我在應用程式中使用ioctl(fd,"on"來測試是否呼叫了ioctl函式。
可是改成unlocked_ioctl函式時,使用unlocked_ioctl()函式時,提示沒有這個函式,請問怎麼辦?
long  test_ioctl(struct file *filp,unsigned int cmd,unsigned long value){
        struct newdev *p = filp->private_data;
        printk("ioctl %X \n",p);
        switch(cmd){
                case 0:
                        p->on();break;
                case 1:
                        p->off();break;
                default:
                        printk("Unknow cmd\n"
;
                        return -EINVAL;
        }
        return 0;
}

struct file_operations fops = {
        .open = test_open,
        .unlocked_ioctl = test_ioctl,
};

void test_on(void){
        printk("test_on test\n";
}

void test_off(void){
        printk("test_off test \n";
}

void initial_device(struct newdev *d){
        d->on = test_on;
        d->off = test_off;
}


應用程式如下:

int main(int argc,char *argv[]){

        int fd;
        char buf[10];
        printf("1\n";
        printf("argc[%d]\n",argc);
        if (argc != 2){
                printf("Usage %s string \n",argv[0]);
                return -1;
        }
        printf("2\n";

        fd = open("/dev/test",O_RDWR);
        printf("3\n";

        if (fd < 0 ){
                printf("fd open errror\n";
                return -1;

        }
        printf("4\n";
        if (!strncasecmp(argv[1],"on",2))
                unlocked_ioctl(fd,0);
        if (!strncasecmp(argv[1],"off",3))
                unlocked_ioctl(fd,1);

        return 0;
}

[email protected]:/usr/src/linux-2.6.36/drivers/new/10th# gcc -o app app.c
/tmp/cc4PWyCc.o: In function `main':
app.c.text+0xf1): undefined reference to `unlocked_ioctl'
app.c.text+0x12a): undefined reference to `unlocked_ioctl'
collect2: ld returned 1 exit status

[email protected]:/usr/src/linux-2.6.36/drivers/new/10th# 為了把BKL從核心中慢慢去掉,加入了unlocked_ioctl,但是有很多地方都用到ioctl,所以一直保留著,直到b19dd42f的時候,最後移除了所有對ioctl的使用,才把ioctl從file_operations裡面去掉。

所以你在核心裡用unlocked_ioctl是沒有問題的。

但是你應用程式裡面不能用unlocked_ioctl,因為系統呼叫ioctl是沒有改變的,還是原來的系統呼叫介面,只是系統呼叫的實現中,vfs_ioctl()變成了unlocked_ioctl,在應用層你根本不用關注核心中的這些實現上的改變,你只需要按照系統呼叫的用法用就可以了。

所以,在核心module裡,你應該用.unlocked_ioctl = test_ioctl;

而在應用層測試的時候,應用的系統呼叫仍然是ioctl()。

也就時VFS層這個中間虛擬檔案層呼叫我寫的unlocked_ioctl,而應用層還是通過ioctl呼叫VFS裡面的函式,我要做的工作由VFS完成了。


相關推薦

主裝置file_operations結構關係 ioctlunlocked_ioctl ioctl簡單測試例子

open一個字元裝置的過程是從 VFS層open系統呼叫 ===> def_chr_fops-->open ===> cdev->fops->open ===> device specific operation 如果是同一類裝置,比

定義一個類:實現功能可以返回隨機的10個數字隨機的10個字母 隨機的10個字母數字的組合字母數字的範圍可以指定類似(1~100)(A~z)

#習題2:定義一個類:實現功能可以返回隨機的10個數字,隨機的10個字母, #隨機的10個字母和數字的組合;字母和數字的範圍可以指定 class RandomString(): #隨機數選擇的範圍作為引數,如(1~100)字母 ('A'~'z'),大寫字母在前 按ascii值

關於C#的裝箱拆箱的簡單測試例子

 int i = 0;         //裝箱         object obj = i;         Debug.Log(i);         Debug.Log(obj);         i = 10;         Debug.Log(i);    

簡單3步成功給Mac安裝指定Python版本指定庫版本並且隨意切換版本非常簡單不行拿磚砸我

Mac安裝Python真的頭疼,我前後鬥了一年。 Mac預設安裝2.7,我們平時2018年都用Python3了。 我按照網友的方法brew install python3,導致Python2和Python3一直攪在一起。 ST還是Python2,後來搞了幾周,才搞定Py

Android中Recyclerview使用6----新增條目得到點選事件長按事件(另一種寫法簡單)

效果圖 activity中: MainActivity <span style="font-size:18px;">public class MainActivity extends Activity { // private Recycler

自然語言處理NLP技術里程碑、知識結構、研究方向機構導師(公回覆“NLP總結”下載彩標PDF典藏版資料)

自然語言處理NLP技術里程碑、知識結構、研究方向和機構導師(公號回覆“NLP總結”下載彩標PDF典藏版資料) 原創: 秦隴紀 資料簡化DataSimp 今天 資料簡化DataSimp導讀:自然語言處理髮展史上的十大里程碑、NLP知識結構,以及NLP國內研究方向、機構、導師。祝大家學習

資料結構演算法的關係區別

由於大量資料結構教程中都將資料結構的知識和演算法摻雜起來講,使很多初學者認為資料結構就是在講演算法,這樣理解是不準確的。 資料結構和演算法之間完全是兩個相互獨立的學科,如果非說它們有關係,那也只是互利共贏、“1+1>2”的關係。 最明顯的例子,如果你認為資料結構是在講演算法,那麼大學我們還學《演算法

Android版本API對應關係

相信很多開發者對Android平臺和API對應關係不是很清楚,我們不去死記硬背所有的對應關係,筆者截取了Google親兒子Android Studio裡面的模擬器常用的版本號給大家做一個展示: Marshmallow (Android 6.0)

Redisnosql簡介,api呼叫Redis資料功能(String型別的資料處理)List資料結構(及Java呼叫處理)Hash資料結構Set資料結構功能sortedSet(有序集合)數

1、Redis和nosql簡介,api呼叫14.1/ nosql介紹NoSQL:一類新出現的資料庫(not only sql),它的特點:1、  不支援SQL語法2、  儲存結構跟傳統關係型資料庫中的那種關係表完全不同,nosql中儲存的資料都是KV形式3、  NoSQL的世界中沒有一種通用的語言,每種no

介紹Collection框架的結構Collection Collections的區別

Collection 是單列集合 List元素是有序的、可重複 有序的 collection,可以對列表中每個元素的插入位置進行精確地控制。 可以根據元素的整數索引(在列表中的位置)訪問元素,並搜尋列表中的元素。  可存放重複元素,元素存取是有序的。 List介

linux主裝置從裝置

    Linux的裝置管理是和檔案系統緊密結合的,把裝置和檔案關聯起來,這樣系統呼叫可以直接用操作檔案一樣的方法來操作裝置。各種裝置都以檔案的形式存放在/dev目錄下,稱為裝置檔案。應用程式可以開啟、關閉和讀寫這些裝置檔案,完成對裝置的操作,就像操作普通的資料檔案一樣。為了管理這些裝置,系統為裝置編了號,每

struct file_operationsioctl unlocked_ioctl

轉載自 "http://blog.chinaunix.net/uid-20543672-id-3015637.html" 很久都沒有寫驅動程式碼了,對於一些驅動相關的核心變化也沒有怎麼關心。這次重遊《LDD3》獲益良多,其值對於struct file_operations中

簡析檔案描述符(fd)FILE結構體的關係

檔案描述符(fd) 檔案描述符(file descriptor)用來訪問檔案。檔案描述符是非負整數。開啟現存檔案或新建檔案時,核心會返回一個檔案描述符。讀寫檔案也需要使用檔案描述符來指定待讀寫的檔案。 通常情況下,將一個程式從硬碟載入到記憶體後,這個程式就化

前端、伺服器端資料庫端結構關係?HTTP請求中如何判斷瀏覽器型別?HTTP響應的狀態碼資訊

一、前端、伺服器端和資料庫端結構關係?二、向伺服器傳送一個請求,通過HTTP請求來判斷瀏覽器型別:        (這裡需要安裝一個外掛httpwatch,這個外掛的主要作用是觀察客戶端向伺服器傳送的Http請求,    而伺服器返回給客戶端的資訊。)  具體是通過響應的Us

C語言中結構體以及在結構體中呼叫方法聯合體聯合體的使用

#include <stdio.h>  #include<stdlib.h>void study(){}; struct student{ int age; int number; void(*study1)(); } main(){//使用,在結構

今天被人問到了資料庫索引資料結構關係

今天智源面試,遇到了這個問題!不知道!!上網搜下! 摘要 本文以MySQL資料庫為研究物件,討論與資料庫索引相關的一些話題。特別需要說明的是,MySQL支援諸多儲存引擎,而各種儲存引擎對索引的支援也各不相同,因此MySQL資料庫支援多種索引型別,如BTree索引,

利用python+graphviz繪製資料結構關係指定目錄下標頭檔案包含關係

  作為一名linux系統下的C語言開發,日常工作中經常遇到兩個問題:   一是分析程式碼過程中,各種資料結構互相關聯,只通過程式碼很難理清系統中所有結構體的整體架構,影響程式碼消化的效率;   二是多層標頭檔案巢狀包含,在新增需要被多處引用的結構體或者函式介面時,難以找到合適的地方放置結構體和函式介面的定義

數據結構--Avl樹的創建插入的遞歸版本非遞歸版本刪除等操作

pop end eem static cout 遞歸 sta div else AVL樹本質上還是一棵二叉搜索樹,它的特點是: 1.本身首先是一棵二叉搜索樹。 2.帶有平衡條件:每個結點的左右子樹的高度之差的絕對值最多為1(空樹的高度為-1)。 也就是說,AV

運算符條件結構

比較運算符 結果 switch blog ++ long else if 不能 一個 表達式:是有操作數和運算符組成的。 操作數:常量、變量、子表達式 X=(x+2)*(y-2); 運算符: 賦值運算符:= 。其作用是做賦值運算,將等號後邊的值賦值給等號前邊的。 復合賦值運

C語言之運算符條件結構

比較運算 第三名 user 石頭 年齡 pan 註意 break -1 表達式:是有操作數和運算符組成的。 操作數:常量、變量、子表達式 X=(x+2)*(y-2); 運算符: 賦值運算符:= 。其作用是做賦值運算,將等號後邊的值賦值給等號前邊的。 復合賦值運算符: +=