驅動函式 :多個套介面
#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 則只有一棵目錄樹...