内存设备

更新时间:
2024-01-10
下载文档

内存设备

内存设备驱动使程序访问内存像访问一个虚拟的 I/O 设备一样。内存设备的创建目前并不对应用层提供支持(需要宏 __SYLIXOS_KERNEL 来增加对内存设备创建的支持),在内核层创建好一个内存设备之后,应用程序就可以使用标准 I/O 函数来读写内存设备,下面列出了内核层创建内存设备的函数:

#define __SYLIXOS_KERNEL
#include <SylixOS.h>
INT  API_MemDrvInstall(void);
INT  API_MemDevCreate(char *name, char *base, size_t length);
INT  API_MemDevCreateDir(char *name, MEM_DRV_DIRENTRY *files, int numFiles);
INT  API_MemDevDelete(char *name);

创建一个内存设备之前,需要首先调用 API_MemDrvInstall 函数来安装内存设备驱动,一个内存设备可以对应一个文件/设备或者多个文件/设备,通过不同的函数创建。

API_MemDevCreate 函数可以创建一个单文件的内存设备,如程序清单 内存设备创建(模块)(Memory_Device_Creation.c)所示,使用方法如程序清单 读内存设备(Read_Memory_Device)所示。

程序清单 内存设备创建(模块)(Memory_Device_Creation.c)

#define  __SYLIXOS_KERNEL
#include <SylixOS.h>
#include <module.h>
char  membase[64] = "SylixOS mem device test.";
int module_init (void)
{
    API_MemDrvInstall();
    API_MemDevCreate("/dev/mem", membase, 64);
    return (0);
}
void module_exit (void)
{
    API_MemDevDelete("/dev/mem");
}

使用下面命令装载内核模块:

# modulereg memdev.ko

注意
内核模块的详细信息见动态装载部分。

使用 ll 命令查看内存设备是否创建成功(部分):

# ll /dev/
-rw-rw-rw- root     root     Thu Dec 31 13:43:41 2020     64 B, mem
srwxrwxrwx root     root     Wed Dec 30 15:57:34 2020      0 B, log
......

程序清单 读内存设备(Read_Memory_Device)

#include <stdio.h>
#include <unistd.h>
int main (int argc, char *argv[])
{
    int     fd;
    char    buf[64];
    fd = open("/dev/mem", O_RDWR);
    if (fd < 0) {
        return (-1);
    }
    read(fd, buf, 64);
    fprintf(stdout, "buf: %s\n", buf);
    return  (0);
}

在 SylixOS Shell 下运行程序,运行结果如下:

# ./Read_Memory_Device /dev/mem
buf: SylixOS mem device test.

API_MemDevCreateDir 函数可以创建多文件内存设备,如以下程序所示。

#define  __SYLIXOS_KERNEL
#include <SylixOS.h>
#include <module.h>
static char  membase0[64] = "SylixOS mem device test.";
static char  membase1[64] = "membase1 device test.";
static MEM_DRV_DIRENTRY  memdirdata0[] = {{"mem.dat", membase0, NULL, 64}};
static MEM_DRV_DIRENTRY  memdirdata1[] = {{"mem.dat", membase1, NULL, 64}};
static MEM_DRV_DIRENTRY memdir[] = {
        {"mem0", NULL, memdirdata0, 1},
        {"mem1", NULL, memdirdata1, 1},
};
int module_init (void)
{
    API_MemDrvInstall();
    API_MemDevCreateDir("/mem/", memdir, 2);
    return  (0);
}
void module_exit (void)
{
    API_MemDevDelete("/mem/");
}
文档内容是否对您有所帮助?
有帮助
没帮助