主裝置號和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
這就是所謂的一類裝置都應一種驅動。
可以認為大多數簡單的裝置,僅僅需要實現到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函數了。
當在核心使用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結構關係; ioctl和unlocked_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)
Redis和nosql簡介,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_operations中 ioctl 和 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); 運算符: 賦值運算符:= 。其作用是做賦值運算,將等號後邊的值賦值給等號前邊的。 復合賦值運算符: +=