Mod aaa-12 增加内存管理驱动以及用户态测试程序
RCA: SOL: 修改人:huangxin 检视人:huangxin
This commit is contained in:
parent
bae3fc5999
commit
d4cd8f2fe5
|
@ -11,11 +11,13 @@
|
||||||
#include "shm_dev.h"
|
#include "shm_dev.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define SHM_DEV_MAJOR (200)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @def SHM_DEV_NAME
|
* @def SHM_DEV_NAME
|
||||||
* @brief
|
* @brief
|
||||||
*/
|
*/
|
||||||
#define SHM_DEV_NAME ("shm_dev") ///< 设备节点名称
|
#define SHM_DEV_NAME ("shmdev") ///< 设备节点名称
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var typedef {anonOBJECT_DRV} SHM_DRV
|
* @var typedef {anonOBJECT_DRV} SHM_DRV
|
||||||
|
@ -148,16 +150,10 @@ static struct file_operations shmdev_fops = {
|
||||||
static int __init shmdev_module_init(void)
|
static int __init shmdev_module_init(void)
|
||||||
{
|
{
|
||||||
struct page *p = NULL;
|
struct page *p = NULL;
|
||||||
dev_t dev = 0;
|
int ret = 0;
|
||||||
|
|
||||||
printk(KERN_INFO "Hello ISG share memory manager version: %s\n", SHMDEV_VERSION);
|
printk(KERN_INFO "Hello ISG share memory manager version: %s\n", SHMDEV_VERSION);
|
||||||
|
|
||||||
// 自动分配设备版本号
|
|
||||||
if(alloc_chrdev_region(&dev, 0, 1, SHM_DEV_NAME) != 0) {
|
|
||||||
printk(KERN_ERR "Alloc driver dev id error\n");
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 分配驱动程序结构内存
|
// 分配驱动程序结构内存
|
||||||
g_shm_dev = (PSHM_DRV)kmalloc(sizeof(SHM_DRV), GFP_KERNEL);
|
g_shm_dev = (PSHM_DRV)kmalloc(sizeof(SHM_DRV), GFP_KERNEL);
|
||||||
|
|
||||||
|
@ -167,9 +163,38 @@ static int __init shmdev_module_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(g_shm_dev, 0, sizeof(SHM_DRV));
|
memset(g_shm_dev, 0, sizeof(SHM_DRV));
|
||||||
g_shm_dev->dev_major = MAJOR(dev); // 保存驱动版本号
|
|
||||||
atomic_set(&g_shm_dev->ref_count, 0);
|
atomic_set(&g_shm_dev->ref_count, 0);
|
||||||
|
|
||||||
|
// 注册字符设备
|
||||||
|
ret = register_chrdev(SHM_DEV_MAJOR, SHM_DEV_NAME, &shmdev_fops);
|
||||||
|
|
||||||
|
if(ret < 0) {
|
||||||
|
kfree(g_shm_dev);
|
||||||
|
printk(KERN_ERR "register_chrdev error: %d\n", ret);
|
||||||
|
return -ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
printk(KERN_ERR "ret = %d, major = %u, devno = %d\n", ret, SHM_DEV_MAJOR, MKDEV(SHM_DEV_MAJOR, 0));
|
||||||
|
|
||||||
|
|
||||||
|
// 创建字符设备类
|
||||||
|
g_shm_dev->dev_class = class_create(THIS_MODULE, "shm_class");
|
||||||
|
|
||||||
|
if(g_shm_dev->dev_class == NULL) {
|
||||||
|
printk(KERN_ERR "class_create error\n");
|
||||||
|
kfree(g_shm_dev);
|
||||||
|
return -ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建字符设备节点
|
||||||
|
if(device_create(g_shm_dev->dev_class, NULL, MKDEV(SHM_DEV_MAJOR, 0),
|
||||||
|
NULL, "shm_dev/shm%d", 0) == NULL) {
|
||||||
|
printk(KERN_ERR "device_create error\n");
|
||||||
|
class_destroy(g_shm_dev->dev_class);
|
||||||
|
kfree(g_shm_dev);
|
||||||
|
return -ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
// 初始化共享内存
|
// 初始化共享内存
|
||||||
g_shm_dev->mem_size = PAGE_ALIGN(SHM_MEM_SIZE);
|
g_shm_dev->mem_size = PAGE_ALIGN(SHM_MEM_SIZE);
|
||||||
g_shm_dev->mem_buf = (unsigned char *)__get_free_pages(GFP_KERNEL, get_order(g_shm_dev->mem_size));
|
g_shm_dev->mem_buf = (unsigned char *)__get_free_pages(GFP_KERNEL, get_order(g_shm_dev->mem_size));
|
||||||
|
@ -191,13 +216,6 @@ static int __init shmdev_module_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(g_shm_dev->mem_buf, 0, g_shm_dev->mem_size);
|
memset(g_shm_dev->mem_buf, 0, g_shm_dev->mem_size);
|
||||||
// 注册字符设备
|
|
||||||
register_chrdev(g_shm_dev->dev_major, SHM_DEV_NAME, &shmdev_fops);
|
|
||||||
// 创建字符设备类
|
|
||||||
g_shm_dev->dev_class = class_create(THIS_MODULE, "obj");
|
|
||||||
// 创建字符设备节点
|
|
||||||
device_create(g_shm_dev->dev_class, NULL, MKDEV(g_shm_dev->dev_major, 0),
|
|
||||||
NULL, "isg_objs/shm%d", 0);
|
|
||||||
|
|
||||||
// 初始化 proc 接口
|
// 初始化 proc 接口
|
||||||
shmdev_proc_init();
|
shmdev_proc_init();
|
||||||
|
@ -235,9 +253,9 @@ static void __exit shmdev_module_exit(void)
|
||||||
free_pages((unsigned long)g_shm_dev->mem_buf, get_order(g_shm_dev->mem_size));
|
free_pages((unsigned long)g_shm_dev->mem_buf, get_order(g_shm_dev->mem_size));
|
||||||
}
|
}
|
||||||
|
|
||||||
device_destroy(g_shm_dev->dev_class, MKDEV(g_shm_dev->dev_major, 0));
|
device_destroy(g_shm_dev->dev_class, MKDEV(SHM_DEV_MAJOR, 0));
|
||||||
class_destroy(g_shm_dev->dev_class);
|
class_destroy(g_shm_dev->dev_class);
|
||||||
unregister_chrdev(g_shm_dev->dev_major, SHM_DEV_NAME);
|
unregister_chrdev(SHM_DEV_MAJOR, SHM_DEV_NAME);
|
||||||
|
|
||||||
kfree(g_shm_dev);
|
kfree(g_shm_dev);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,67 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <cjson/cJSON.h>
|
#include <fcntl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
|
||||||
#include "compile.h"
|
#include "compile.h"
|
||||||
|
|
||||||
|
#define PAGE_ALIGN(addr) (((addr) + ((4096)-1)) & (~((4096) - 1)))
|
||||||
|
#define SHM_DEV_NAME ("/dev/shm_dev/shm0")
|
||||||
|
|
||||||
|
void mmap_test_read(void)
|
||||||
|
{
|
||||||
|
unsigned int cnt = 0;
|
||||||
|
unsigned char *pBuf;
|
||||||
|
int fd = open(SHM_DEV_NAME, O_RDWR);
|
||||||
|
|
||||||
|
if(fd == -1) {
|
||||||
|
fprintf(stderr, "Open device %s error: %s\n", SHM_DEV_NAME, strerror(errno));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pBuf = (unsigned char *)mmap(NULL, PAGE_ALIGN(1024 * 1024), PROT_READ, MAP_SHARED | MAP_LOCKED, fd, 0);
|
||||||
|
|
||||||
|
if(pBuf == NULL) {
|
||||||
|
fprintf(stderr, "mmap memory %u error: %s\n", PAGE_ALIGN(1024 * 1024), strerror(errno));
|
||||||
|
close(fd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
fprintf(stdout, "[%04u]: %s\n", cnt++, (char *)pBuf);
|
||||||
|
sleep(1);
|
||||||
|
} while(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mmap_test_write(void)
|
||||||
|
{
|
||||||
|
unsigned int cnt = 0;
|
||||||
|
unsigned char *pBuf;
|
||||||
|
int fd = open(SHM_DEV_NAME, O_RDWR);
|
||||||
|
|
||||||
|
if(fd == -1) {
|
||||||
|
fprintf(stderr, "Open device %s error: %s\n", SHM_DEV_NAME, strerror(errno));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pBuf = (unsigned char *)mmap(NULL, PAGE_ALIGN(1024 * 1024), PROT_WRITE, MAP_SHARED | MAP_LOCKED, fd, 0);
|
||||||
|
|
||||||
|
if(pBuf == NULL) {
|
||||||
|
fprintf(stderr, "mmap memory %u error: %s\n", PAGE_ALIGN(1024 * 1024), strerror(errno));
|
||||||
|
close(fd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
memset(pBuf, 0, 512);
|
||||||
|
sprintf(pBuf, "Test %u times of share memory\n", cnt++);
|
||||||
|
sleep(1);
|
||||||
|
} while(1);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 应用程序主函数
|
* @brief 应用程序主函数
|
||||||
* @param argc 输入参数个数
|
* @param argc 输入参数个数
|
||||||
|
@ -14,33 +71,37 @@
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int c, optidx = 0;
|
int c, optidx = 0;
|
||||||
|
|
||||||
cJSON *root = cJSON_CreateObject();
|
|
||||||
|
|
||||||
static const struct option long_opts[] = {
|
static const struct option long_opts[] = {
|
||||||
{ "help", no_argument, NULL, 'h' },
|
{ "help", no_argument, NULL, 'h' },
|
||||||
{ "version", no_argument, NULL, 'v' },
|
{ "version", no_argument, NULL, 'v' },
|
||||||
|
{ "shm_read", no_argument, NULL, 'r' },
|
||||||
|
{ "shm_write", no_argument, NULL, 'w' },
|
||||||
// TODO 添加其它需要处理的参数配置
|
// TODO 添加其它需要处理的参数配置
|
||||||
{NULL, 0, NULL, 0}
|
{NULL, 0, NULL, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
cJSON_Delete(root);
|
while((c = getopt_long(argc, argv, "hvrw", long_opts, &optidx)) != -1) {
|
||||||
while((c = getopt_long(argc, argv, "hv", long_opts, &optidx)) != -1)
|
switch(c) {
|
||||||
{
|
case 'v':
|
||||||
switch (c)
|
fprintf(stdout, "User demo version: %s(%s)\n", sGATE_GIT_TAGS, sGATE_GIT_VERS);
|
||||||
{
|
break;
|
||||||
case 'v':
|
|
||||||
fprintf(stdout, "User demo version: %s(%s)\n", sGATE_GIT_TAGS, sGATE_GIT_VERS);
|
|
||||||
break;
|
|
||||||
//TODO 添加其它必要处理参数过程
|
|
||||||
|
|
||||||
case '?':
|
//TODO 添加其它必要处理参数过程
|
||||||
case 'h':
|
case 'r':
|
||||||
fprintf(stdout, "Usage: %s [-h] [-v] ...\n", argv[0]);
|
mmap_test_read();
|
||||||
fprintf(stdout, "options:\n");
|
break;
|
||||||
fprintf(stdout, "\t-v, --version show program version\n");
|
|
||||||
fprintf(stdout, "\t-h, --help print this message\n");
|
case 'w':
|
||||||
break;
|
mmap_test_write();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '?':
|
||||||
|
case 'h':
|
||||||
|
fprintf(stdout, "Usage: %s [-h] [-v] ...\n", argv[0]);
|
||||||
|
fprintf(stdout, "options:\n");
|
||||||
|
fprintf(stdout, "\t-v, --version show program version\n");
|
||||||
|
fprintf(stdout, "\t-h, --help print this message\n");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue