sistema - Escribir la memoria del kernel en el bloque ext2
que hace el kernel de un sistema operativo (2)
Para una asignación universitaria, tenemos que modificar el sistema de archivos ext2 para almacenar archivos en los punteros de bloque del inodo si es menor que 60 bytes, y pasar al almacenamiento de bloque regular una vez que el archivo crezca más que eso.
Copié el código ext2 de la fuente 2.6 kernel de kernel (como se indica) y pasé de allí.
Cuando el archivo crece más de 60 bytes, necesito copiar todos los datos que están actualmente en la matriz de punteros de bloque del inodo en bloques reales. Entonces, necesito escribir la memoria del kernel en bloques ext2. Una simple llamada a do_sync_write
no funcionará aquí porque requiere memoria de espacio de usuario.
He visto la implementación de do_sync_write
y no estoy seguro de cómo replicar lo que hace, pero con la memoria del kernel en su lugar.
Esta es mi implementación actual de esta parte específica (no funciona):
ssize_t extmod_write(struct file *filp, const char *buf,
size_t len, loff_t *ppos)
{
...
printk(KERN_INFO "Switching to regular file");
temp = kmalloc(inode->i_size, GFP_KERNEL);
memcpy(temp, EXT2_I(inode)->i_data, inode->i_size);
/* Need to clear the block pointers before they are allocated by kernel */
memset(EXT2_I(inode)->i_data, 0, sizeof(EXT2_I(inode)->i_data));
if (do_sync_write(filp, temp, inode->i_size, &dummy) < 0) {
printk(KERN_INFO "DAMN! Writing current buffer failed");
return -EINVAL;
}
kfree(temp);
return do_sync_write(filp, buf, len, ppos);
Editar:
Miré los enlaces simbólicos. Básicamente, ext2 tiene el concepto de "enlaces rápidos"; es decir, el nombre del enlace tiene menos de 60 bytes de longitud. Si se trata de un enlace simbólico rápido, los datos se almacenan en los punteros de bloque. Esto es fácil de hacer y ya lo he implementado para archivos regulares. Si el enlace no es un enlace rápido, los datos se manejan de la misma manera que los archivos normales. Creo que he vuelto al punto de partida.
Me las arreglé para resolverlo. Se requería obtener instancias struct buffer_head
y leer / escribir los datos en ellas. Al recorrer los números del bloque lógico y usar ext2_get_block
para recuperar bloques (asignándolos si es necesario) y luego usar sb_getblk
para obtener el búfer real y escribir en él. He publicado una implementación en mi blog .
Tonta tarea de tarea.
El código no funciona. Pruebe mmap () y muera.