Bagaimana cara menerapkan driver driver sistem file di Linux? [Tutup]


14

Asumsikan saya telah menemukan sistem file baru, dan sekarang saya ingin membuat driver sistem file untuk itu.

Bagaimana saya mengimplementasikan driver sistem file ini, apakah ini dilakukan dengan menggunakan modul kernel?

Dan bagaimana driver sistem file dapat mengakses hard disk, apakah driver sistem file berisi kode untuk mengakses hard disk, atau apakah Linux mengandung driver perangkat untuk mengakses hard disk yang digunakan oleh semua driver sistem file?

Jawaban:


24

Ya, sistem file di Linux dapat diimplementasikan sebagai modul kernel. Tetapi ada juga antarmuka FUSE (Filesystem in USErspace), yang dapat memungkinkan proses ruang pengguna biasa untuk bertindak sebagai driver sistem file. Jika Anda membuat prototipe sistem file baru, mengimplementasikannya terlebih dahulu menggunakan antarmuka FUSE dapat membuat pengujian dan pengembangan lebih mudah. Setelah internal internal filesystem Anda bekerja dalam bentuk FUSE, Anda kemudian dapat mulai mengimplementasikan versi modul kernel yang dioptimalkan kinerja.

Berikut ini beberapa informasi dasar tentang penerapan sistem file di dalam ruang kernel. Agak tua (dari tahun 1996!), Tapi itu setidaknya memberi Anda ide dasar untuk hal-hal yang perlu Anda lakukan.

Jika Anda memilih untuk pergi ke rute FUSE, inilah libfuse, implementasi referensi sisi userspace dari antarmuka FUSE.

Driver sistem file sebagai modul kernel

Pada dasarnya, fungsi inisialisasi modul driver sistem file Anda hanya perlu memanggil register_filesystem()fungsi, dan memberikannya sebagai parameter struktur yang menyertakan pointer fungsi yang mengidentifikasi fungsi dalam driver sistem file Anda yang akan digunakan sebagai langkah pertama dalam mengidentifikasi sistem file Anda ketik dan pasang itu. Tidak ada lagi yang terjadi pada tahap itu.

Ketika sebuah filesystem sedang di-mount, dan salah satu tipe filesystem ditentukan untuk mencocokkan driver Anda, atau deteksi otomatis tipe filesystem sedang dilakukan, layer Virtual FileSystem kernel (VFS) akan memanggil fungsi itu. Itu pada dasarnya mengatakan "Ini adalah pointer ke representasi tingkat kernel dari perangkat blok Linux standar. Lihatlah, lihat apakah itu sesuatu yang dapat Anda tangani, dan kemudian beri tahu saya apa yang dapat Anda lakukan dengannya."

Pada titik itu, driver Anda seharusnya membaca apa pun yang diperlukan untuk memverifikasi itu adalah driver yang tepat untuk sistem file, dan kemudian mengembalikan struktur yang menyertakan pointer ke fungsi lebih lanjut yang dapat dilakukan driver Anda dengan sistem file tertentu. Atau jika driver filesystem tidak mengenali data pada disk, itu seharusnya mengembalikan hasil kesalahan yang sesuai, dan kemudian VFS akan melaporkan kegagalan ke userspace atau - jika deteksi otomatis tipe filesystem sedang dilakukan - akan meminta filesystem lain driver untuk mencoba.

Driver lain di kernel akan menyediakan antarmuka perangkat blok standar, sehingga driver sistem file tidak harus mengimplementasikan dukungan perangkat keras. Pada dasarnya, driver sistem file dapat membaca dan menulis blok disk menggunakan fungsi level kernel standar dengan penunjuk perangkat yang diberikan padanya.

Lapisan VFS mengharapkan driver sistem file untuk membuat sejumlah fungsi standar tersedia untuk lapisan VFS; beberapa di antaranya wajib untuk lapisan VFS untuk melakukan sesuatu yang berarti dengan sistem file, yang lain adalah opsional dan Anda bisa mengembalikan NULL sebagai pengganti pointer ke fungsi opsional.


1
Ini adalah jawaban yang cukup bagus meskipun untuk sepenuhnya menjawab pertanyaan seperti yang dinyatakan Anda juga perlu mengatakan sedikit tentang fungsionalitas yang disediakan oleh lapisan perangkat blok untuk lapisan sistem file.
kasperd

Saya semacam menyinggung itu dengan bit "ini adalah pointer ke perangkat blok standar", tapi bagus; Saya memperluas itu.
telcoM

Jawaban ini, khususnya uraian tentang apa yang terjadi dalam urutan apa, adalah ilahi. Apakah ada semacam buku / situs web yang bisa saya baca yang memiliki deskripsi seperti itu untuk semua "cara kerja linux"?
Adam Barnes

Anda mungkin tertarik dengan Linux Kernel Internals atau Linux Device Drivers, Edisi ke-3 . Dan tentu saja, ada opsi untuk membaca kode sumber yang sebenarnya.
telcoM


0

Ya ini biasanya dilakukan dengan menggunakan driver kernel yang dapat dimuat sebagai modul kernel atau dikompilasi ke dalam kernel.

Anda dapat memeriksa driver sistem file yang serupa dan bagaimana cara kerjanya sini .

Driver ini kemungkinan menggunakan fungsi kernel internal untuk mengakses perangkat penyimpanan sebagai blok byte, tetapi Anda juga bisa menggunakan perangkat blok seperti yang diekspos oleh driver di folder perangkat blok dan perangkat karakter .


0

Anda dapat menggunakan sekering, untuk membuat sistem file pengguna-tanah, atau menulis modul kernel. Lebih mudah dilakukan dengan sekering, karena Anda memiliki pilihan bahasa, dan tidak akan crash kernel (dan karena itu seluruh sistem).

Modul kernel bisa lebih cepat, tetapi aturan optimasi pertama adalah: Jangan lakukan itu sampai Anda menguji kode kerja. Yang kedua seperti itu: Jangan lakukan itu sampai Anda memiliki bukti bahwa itu terlalu lambat. Dan yang ketiga: Jangan simpan kecuali Anda memiliki bukti bahwa itu membuatnya lebih cepat / lebih kecil.

Dan ya kernel sudah memiliki driver untuk perangkat keras, Anda tidak mengimplementasikannya kembali.


Ada kelemahan utama FUSE selain kinerja: sulit untuk menggunakannya untuk sistem file root Anda. (Mungkin mungkin dengan initrd, tetapi biner FUSE tidak dapat dibebaskan setelah boot karena masih akan mengeksekusi dari ramdisk.)
Peter Cordes

1
@PeterCordes Tidak bisa dibebaskan , tetapi itu tidak berarti tidak dapat dibatalkan tautannya. Jika masih ada referensi untuk itu, itu akan disimpan dalam memori terlepas dari apakah Anda meninggalkan initramfs dan menghapus biner yang mendasarinya.
hutan

@ forest: benar, karena itu Anda tidak dapat meng-unmount initrd setelahnya pivot_root, karena masih ada inode yang sibuk di initramfs.
Peter Cordes

Sebuah normal /initdimulai dari initramfs akan (saya pikir) /initmengeksekusi setelah pivot_root, untuk mentransfer kontrol ke FS root sebenarnya /init. Tetapi biner FUSE tidak dapat menggantikan dirinya dengan mengeksekusi jika akses ke root FS tergantung pada proses FUSE menanggapi kernel. Mungkin dengan mengutamakan pagecache terlebih dahulu, tapi itu kedengarannya tidak bisa diandalkan.
Peter Cordes
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.