globalmem意味著「全域性記憶體」,在globalmem字元驅動中會分配乙個大小為globalmem_size(4kb)的記憶體空間,並在驅動中提供對該片記憶體的讀寫、控制、和定位函式,以供使用者空間的程序通過呼叫linux系統函式訪問這片記憶體。
本驅動程式使用檔案私有資料,filp->private_data指向裝置結構體,在檔案操作函式中使用 struct globalmem_dev *dev = filp->private_data; 獲得裝置結構體指標
#include #include #include #include #include #include #include #include #include #include #include #define globalmem_size 0x1000 /*全域性記憶體最大4k位元組*/
#define mem_clear 0x1 /*清0全域性記憶體*/
#define globalmem_major 254 /*預設的globalmem的主裝置號*/
static globalmem_major = globalmem_major;
/*globalmem裝置結構體*/
struct globalmem_dev
;struct globalmem_dev *globalmem_devp; /*裝置結構體指標*/
/*檔案開啟函式*/
int globalmem_open(struct inode *inode, struct file *filp)
/*檔案釋放函式*/
int globalmem_release(struct inode *inode, struct file *filp)
/* ioctl裝置控制函式 */
static int globalmem_ioctl(struct inode *inodep, struct file *filp, unsigned
int cmd, unsigned long arg)
return 0;
}/*讀函式*/
static ssize_t globalmem_read(struct file *filp, char __user *buf, size_t size,
loff_t *ppos)
else
return ret;
}/*寫函式*/
static ssize_t globalmem_write(struct file *filp, const char __user *buf,
size_t size, loff_t *ppos)
return ret;
}/* seek檔案定位函式 */
static loff_t globalmem_llseek(struct file *filp, loff_t offset, int orig)
if ((unsigned int)offset > globalmem_size)
filp->f_pos = (unsigned int)offset;
ret = filp->f_pos;
break;
case 1: /*相對檔案當前位置偏移*/
if ((filp->f_pos + offset) > globalmem_size)
if ((filp->f_pos + offset) < 0)
filp->f_pos += offset;
ret = filp->f_pos;
break;
default:
ret = - einval;
break;
} return ret;
}/*檔案操作結構體*/
static const struct file_operations globalmem_fops =
;/*初始化並註冊cdev*/
static void globalmem_setup_cdev(struct globalmem_dev *dev, int index)
/*裝置驅動模組載入函式*/
int globalmem_init(void)
if (result < 0)
return result;
/* 動態申請裝置結構體的記憶體*/
globalmem_devp = kmalloc(sizeof(struct globalmem_dev), gfp_kernel);
if (!globalmem_devp) /*申請失敗*/
memset(globalmem_devp, 0, sizeof(struct globalmem_dev));
globalmem_setup_cdev(globalmem_devp, 0);
return 0;
fail_malloc: unregister_chrdev_region(devno, 1);
return result;
}/*模組解除安裝函式*/
void globalmem_exit(void)
module_author("song baohua");
module_license("dual bsd/gpl");
module_param(globalmem_major, int, s_irugo);
module_init(globalmem_init);
module_exit(globalmem_exit);
VSAN見證虛擬裝置
vsan 6.1發布了也有兩三個月了,其中有2個比較顯著的新特性,乙個就是支援stretched cluster,也就是說你的vsan集群現在可以不在乙個物理位置了,可以跨資料中心部署了 另外乙個就是2節點vsan。我們知道,原來的vsan至少需要3個節點,為啥呢?因為在預設ftt為1的時候,每塊資...
OVS中DPDK虛擬裝置
dpdk為物理和虛擬裝置提供驅動程式。物理dpdk裝置通過在 dpdk devargs 引數中指定有效的pci位址,新增到ovs中。沒有pci位址的虛擬dpdk裝置也使用 dpdk devargs 命名引數,但是格式有所不同。重要 注意 並非所有的dpdk虛擬pmd驅動程式都已經過測試和驗證。要新增...
虛擬處理器 虛擬裝置
為了提高通訊通道的利用率而引入虛擬技術,通過 空分復用 或 時分復用 技術,將一條物理通道變為若干條邏輯通道,能供給多個使用者同時通話的邏輯通道併發 多個事件同一時間間隔內發生,在多道程式下,巨集觀上有多個程式在同時執行,每一時刻卻只有一道程式執行,微觀上是只能是分時的交替執行 並行 若計算機系統中...