Closed matibrewda closed 11 months ago
Buenas! Cómo va?
Primero que nada, para usar mmap()
tienen que abrir el archivo con open()
en lugar de fopen()
.
En segundo lugar, lo que les devuelve mmap() es un puntero a memoria, entonces lo que tienen que hacer es asumir que tienen en memoria el archivo, entonces en la posición 0 tienen el primer valor, 4 bytes despues tienen el segundo valor y asi, recuerden que la tabla tiene numeros en formato uint32_t, con lo cual, ahi lo que estan haciendo de usar fputc()
esta mal, ya que eso graba un char que ocupa 1 byte, en lugar de los 4 de un uint32_t.
Saludos.-
Muchas gracias, "Primero que nada, para usar mmap() tienen que abrir el archivo con open() en lugar de fopen()." Si, el mmap lo hago despues para levantar la tabla, abriendo el archivo con open. por otro lado, si yo hago *ptr=mmap() ptr[0] deberia ser la primer posicion, ptr[4] la segunda y asi?
en cuanto el fat lo corregi asi
fat = fopen(configuracion_filesystem->path_fat,"rb");
if(!fat){
fat = fopen(configuracion_filesystem->path_fat,"wb");
if (fat)
{
uint32_t a = 0;
uint32_t tamanio_fat = (configuracion_filesystem->cant_bloques_total - configuracion_filesystem->cant_bloques_swap);
for (uint32_t i = 0; i < tamanio_fat ; i++)
{
fwrite(&a,sizeof(uint32_t),1,fat);
}
free(a);
}
Buenas!
Algo super interesante de como maneja C los punteros es que vos podes decirle puntero a que son y despues si los tratas como array de ese tipo de dato vos podes darte el hermoso lujo de ir iterando uno a uno.
Puesto en código lo que quiero decir es que vos podrías hacer:
int fdTablaFAT = open("fat.bin", O_RDWR);
uint32_t* tablaFatEnMemoria = mmap() //Poner todos los parametros de mmap aca
Y despues parra acceder a cada elemento de la tabla FAT es tan simple como hacer:
tablaFatEnMemoria[0] //Elemento 0 de la tabla FAT
tablaFatEnMemoria[1] //Elemento 1 de la tabla FAT
tablaFatEnMemoria[2] //Elemento 2 de la tabla FAT
Entonces te ahorras el multiplicar por 4 cada vez que queres ir a un índice de la tabla, que de todas formas, te recomiendo que lo pruebes iniciando por ejemplo el archivo con un valor entre 64 y 126 (que son todos caracteres ascii visibles) y que despues una vez que guardes el archivo lo abras con el comando hexdump -C y vas a ver que ademas de los valores en hexadecimal a la derecha te va a mostrar los caracteres ASCII:
En el ejemplo de la imágen el archivo esta vacio porque lo acabo de crear desde 0
Saludos.-
Ok. Muchas gracias!, una consulta mas pero con referencia al enunciado,
Leer Archivo Esta operación leerá la información correspondiente al bloque a partir del puntero. La información se deberá enviar al módulo Memoria para ser escrita a partir de la dirección física recibida por parámetro, una vez recibida la confirmación por parte del módulo Memoria, se informará al módulo Kernel del éxito de la operación. Escribir Archivo Se deberá solicitar al módulo Memoria la información que se encuentra a partir de la dirección física recibida y se escribirá en el bloque correspondiente del archivo a partir del puntero recibido. Nota: El tamaño de la información a leer/escribir de la memoria coincidirá con el tamaño del bloque / página. Siempre se leerá/escribirá un bloque completo, los punteros utilizados siempre serán el 1er byte del bloque o página.
Cuando leemos y escribimos lo hacemos en el bloque que nos da el puntero? no leemos recorriendo los bloques de la tabla FAT?
Buenas, cómo va?
No se olviden lo que vieron en la teoría, en los bloques tienen la información, pero la tabla FAT les sirve para saber cual es el siguiente bloque en un archivo. Por ejemplo si mi FCB me dice que el bloque inicial es el bloque 4 despues en la tabla FAT pueden darse 2 situaciones:
Por lo tanto si tuvieran que por ejemplo escribir en el bloque 5 del archivo, tienen que obtener el bloque 0 del FCB y despues ir recorriendo la tabla fat hasta llegar al bloque 5 y de ahi irse con ese número al archivo de bloques y leer / escribir en ese bloque.
Saludos.-
Ok, entonces si no entiendo mal. El puntero que recibimos nos indica cierto byte del archivo, entonces yo tendria que dividir el puntero por el tamaño del bloque y recorrer la tabla FAT buscando el bloque nro x de mi archivo?
Buenas! Cómo va?
Efectivamente, como vieron en la teoría, el puntero lo dividen por el tamaño del bloque y eso les va a dar el bloque al cual tienen que apuntar, que casualmente en las pruebas publicadas si se dan cuenta apunta siempre al primer bytes del bloque para que les sean mas fáciles las cuentas y todo de redondito sin restos de división.
Saludos.-
buenas, una consulta mas con respecto al mmap()
ahora que lo quiero utilizar para el archivo de bloques, que a diferencia del fat los bloques no tienen un tamaño definido sino que varian segun la config que se este usando,
es correcta la siguiente implementacion para asi moverme por cada bloque?
void *bloque = malloc(sizeof(configuracion_filesystem->tam_bloque));
bloque=mmap() //todos los parametros
Buenas! Cómo va?
No tienen que reservarle memoria al puntero al cual van a asignar el retorno de mmap()
, la idea de mmap()
es que de alguna manera que no hace falta que conozcan al detalle, les disponibiliza el archivo en ese puntero y maneja la memoria de manera tal que no tienen que reservarla.
Saludos.-
entiendo, pero quiero luego tener un vector de bloques para poder escribir o leerlos de una manera mas facil. como deberia hacerlo?
Buenas!
Pensa que mmap te devuelve un puntero a memoria, de ahi en adelante, ya queda en uds como lo manejen, pueden simplemente usar aritmetica de punteros para acceder a los bloques haciendo algo tan simple como: puntero que devuelve mmap + (nro de bloque * tamaño de bloque)
Saludos.-
Buenas! @matibrewda esta resuelta la duda, hay algo mas con lo que te pueda ayudar? Saludos.-
Si, muchas gracias por la ayuda!
Buenas, estaba utilizando la funcion mmap para la tabla fat que tengo cargada de la siguiente manera
la pregunta es: para levantar la tabla luego quiero utilizar la funcion
mmap()
, lo que no estoy sabiendo hacer es como utilizar el puntero que me devuelve mmap para acceder a cada entrada de la tabla