elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Creacion de SWAP y acceso a los datos almacenados en la misma
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Creacion de SWAP y acceso a los datos almacenados en la misma  (Leído 1,550 veces)
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Creacion de SWAP y acceso a los datos almacenados en la misma
« en: 19 Agosto 2016, 20:14 pm »

Hace tiempo vi un post, donde preguntaban sobre como crear una "partición" de swap o intercambio entre memoria y Disco Duro, solo que no logro encontrar el tema.

Bien estos dias estoy trabajando en un proyecto similar, donde tengo un archivo de X cantidad de Gigabytes desde 2, 4, 8, ... o mas

El detalle que cuando quieres trabajar con estas "particiones" para aprender como los sistemas operativos administran la falta de memoria con un espacio de intercambio en Disco te encuentras con el problema de que debes de administrar "optima-mente" ese espacio, y no significa que debas de ahorrar cada byte, pero es comun que las cosas que almacenas en ese espacio en disco cambien de tamaño o sean borradas poco después de escribirlas.. y por optima-mente me refiero a no perder de vista donde dejas cada cosa y a donde se movió, y que espacios quedan libres.

El codigo para escribir un archivo en Blanco de 4 Gigabytes es el siguiente:

Código
  1. #define KB 1024
  2. #define MB 1048576
  3.  
  4. register int i = 0;
  5. char *buffer = NULL;
  6. FILE *archivo = NULL;
  7. archivo = fopen("cache.bin","wb");
  8. buffer = calloc(MB,sizeof(char));
  9. while(i < 4*KB) {
  10. fwrite(buffer,MB,1,archivo);
  11. i++;
  12. }
  13. fclose(archivo);
  14. return 0;

Con eso ya tenemos nuestro espacio para "intercambio", ahora necesitamos tener otro archivo o estructura donde recordemos donde dejamos cada cosa...

Código
  1. struct map_item {
  2. uint64_t start;
  3. uint64_t end;
  4. uint8_t name[80];
  5. };
  6.  

Suponiendo que esa sea nuestra estructura de donde dejamos las cosas, podríamos tener la siguiente función para recuperar X catidad de bytes desde el archivo.

Código
  1. uint8_t *get_data_from_swap(uint64_t s,uint64_t e) {
  2. FILE *swap_file = NULL;
  3. uint8_t *data = NULL;
  4. uint64_t l,r;
  5. l = e-s;
  6. swap_file = fopen("cache.bin","rb");
  7. if(swap_file) {
  8. data = malloc(l+1);
  9. fseek(swap_file,s,SEEK_SET);
  10. r = fread(data,1,l,swap_file);
  11. if(l != r) {
  12. fprintf("Error al leer archivo de SWAP",stderr);
  13. }
  14. data[l] = 0;
  15. fclose(swap_file);
  16. }
  17. else {
  18. fprintf("Error al leer archivo de SWAP",stderr);
  19. }
  20. return data;
  21. }

Asi solo pedimos el inicio y el final y la función  se encarga de leer el archivo y devolvernos un apuntador con los datos solicitados + 1 byte de Caracter NULO

Y esto NO SOLO sirve para "Contenido de memoria", simplemente puede ser una archivo de configuración, con X cantidad de parámetros por ejemplo si estamos haciendo un juego podemos guardar Datos ahi, como récords de los usuarios, nombres, items de juego y una larga lista de etceteras...

Solo tenemos que identificarlos bien y tener las rutinas adecuadas para guardar valores nuevos y "Reacomodar" los items existentes para no dejar huecos libres.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines