从 PM 或 VFS 服务器 (Minix) 写入文件

Posted

技术标签:

【中文标题】从 PM 或 VFS 服务器 (Minix) 写入文件【英文标题】:Writing to a file from the PM or VFS servers (Minix) 【发布时间】:2016-12-20 09:32:45 【问题描述】:

我正在尝试为 Minix 系统编写系统调用。需要系统调用来寻找位置并写入该位置的文件。

但是,我无法从 pm 服务器内部调用 lseek 或 write,或 fseek、fwrite。如果我包含任何具有这些函数的库,编译器似乎无法识别这些函数,它说它们是未定义的,因此编译时会崩溃。

我敢打赌,当 PM、VFS 服务器正在编译时,stdio、unistd 尚未编译,因此会出现错误,但在这种情况下,我应该如何查找或写入文件?

有什么线索吗?

提前致谢。

【问题讨论】:

【参考方案1】:

您需要在 com.h 中创建新的 PM_ 常量并在 servers/vfs/main.c 中处理它们(例如使用 do_seek)并在 servers/pm/*.c 代码中使用 sendrec(VFS_PROC_NR, &m) 来调用PM 进入 VFS 并执行该代码。

必须根据接收 VFS 代码的预期设置 sendrec 的消息(参见 seek.c 或 open.c 或服务器/vfs 内部的任何内容)。

PM 中调用 VFS 的代码看起来像使用 syscall() 的库调用,但将使用 sendrec() 而不是 syscall(),带有 m_type

例如在您要写入的某些服务器/pm/*.c 文件中:

static int kwrite(int fd, const void * buf, int len)
 
    message m;

    memset(&m, 0, sizeof(m));

    m.m_type = PM_WRITE;
    m.PM_VFS_FD = fd;
    m.PM_VFS_BUFLEN = len;
    m.PM_VFS_BUF = (void *)buf;

    /* printf("SYS PM Sending %s to VFS for write\n", (char *)buf); */

    if (sendrec(VFS_PROC_NR, &m) != 0)
        printf("SYS PM Error sending write of %d bytes to VFS from PM\n", len);

    return m.PM_STATUS;
 

在 server/vfs/main.c 端的 service_pm()

case PM_WRITE:
 
    endpoint_t proc_e = job_m_in.PM_PROC;
    m_out.m_type = PM_WRITE_REPLY;
    m_out.PM_STATUS = do_write();
    m_out.PM_PROC = proc_e;
 
break;

【讨论】:

您能详细说明一下吗?有没有更详细的例子?

以上是关于从 PM 或 VFS 服务器 (Minix) 写入文件的主要内容,如果未能解决你的问题,请参考以下文章

将 Midi 序列写入文件

minix3怎么没有图形界面??

无法在 nodeJS 中获取 pm2 退出或停止事件

在 unix (Minix) 源代码中执行的 shell 命令在哪里?

MINIX 成世界最流行的操作系统,暗藏着最大的威胁?

Linux 虚拟文件系统(VFS)介绍