内存设备
内存设备驱动使程序访问内存像访问一个虚拟的 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 函数可以创建一个单文件的内存设备,使用方法如下所示。
#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
......
#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/");
}