Vous devez être conscient que vous devez éviter les E / S de fichiers depuis le noyau Linux lorsque cela est possible. L'idée principale est d'aller "d'un niveau plus profond" et d'appeler directement les fonctions de niveau VFS au lieu du gestionnaire d'appel système:
Comprend:
#include <linux/fs.h>
#include <asm/segment.h>
#include <asm/uaccess.h>
#include <linux/buffer_head.h>
Ouverture d'un fichier (similaire à ouvrir):
struct file *file_open(const char *path, int flags, int rights)
{
struct file *filp = NULL;
mm_segment_t oldfs;
int err = 0;
oldfs = get_fs();
set_fs(get_ds());
filp = filp_open(path, flags, rights);
set_fs(oldfs);
if (IS_ERR(filp)) {
err = PTR_ERR(filp);
return NULL;
}
return filp;
}
Fermer un fichier (similaire à fermer):
void file_close(struct file *file)
{
filp_close(file, NULL);
}
Lecture des données d'un fichier (similaire à la lecture préalable):
int file_read(struct file *file, unsigned long long offset, unsigned char *data, unsigned int size)
{
mm_segment_t oldfs;
int ret;
oldfs = get_fs();
set_fs(get_ds());
ret = vfs_read(file, data, size, &offset);
set_fs(oldfs);
return ret;
}
Ecrire des données dans un fichier (similaire à pwrite):
int file_write(struct file *file, unsigned long long offset, unsigned char *data, unsigned int size)
{
mm_segment_t oldfs;
int ret;
oldfs = get_fs();
set_fs(get_ds());
ret = vfs_write(file, data, size, &offset);
set_fs(oldfs);
return ret;
}
La synchronisation modifie un fichier (similaire à fsync):
int file_sync(struct file *file)
{
vfs_fsync(file, 0);
return 0;
}
[Modifier] À l'origine, j'ai proposé d'utiliser file_fsync, qui a disparu dans les nouvelles versions du noyau. Merci au pauvre type qui a suggéré le changement, mais dont le changement a été rejeté. La modification a été rejetée avant que je puisse l'examiner.
Depuis la version 4.14 du noyau Linux,
vfs_read
et lesvfs_write
fonctions sont pas exportées plus pour une utilisation dans des modules. Au lieu de cela, des fonctions exclusivement pour l'accès aux fichiers du noyau sont fournies:De
filp_open
plus, n'accepte plus la chaîne d'espace utilisateur, elle peut donc être utilisée pour l'accès au noyau directement (sans danse avecset_fs
).la source