Red de conocimiento informático - Aprendizaje de programación - ¿Cuál es el propósito del dispositivo mtd en Linux? Entonces, ¿qué hace mtdblock?

¿Cuál es el propósito del dispositivo mtd en Linux? Entonces, ¿qué hace mtdblock?

mtd es un dispositivo de caracteres, mtdblock es un dispositivo de bloques

Puedes ver la implementación del comando dd en ocupadobox

Agregar:

/dev/mtd /* o / dev/mtd* Estas dos representaciones generalmente representan dispositivos de caracteres /dev/mtdblock/* o /dev/mtdblock* Estas dos representaciones generalmente representan dispositivos de bloque. Parece que dd solo representa dispositivos de bloque. mtdblock* Estos dos representan dispositivos de bloque. mount suele ser un dispositivo de bloque. Parece que dd solo opera dispositivos de caracteres.

Ejemplo:

mtd0 es el dispositivo de caracteres de mtdblock0.

Crear dispositivos char mtd >

> mknod /dev/mtd0 c 90 0

> mknod /dev/mtd1 c 90 2

La diferencia entre /dev/mtd y /dev/mtdblock en Linux, es decir, la diferencia entre dispositivo de caracteres MTD y dispositivo de bloque

1./dev/mtdN es un dispositivo de caracteres de arquitectura MTD en Linux Y el propio sistema implementa el dispositivo de caracteres correspondiente a la partición mtd, que agrega algo de ioctl para admitir muchos comandos, como MEMGETINFO, MEMERASE, etc. Herramientas como flash_eraseall en mtd-util implementan algunas operaciones en Flash basadas en estos ioctls. Por ejemplo, flash_eraseall en la herramienta mtd: if (ioctl(fd, MEMGETINFO, &meminfo) != 0) { fprintf(stderr, "%s: %s: no se puede obtener información del dispositivo MTD\n", exe_name, mtd_device); return 1;} En MEMGETINFO, este es el MTD de Linux en mtdchar.c en drivers/mtd/nand/: static int mtd_ioctl(struct inode *inode, struct file *file, u_int cmd, u_long arg){. . . . caso MEMGETINFO: info.tipo = mtd->tipo; info.flags = mtd->tipo; info.flags = mtd->tipo; info.flags = mtd->tipo; banderas = mtd->tipo; info.flags = mtd->typeflags = mtd->flags;info.size=mtd->size;info.erasesize=mtd->erasesize;info.writesize=mtd->writesize;info. oobsize = mtd->oobsize;/*Los siguientes campos están obsoletos*/ info.ecctype = -1; info.eccsize = 0; if (copy_to_ user(argp, &info, sizeof(struct mtd_info_user)) return -EFAULT; break; ...}.

Y /dev/mtdblockN es el dispositivo de bloque correspondiente generado por el controlador Nand Flash al agregar una partición de dispositivo MTD usando add_mtd_partitions(). Según el contenido anterior, podemos comprender mejor por qué no podemos usar nandwrite, flash_eraseall, flash_erase y otras herramientas para operar /dev/mtdblockN. Debido a que /dev/mtdblock no contiene el ioctl correspondiente, no le permite hacer esto. 2. El número de dispositivo principal del dispositivo mtd char es 90, mientras que el número de dispositivo principal del dispositivo mtd block es 31: # ls /dev/mtd?-l crw-r----- 1 root root 90, 0 30 de mayo de 2007 / dev/ mtd0crw-r----- 1 raíz raíz 90, 2 30 de mayo de 2007 /dev/mtd1crw-r----- 1 raíz raíz 90, 4 17 de julio de 2009 /dev/mtd2crw-r- ---- 1 raíz raíz 90, 6 30 de mayo de 2007 /dev/mtd3crwxrwxrwx 1 raíz raíz 90, 8 30 de mayo de 2007 /dev/mtd4crwxrwxrwx 1 raíz raíz 90, 10 30 de mayo de 2007 /dev/mtd5crwxrwxrwx 1 raíz raíz 90, mayo 30 20 07/dev /mtd6crwxrwxrwx 1 raíz raíz 90, 14 30 de mayo de 2007 /dev/mtd7crwxrwx 1 raíz raíz 90, 16 30 de mayo de 2007 /dev/mtd8crwxrwxrwx 1 raíz raíz 90, 18 30 de mayo de 2007 d9 # ls/dev /mtdblock?-l brw -r----- 1 raíz raíz 31, 0 30 de mayo de 2007 /dev/mtdblock0brw-r----- 1 raíz raíz 31, 1 30 de mayo de 2007 /dev/mtdblock1brw-r-- --- 1 raíz raíz 31, 2 30 de mayo de 2007 /dev/mtdblock1brw-r----- 1 raíz raíz 31, 2 30 de mayo de 2007 /dev/mtdblock2brw-r----- 1 raíz raíz 31, 3 de mayo 30 2007 /dev/mtdblock3brwxrwxrwx 1 raíz raíz 31, 4 30 de mayo de 2007 /dev/mtdblock4brwxrwxrwx 1 raíz raíz 31, 5 30 de mayo de 2007/dev/mtdblock5brwxrwxrwx 1 raíz raíz 31, 6 30 de mayo de 2007/de v/mtdblock6brwxrwxrwx 1 raíz raíz 31, 7 30 de mayo de 2007 /dev/ mtdblock7brwxrwxrwx 1 root root 31, 8 30 de mayo de 2007 /dev/mtdblock8brwxrwxrwx 1 root root 31, 9 30 de mayo de 2007 /dev/mtdblock9 Esto se define en /include/linux/mtd/ mtd device número.

h: # Entre ellos, el tamaño del dispositivo de bloque mtd se puede obtener viendo la información de la partición: # cat /proc/partitionsmajor minor #blocks name31 0 1024 mtdblock031 1 8192 mtdblock131 2 204800 mtdblock231 3 65536 mtdblock331 4 225280 mtdblock4 El dispositivo de bloque El tamaño que se muestra arriba es la cantidad del bloque, cada bloque es de 1 KB. Cada dispositivo de caracteres corresponde en realidad a uno de los dispositivos de bloque anteriores. Es decir, /dev/mtd0 corresponde a /dev/mtdblock0, y así sucesivamente. En otras palabras, algunas propiedades de mtdblockN también son propiedades de mtdN, como el tamaño. 4 Las operaciones de cada dispositivo de caracteres mtd, como el uso de nandwrite para escribir datos en /dev/mtd0, son en realidad operaciones de /dev/mtdblock0. Las compensaciones involucradas en estas operaciones se refieren a compensaciones dentro de la partición mtd. Por ejemplo, escribir datos en /dev/mtd1 en el desplazamiento 0 en realidad funciona en el desplazamiento físico desplazamiento = /dev/mtd0 tamaño = 1 MB = 0x100000.