2011-01-17 13 views
21

Mi chiedo come il sistema operativo sta leggendo/scrivendo sul disco rigido.
Mi piacerebbe come esercizio per implementare un semplice filesystem senza directory in grado di leggere e scrivere file.
Da dove iniziare?
Will C/C++ fa il trucco o devo seguire un approccio di livello più basso?
E 'troppo per una persona da gestire?Come implementare un filesystem molto semplice?

+0

Basta dare un'occhiata al concetto di file system minix –

+0

Un filesystem non è veramente troppo per una persona da gestire. Molti filesystem sono stati scritti in gran parte da una sola persona (almeno per il bit iniziale: – Omnifarious

+0

@Mr. QC: lasciare un collegamento alle risposte: –

risposta

15

Date un'occhiata a FUSE: http://fuse.sourceforge.net/

questo vi permetterà di scrivere un file system senza dover scrivere in realtà un driver di periferica. Da lì, inizierei con un singolo file. Fondamentalmente, crea un file che è (ad esempio) di 100 MB di lunghezza, quindi scrivi le tue routine per leggere e scrivere da quel file.

Una volta soddisfatti dei risultati, è possibile esaminare la scrittura di un driver di periferica e eseguire il driver su un disco fisico.

La cosa bella è che è possibile utilizzare praticamente qualsiasi linguaggio con FUSE, non solo C/C++.

+2

Concordo sul fatto che FUSE sia una grande interfaccia per iniziare, dal momento che astrae molti dettagli di basso livello, ma forse l'OP è interessato anche a queste cose di basso livello? – miku

+2

@The MYYN: Si. Ma devo iniziare da qualche parte. –

7

Ho trovato abbastanza semplice capire un semplice filesystem mentre si utilizza il file system grasso sul microcontrollore avr.

http://elm-chan.org/fsw/ff/00index_e.html

Prendere un'occhiata al codice che si capirà come funziona grasso.

+0

secondo me, FAT è un po 'complesso –

+0

@MarkYisri, che è più facile? – Pacerier

+0

@Pacerier È possibile creare un semplice file system con una coppia 'structs'. Sarà molto limitato nella funzionalità, ma potrebbe essere sufficiente in un sistema embedded. –

7

Per l'apprendimento delle idee di un file system non è necessario utilizzare un disco, penso. Basta creare una matrice di array di byte da 512 byte. Immagina solo che il tuo disco rigido sia un inizio per sperimentare un po '. Inoltre si può decidere di Hava uno sguardo ad alcuni dei libri di testo standard di OS come http://codex.cs.yale.edu/avi/os-book/OS8/os8c/index.html

+2

link down .............. – Pacerier

3

La risposta alla sua prima domanda, è che oltre fusibile come qualcun altro vi ha detto, è anche possibile utilizzare Dokan che fa la stessa per Windows , e da lì è solo una questione di fare letture e scritture su una partizione fisica (http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx (leggi in particolare la sezione su dischi e volumi fisici)).

Ovviamente in Linux o Unix oltre all'utilizzo di qualcosa come Fuse è sufficiente emettere, una chiamata di lettura o scrittura al dispositivo ricercato in/dev/xxx (se si è root), e in questi termini gli Unix sono più amichevole o più insicuro a seconda del tuo punto di vista.

Da lì provare ad implementare un semplice filesystem come Fat, o qualcosa di più exoterico come un filesystem tar, o anche qualche semplice filesystem basato su concetti Unix come UFS o Minux, o semplicemente qualcosa che registra solo le chiamate che sono fatte e i loro argomenti in un file di log (e questo ti aiuterà a capire, le chiamate che vengono fatte al driver del filesystem durante l'uso regolare del tuo computer).

Ora la tua seconda domanda (che è molto più semplice da rispondere), sì C/C++ farà il trucco, dato che sono la lingua franca dello sviluppo del sistema, anche molto del tuo codice di esempio sarà in C/C++ quindi leggerete almeno C/C++ nel vostro sviluppo.

Ora per la terza domanda, sì, questo è eseguibile da una sola persona, ad esempio il file system ext (ampiamente conosciuto nel mondo Linux dai suoi successori come ext2 o ext3) è stato realizzato da un singolo sviluppatore Theodore Ts'o, quindi non pensare che queste cose non siano fattibili da una sola persona.

Ora le note finali, ricordate che un vero filesystem interagisce con molti altri sottosistemi in un kernel normale, per esempio, se avete un laptop e lo state ibernando, il filesystem deve scaricare tutte le modifiche apportate ai file aperti, se hai un file di paging sulla partizione o anche se il file di paging ha il proprio filesystem, questo influenzerà il tuo filesystem, in particolare le dimensioni dei blocchi, poiché tenderanno ad essere uguali o potenze della dimensione del blocco di pagina, perché è facile posizionare un blocco dal filesystem sulla memoria che per coincidenza è uguale alla dimensione della pagina (perché è solo un trasferimento).

E inoltre, sicurezza, dal momento che si desidera controllare gli utenti e quali file leggono/scrivono e che in genere significa che prima di aprire un file, si dovrà sapere quale utente è connesso e quali permessi ha per quel file. E ovviamente senza filesystem, gli utenti non possono eseguire alcun programma o interagire con la macchina. I moderni livelli del filesystem interagiscono anche con il sottosistema di rete a causa del fatto che ci sono filesystem di rete e distribuiti.

Quindi, se si vuole andare e imparare a fare file system del kernel, questi sono alcune delle cose che si dovrà preoccupare di (oltre a conoscere un'interfaccia VFS)

PS: Se si vuole fare in Unix permessi di lavoro su Windows, è possibile utilizzare qualcosa di simile a ciò che MS usa per NFS sulle versioni server di windows (http://support.microsoft.com/kb/262965)

1

Solo un complemento a ciò che Coyote21 ha detto. Puoi leggere questa tesi http://www.minix3.org/theses/gerofi-minix-vfs.pdf

In questa tesi puoi imparare un po 'di più su VFS e alcuni dettagli sono descritti lì. Ci sono cose molto utili nell'appendice B. Esiste un'implementazione di un file system (non un vero file system, ma uno in memoria).

Problemi correlati