Запись в файл с серверов PM или VFS (Minix)

Я пытаюсь написать системный вызов для системы Minix. Системный вызов необходим для поиска позиции и записи в файл в этой позиции.

Однако я не могу вызвать lseek или write или fseek, fwrite изнутри сервера pm. Если я включаю любую из библиотек, в которых есть эти функции, компилятор, похоже, не распознает функции, он говорит, что они не определены, поэтому при компиляции происходит сбой.

Могу поспорить, что к моменту компиляции серверов PM, VFS stdio, unistd еще не были скомпилированы, отсюда и ошибки, но в таком случае, как мне искать или записывать в файл?

Любые подсказки?

Заранее спасибо.


person Fernando Barbosa Gomes    schedule 13.08.2016    source источник


Ответы (1)


Вам нужно создать новые константы PM_ в com.h и обрабатывать их (например, с помощью do_seek) в server/vfs/main.c и использовать sendrec(VFS_PROC_NR, &m) в коде server/pm/*.c для вызова из PM в VFS. и выполнить этот код.

Сообщение для sendrec должно быть настроено в соответствии с ожидаемым кодом получения VFS (см. seek.c или open.c или что-то еще внутри серверов/vfs).

Код внутри PM для вызова VFS будет выглядеть как библиотечные вызовы, которые используют syscall(), но будут использовать sendrec() вместо syscall(), с m_type

например в некоторых файлах server/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;
person Kerrnel    schedule 27.10.2016
comment
Можете ли вы рассказать об этом подробнее? Есть более подробные примеры? - person John; 16.11.2016