Lea y escriba el sector del disco duro de manera directa y eficiente [duplicate]

3 minutos de lectura

Tengo una necesidad especial de almacenamiento de datos en bloque. Mis datos son bloques de datos formateados con un tamaño de 4096. Para una alta eficiencia, quiero manipular directamente el bloque en el sector del disco duro y no quiero tratar el bloque de datos como un archivo. Creo que una forma es tratar el dispositivo como un archivo como /dev/sda1 y usar lseek() read() y write() para leer y escribir datos. Sin embargo, no sé si el encabezado del archivo es el primer sector del disco duro. También sospecho de la eficiencia de este método.

Estoy trabajando en Linux OS y lenguaje de programación C.

¿Cuál es la forma más eficiente de manejar el sector del disco duro? ¿Debo escribir un módulo de dispositivo de bloque de linux. Sin embargo, no sé mucho al respecto. ¿Qué funciones del kernel debo usar para leer y escribir en un dispositivo de bloque?

  • ¿Es esto: stackoverflow.com/questions/3520459/… relevante para usted? Parece responder a la mayoría de las preguntas de “cómo”, aunque es posible que deba realizar una investigación básica para conocer las funciones exactas.

    – Avery

    23 de noviembre de 2013 a las 10:43

  • Es relevante, pero no sé qué método tiene un buen rendimiento de velocidad de E/S para el acceso aleatorio al disco duro.

    – chenatu

    23 de noviembre de 2013 a las 10:51

  • ¿Por qué quiere evitar un sistema de archivos? Dado que los discos duros son alrededor de un millón de veces más lentos que la RAM y que los SSD son miles de veces más lentos que la RAM, la sobrecarga del sistema de archivos es tan pequeña que generalmente no es perceptible. Y el controlador de disco (dentro del propio disco, por lo que ningún software puede evitarlo) está haciendo muchas cosas en estos días (reorganizaciones del sector, etc.). Por ejemplo, podría usar (desde una aplicación de usuario) ordinario read(2) acceso (con tamaño de datos múltiplo de 4 Kbytes y 4 Kbyte alineados). Además, los sistemas de archivos se almacenan en caché.

    – Basile Starynkevitch

    23 de noviembre de 2013 a las 13:17


  • @andrewcooke: la gente a veces pide más detalles sobre las preguntas debido al “problema XY”: meta.stackexchange.com/questions/66377/cuál-es-el-problema-xy – esto es algo bastante común cuando la pregunta parece más específica sobre su solución que sobre su problema original.

    – John Zwink

    23 de noviembre de 2013 a las 14:35


  • @andrewcooke: porque si veo a alguien preguntando cómo operar una pistola para cortarse las uñas, creo que es mucho más útil explicarle que los cortaúñas son más que adecuados.

    – Mateo Italia

    23 de noviembre de 2013 a las 16:56

“Bloques con un tamaño de 4096” no es una necesidad especial, y no ha mencionado ningún patrón de acceso que rompa los mecanismos de almacenamiento en caché integrados en el núcleo.

La forma más eficiente de leer y escribir sus datos es usar un archivo.

int ReadSector(int numSector,char* buf)
{
    int retCode = 0;
    BYTE sector[512];
    DWORD bytesRead;
    HANDLE device = NULL;

    device = CreateFile("\\\\.\\H:",    // Drive to open
        GENERIC_READ,           // Access mode
        FILE_SHARE_READ,        // Share Mode
        NULL,                   // Security Descriptor
        OPEN_EXISTING,          // How to create
        0,                      // File attributes
        NULL);                  // Handle to template

    if(device != NULL)
    {
        // Read one sector
        SetFilePointer (device, numSector*512, NULL, FILE_BEGIN) ;

        if (!ReadFile(device, sector, 512, &bytesRead, NULL))
        {
            Print("Error in reading1 floppy disk\n",numligne++);
        }
        else
        {
            // Copy boot sector into buffer and set retCode
            memcpy(buf,sector, 512);retCode=1;
        }

        CloseHandle(device);
        // Close the handle
    }

    return retCode;
}

Esta es mi función para leer sectores y es la misma manera de escribir. El sector cero será el primer sector de una partición

  • @ Daniel: buena pista, desafortunadamente no mencionas las inclusiones necesarias que usas con tu función 🙂

    – Roberto

    27 de noviembre de 2014 a las 17:03

  • Este código es para Windows, no para Linux como solicitó el OP.

    usuario149341

    04/07/2017 a las 17:00

  • @Robert #incluye

    – Stanley Jointer II

    5 de febrero de 2020 a las 15:33

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad