globalmem虛擬裝置例項描述 二

2021-06-12 19:28:59 字數 2744 閱讀 2079

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驅動程式都已經過測試和驗證。要新增...

虛擬處理器 虛擬裝置

為了提高通訊通道的利用率而引入虛擬技術,通過 空分復用 或 時分復用 技術,將一條物理通道變為若干條邏輯通道,能供給多個使用者同時通話的邏輯通道併發 多個事件同一時間間隔內發生,在多道程式下,巨集觀上有多個程式在同時執行,每一時刻卻只有一道程式執行,微觀上是只能是分時的交替執行 並行 若計算機系統中...