訊號量,虛擬檔案系統,

2021-06-27 10:10:27 字數 2663 閱讀 7043

驅動函式 :多個套介面

#include

#include

#include

#include

#include

//#include

#include

#include

module_license("gpl"); 

#define major_num    255 

static ssize_t globalvar_read(struct file *, char *, size_t, loff_t*); 

static ssize_t globalvar_write(struct file *, const char *, size_t, loff_t*); 

static unsigned int globalvar_poll(struct file *filp, poll_table *wait) ;

struct file_operations globalvar_fops = 

; static int global_var = 0; 

static struct semaphore sem; 

static wait_queue_head_t outq; //定義等待佇列outq

static int flag = 0; 

static int __init globalvar_init(void) 

else 

return ret; 

} static void __exit globalvar_exit(void) 

else  */

} static ssize_t globalvar_read(struct file *filp, char *buf, size_t len, loff_t 

*off) 

//用來獲取訊號量,如果訊號量大於或等於0獲取訊號量,否則進入睡眠狀態,等待訊號量被釋放後,啟用該程序

//down_interruptible()是處理訊號量的函式,返回值分為'0','-etime','-eintr'

//運作方式:如果sem->count >0 則訊號量允許訪問;

//正常返回:返回0

//有中斷訊號時,返回-eintr

//當等待超時時:返回-etime

if (down_interruptible(&sem)) 

flag = 0; 

//核心區讀資料到使用者區

if (copy_to_user(buf, &global_var, sizeof(int))) 

up(&sem); //釋放訊號量,並喚醒等待該資源程序佇列的第乙個程序

return sizeof(int); 

} static ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, 

loff_t *off)

if (copy_from_user(&global_var, buf, sizeof(int))) 

up(&sem); 

flag = 1; 

//通知資料可獲得 

wake_up_interruptible(&outq); 

return sizeof(int); 

} static unsigned int globalvar_poll(struct file *filp, poll_table *wait) 

return mask; 

}module_init(globalvar_init); 

module_exit(globalvar_exit); 

makefile:

ifeq ($(kernelrelease),)

#kerneldir ?= /lib/modules/$(shell uname -r)/build

kerneldir ?= /usr/src/linux-headers-$(shell uname -r)/

pwd := $(shell pwd)

modules:

$(make) -c $(kerneldir) m=$(pwd) modules

modules_install:

$(make) -c $(kerneldir) m=$(pwd) modules_install

clean:

rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

.phony: modules modules_install clean

else

obj-m := globalvar.o

endif

globalvarwrite.c

#include

#include

#include

#include

main()  } 

} else  } 

globalvarread.c

#include

#include

#include

#include

main()  }

else

printf("no data within 5 seconds,\n");

} } 

else  } 

虛擬檔案系統

虛擬檔案系統 virtual file system,簡稱 vfs 是 linux 核心中的乙個軟體層,用於給使用者空間的程式提供檔案系統介面 同時,它也提供了核心中的乙個 抽象功能,允許不同的檔案系統共存。系統中所有的檔案系統不但依賴 vfs 共存,而且也依靠 vfs 協同工作。為了能夠支援各種實...

檔案系統 虛擬檔案系統(二)

二 虛擬檔案系統 6 與程序相關的檔案結構 檔案最終要被程序訪問,乙個程序可以開啟多個檔案,而乙個檔案可以被多個程序同時訪問。這裡程序是通過檔案描述符來抽象所開啟的檔案的,用使用者開啟檔案表來描述和記錄程序開啟檔案描述符的使用情況。1 檔案物件 每個開啟的檔案都用乙個32位的數字來表示下乙個讀寫的位...

Linux虛擬檔案系統

這一周主要學了檔案系統的相關知識,通過學習基本上掌握了 linux 檔案系統的結構,檔案型別,以及讀取模式等等,也學會怎麼用命令簡單的建立乙個檔案系統。linux 的檔案系統主要有 ext2 ext3 ext4 在windows 下乙個分割槽會採用的一棵目錄樹來管理,而 linux 則只有一棵目錄樹...