From 8a5231233d20c7341adb02952bcea7ea231531d5 Mon Sep 17 00:00:00 2001 From: Amelia Coutard Date: Thu, 21 Dec 2023 04:25:45 +0100 Subject: [PATCH] =?utf8?q?Encore=20un=20peu=20de=20r=C3=A9flexion=20sur=20?= =?utf8?q?l'API=20des=20fichiers?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- doc.txt | 33 ++++++++++++++++++++++++++------- kernel/src/ring3.cpp | 4 ++-- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/doc.txt b/doc.txt index 5bfd000..59ef402 100644 --- a/doc.txt +++ b/doc.txt @@ -37,6 +37,14 @@ avec un slash après le nom des répertoires, et un retour à la ligne après ch Quand un fichier est ouvert, un descripteur lui est assigné. Ce descripteur stocke un indice qui correspond à la position courante dans le fichier. +// Note à moi même: +// Contextes de permissions: peut modifier /proc uniquement pour son contexte et ses contextes enfants + +--------------------------- + +Systèmes de fichiers noyaux: +'s' (serial): Un système de fichiers composé d'un seul fichier, /serial, ouvrable en lecture et en écriture, qui correspond au port série de l'ordinateur. + --------------------------- Types de données: @@ -54,17 +62,28 @@ Si l'appel réussi, %rax contient le résultat (≥ 0). Sinon, %rax contient -1. Tous les registres sont préservés, sauf %rcx, %r11 et (évidemment) %rax. enum open_options { - MODE_READ = 0x1 - MODE_WRITE = 0x2 - MODE_DIRECTORY = 0x4 - OPTION_INPLACE = 0x8 + MODE_READ = 0x1, + MODE_WRITE = 0x2, + MODE_DIRECTORY = 0x4, + OPTION_INPLACE = 0x8, +}; + +enum mount_type { + MOUNT_REPLACE = 0, + MOUNT_BEFORE = 1, + MOUNT_AFTER = 2, }; -ssize_t mount_kernel_device(fd_t wd, char device, char const path[path_len], ssize_t path_len); +ssize_t mount_kernel_device(fd_t wd, char device, char const path[path_len], ssize_t path_len, mount_type mount_type); %rax = 0 Essaye de monter le système de fichiers noyau au chemin path. - Désormais, "/" ne se réfère plus a son hypothétique ancien fichier, mais à la racine du système de fichiers monté. - Retourne -1 si wd n'existe pas et que le chemin est relatif, ou si device n'existe pas. + "/" doit se référer à un répertoire. + Si mount_type est MOUNT_REPLACE, "/" ne se réfère plus a son ancien répertoire, mais à la racine du système de fichiers monté. + Si mount_type est MOUNT_BEFORE, "//fic" cherche d'abord le fichier dans le système de fichiers monté, et dans le répertoire pré-existant s'il n'est pas trouvé. + Il est désormais impossible de créer un fichier dans /. + Si mount_type est MOUNT_AFTER, "//fic" cherche d'abord le fichier dans le répertoire pré-existant, et dans le système de fichiers monté s'il n'est pas trouvé. + Il est désormais impossible de créer un fichier dans /. + Retourne -1 si / (ou si absolu) n'existe pas et que le chemin est relatif, ou si device n'existe pas. Alors l'arbre de fichiers du processus n'est pas modifié. Sinon, retourne 0. Alors l'arbre de fichiers du processus est modifié comme spécifié. diff --git a/kernel/src/ring3.cpp b/kernel/src/ring3.cpp index 2c458a8..0073e07 100644 --- a/kernel/src/ring3.cpp +++ b/kernel/src/ring3.cpp @@ -49,8 +49,8 @@ void schedule_next_process() { os::paging::load_pml4t(os::processes.get(os::current_pid).PML4T); } -// extern "C" std::int64_t syscall_mount_kernel_device(std::int64_t wd, char device, char const* path, std::int64_t path_len) { -extern "C" std::int64_t syscall_mount_kernel_device(std::int64_t, char, char const*, std::int64_t) { +// extern "C" std::int64_t syscall_mount_kernel_device(std::int64_t wd, char device, char const* path, std::int64_t path_len, int mount_type) { +extern "C" std::int64_t syscall_mount_kernel_device(std::int64_t, char, char const*, std::int64_t, int) { os::assert(false, "mount_kernel_device not implemented yet."); __builtin_unreachable(); } -- 2.47.0