En los sistemas operativos tipo Unix , un archivo de dispositivo , un nodo de dispositivo o un archivo especial es una interfaz con un controlador de dispositivo que aparece en un sistema de archivos como si fuera un archivo normal . También hay archivos especiales en DOS , OS/2 y Windows . Estos archivos especiales permiten que un programa de aplicación interactúe con un dispositivo mediante el uso de su controlador de dispositivo a través de llamadas estándar del sistema de entrada/salida . El uso de llamadas estándar del sistema simplifica muchas tareas de programación y conduce a mecanismos de E/S de espacio de usuario consistentes independientemente de las características y funciones del dispositivo.
Los archivos de dispositivo suelen proporcionar interfaces simples para dispositivos estándar (como impresoras y puertos seriales), pero también se pueden utilizar para acceder a recursos únicos específicos en esos dispositivos, como particiones de disco . Además, los archivos de dispositivo son útiles para acceder a recursos del sistema que no tienen conexión con ningún dispositivo real, como receptores de datos y generadores de números aleatorios .
Existen dos tipos generales de archivos de dispositivo en los sistemas operativos tipo Unix, conocidos como archivos especiales de caracteres y archivos especiales de bloques . La diferencia entre ellos radica en la cantidad de datos que el sistema operativo y el hardware leen y escriben. En conjunto, estos archivos se pueden llamar archivos especiales de dispositivo , a diferencia de las canalizaciones con nombre , que no están conectadas a un dispositivo, pero tampoco son archivos comunes.
MS-DOS tomó prestado el concepto de archivos especiales de Unix, pero los renombró como dispositivos . [1] Debido a que las primeras versiones de MS-DOS no admitían una jerarquía de directorios , los dispositivos se distinguían de los archivos normales haciendo que sus nombres fueran palabras reservadas que no se pueden usar como nombres de carpetas o archivos; por ejemplo: la palabra CON
es una palabra reservada. Estas se eligieron por un grado de compatibilidad con CP/M y todavía están presentes en Windows moderno por compatibilidad con versiones anteriores. Los nombres no distinguen entre mayúsculas y minúsculas, por lo que "con", "Con" y "CON" son todos nombres inválidos.
En Windows XP , al escribir "Con" en el comando Ejecutar, aparece el mensaje de error "Este archivo no tiene un programa asociado para realizar esta acción. Cree una asociación en el panel de control Opciones de carpeta". Si se intenta cambiar el nombre de un archivo o una carpeta con un nombre reservado, el objeto vuelve a su nombre anterior (o "Nueva carpeta", "Nuevo documento de texto", etc.), sin que aparezca ninguna notificación ni mensaje de error. [2] En Windows Vista y versiones posteriores, si se intenta utilizar un nombre reservado para un archivo o una carpeta, aparece un mensaje de error que dice "El nombre de dispositivo especificado no es válido". [2]
En algunos sistemas tipo Unix, la mayoría de los archivos de dispositivos se administran como parte de un sistema de archivos virtual tradicionalmente montado en /dev
, posiblemente asociado con un demonio controlador, que monitorea la adición y eliminación de hardware en tiempo de ejecución, haciendo los cambios correspondientes en el sistema de archivos del dispositivo si eso no lo hace automáticamente el núcleo, y posiblemente invocando scripts en el sistema o en el espacio del usuario para manejar necesidades especiales del dispositivo. FreeBSD , DragonFly BSD y Darwin tienen un sistema de archivos dedicado devfs ; los nodos de dispositivos son administrados automáticamente por este sistema de archivos, en el espacio del núcleo . Linux solía tener una implementación devfs similar , pero fue abandonada más tarde y luego eliminada desde la versión 2.6.17; [3] Linux ahora usa principalmente una implementación de espacio de usuario conocida como udev , pero hay muchas variantes.
En los sistemas Unix que admiten el aislamiento de procesos chroot , como Solaris Containers , normalmente cada entorno chroot necesita su propio /dev
; estos puntos de montaje serán visibles en el sistema operativo host en varios nodos del árbol del sistema de archivos global. Al restringir los nodos de dispositivos que se llenan en instancias chroot de /dev
, el entorno chroot puede aplicar el aislamiento de hardware (un programa no puede interferir con hardware que no puede ver ni nombrar, una forma aún más fuerte de control de acceso que los permisos del sistema de archivos Unix ).
MS-DOS administraba la contención de dispositivos de hardware (consulte el programa residente que termina y permanece ) haciendo que cada archivo de dispositivo sea de apertura exclusiva. Una aplicación que intente acceder a un dispositivo que ya está en uso descubriría que no puede abrir el nodo del archivo de dispositivo. En Unix y Linux se implementan diversas semánticas de controladores de dispositivos en relación con el acceso simultáneo . [4]
Los nodos de dispositivo corresponden a recursos que el núcleo de un sistema operativo ya ha asignado. Unix identifica esos recursos mediante un número mayor y un número menor , [5] ambos almacenados como parte de la estructura de un nodo . La asignación de estos números ocurre de manera única en diferentes sistemas operativos y en diferentes plataformas informáticas . Generalmente, el número mayor identifica al controlador del dispositivo y el número menor identifica un dispositivo particular (posiblemente de muchos) que el controlador controla: [6] en este caso, el sistema puede pasar el número menor a un controlador. Sin embargo, en presencia de una asignación de números dinámica, este puede no ser el caso (por ejemplo, en FreeBSD 5 y posteriores).
Al igual que con otros tipos de archivos especiales, el sistema informático accede a los nodos de dispositivos mediante llamadas de sistema estándar y los trata como archivos de computadora normales. Existen dos tipos estándar de archivos de dispositivos; lamentablemente, sus nombres son bastante contraintuitivos por razones históricas y, como resultado, las explicaciones de la diferencia entre ambos suelen ser incorrectas.
Los archivos especiales de caracteres o dispositivos de caracteres proporcionan acceso directo y sin búfer al dispositivo de hardware. No necesariamente permiten que los programas lean o escriban caracteres individuales a la vez; eso depende del dispositivo en cuestión. El dispositivo de caracteres de un disco duro, por ejemplo, normalmente requerirá que todas las lecturas y escrituras estén alineadas con los límites de los bloques y, con toda seguridad, no permitirá leer un solo byte.
A los dispositivos de caracteres a veces se los conoce como dispositivos sin procesar para evitar la confusión que rodea el hecho de que un dispositivo de caracteres para una pieza de hardware basado en bloques normalmente requerirá programas para leer y escribir bloques alineados.
Los archivos especiales de bloque o dispositivos de bloque proporcionan acceso en búfer a dispositivos de hardware y brindan cierta abstracción de sus especificaciones. [7] A diferencia de los dispositivos de caracteres, los dispositivos de bloque siempre permitirán al programador leer o escribir un bloque de cualquier tamaño (incluidos caracteres/bytes individuales) y cualquier alineación. La desventaja es que, debido a que los dispositivos de bloque están en búfer, el programador no sabe cuánto tiempo tomará antes de que los datos escritos pasen de los búferes del núcleo al dispositivo real, o incluso en qué orden llegarán dos escrituras separadas al dispositivo físico. Además, si el mismo hardware expone dispositivos de caracteres y de bloque, existe el riesgo de corrupción de datos debido a que los clientes que usan el dispositivo de caracteres no son conscientes de los cambios realizados en los búferes del dispositivo de bloque.
La mayoría de los sistemas crean dispositivos de bloques y de caracteres para representar hardware como discos duros. FreeBSD y Linux no lo hacen; el primero ha eliminado la compatibilidad con dispositivos de bloques, [8] mientras que el segundo crea únicamente dispositivos de bloques. Para obtener el efecto de un dispositivo de caracteres a partir de un dispositivo de bloques en Linux, se debe abrir el dispositivo con el indicador O_DIRECT específico de Linux .
Los nodos de dispositivos en sistemas tipo Unix no necesariamente tienen que corresponderse con dispositivos físicos . Los nodos que carecen de esta correspondencia se denominan pseudodispositivos . Proporcionan diversas funciones manejadas por el sistema operativo. Algunos de los pseudodispositivos más utilizados (basados en caracteres) incluyen:
Además, los pseudodispositivos específicos de BSD con una interfaz ioctl también pueden incluir:
Los nodos se crean mediante la llamada al sistema mknod . El programa de línea de comandos para crear nodos también se llama mknod . Los nodos se pueden mover o eliminar mediante las llamadas al sistema de archivos habituales ( renombrar , desenlazar ) y los comandos ( mv , rm ).
Algunas versiones de Unix incluyen un script llamado makedev o MAKEDEV para crear todos los dispositivos necesarios en el directorio /dev . Esto solo tiene sentido en sistemas cuyos dispositivos tienen asignados números mayores de forma estática (por ejemplo, mediante codificación fija en su módulo del núcleo).
Algunos otros sistemas Unix como FreeBSD utilizan la gestión de nodos de dispositivos basada en kernel únicamente a través de devfs y no admiten la creación manual de nodos. La llamada al sistema mknod(2) y el comando mknod(8) existen para mantener la compatibilidad con POSIX, pero los nodos de dispositivos creados manualmente fuera de devfs no funcionarán en absoluto. [10]
Los siguientes prefijos se utilizan para los nombres de algunos dispositivos en la jerarquía /dev , para identificar el tipo de dispositivo:
Algunos prefijos adicionales se han vuelto de uso común en algunos sistemas operativos:
La lista canónica de los prefijos utilizados en Linux se puede encontrar en la Lista de dispositivos de Linux , el registro oficial de números de dispositivos asignados y nodos de directorio /dev para el sistema operativo Linux. [11]
En la mayoría de los dispositivos, este prefijo va seguido de un número que identifica de forma única el dispositivo en cuestión. En el caso de los discos duros, se utiliza una letra para identificar los dispositivos y va seguida de un número para identificar las particiones . Por lo tanto, un sistema de archivos puede "conocer" un área de un disco como /dev/sda3 , por ejemplo, o "ver" una sesión de terminal en red como asociada con /dev/pts/14 .
En los discos que utilizan el registro de arranque maestro de PC típico , los números de dispositivo de la partición primaria y la partición extendida opcional están numerados del 1 al 4, mientras que los índices de cualquier partición lógica son del 5 en adelante, independientemente del diseño de las particiones anteriores (su partición extendida principal no necesita ser la cuarta partición en el disco, ni tienen que existir las cuatro particiones primarias).
Los nombres de los dispositivos normalmente no son portables entre diferentes variantes de sistemas tipo Unix, por ejemplo, en algunos sistemas BSD , los dispositivos IDE se denominan /dev/wd0 , /dev/wd1 , etc.
devfs es una implementación específica de un sistema de archivos de dispositivos en sistemas operativos tipo Unix, que se utiliza para presentar archivos de dispositivos. El mecanismo subyacente de implementación puede variar según el sistema operativo.
Mantener estos archivos especiales en un sistema de archivos implementado físicamente, como un disco duro, es inconveniente y, como de todos modos necesita la asistencia del núcleo, surgió la idea de un sistema de archivos lógico de propósito especial que no se almacena físicamente.
Definir cuándo los dispositivos están listos para aparecer no es trivial. El enfoque de devfs es que el controlador del dispositivo solicite la creación y eliminación de entradas de devfs relacionadas con los dispositivos que habilita y deshabilita.
Un archivo de dispositivo es una palabra clave reservada utilizada en los sistemas PC DOS , TOS , OS/2 y Windows para permitir el acceso a ciertos puertos y dispositivos.
MS-DOS tomó prestado el concepto de archivos especiales de Unix pero los renombró como dispositivos . [1] Debido a que las primeras versiones de MS-DOS no soportaban una jerarquía de directorios , los dispositivos se distinguían de los archivos regulares haciendo que sus nombres fueran palabras reservadas . Esto significa que ciertos nombres de archivo estaban reservados para dispositivos y no debían usarse para nombrar nuevos archivos o directorios. [12]
Los nombres reservados en sí mismos fueron elegidos para ser compatibles con el manejo de PIP
comandos de "archivos especiales" en CP/M . Había dos tipos de dispositivos en DOS: dispositivos de bloque (usados para unidades de disco) y dispositivos de caracteres (generalmente todos los demás dispositivos, incluidos los dispositivos COM y PRN). [13]
DOS utiliza archivos de dispositivo para acceder a impresoras y puertos. La mayoría de las versiones de Windows también contienen este soporte, lo que puede causar confusión al intentar crear archivos y carpetas con ciertos nombres, ya que no pueden tener estos nombres. [14] Las versiones 2.x de MS-DOS proporcionan el parámetro AVAILDEV
CONFIG.SYSFALSE
que, si se establece en , hace que estos nombres especiales solo estén activos si tienen como prefijo \DEV\
, lo que permite crear archivos comunes con estos nombres. [15]
GEMDOS , la parte similar a DOS de Atari TOS , admitía nombres de dispositivos similares a DOS, pero a diferencia de DOS requería un carácter ":" final (en DOS, esto es opcional) para identificarlos como dispositivos en lugar de nombres de archivos normales (por lo tanto, "CON:" funcionaría tanto en DOS como en TOS, pero "CON" nombraría un archivo normal en TOS pero el dispositivo de consola en DOS). En MiNT y MagiC , una vista especial del sistema de archivos unificado similar a UNIX a la que se accedía a través de la letra de unidad "U:" también colocaba los archivos de dispositivo en "U:\DEV".
Mediante la redirección de shell y las tuberías, se pueden enviar o recibir datos de un dispositivo. Por ejemplo, si escribe lo siguiente, se enviará el archivo c:\data.txt
a la impresora:
TIPO c:\data.txt > PRN
PIPE, MAILSLOT y MUP son otros dispositivos estándar de Windows. [21]
El sistema operativo de 8 bits de los ordenadores de bolsillo Sharp como el PC-E500 , PC-E500S , etc. consta de un intérprete BASIC , un sistema de control de archivos (FCS) similar al DOS 2 que implementa un sistema de archivos rudimentario de 12 bits similar al FAT , y un sistema de control de entrada/salida (IOCS) similar al BIOS que implementa una serie de controladores de dispositivos de bloques y caracteres estándar, así como dispositivos de archivos especiales, incluidos STDO:/SCRN: (pantalla), STDI:/KYBD: (teclado), COM: (E/S serie), STDL:/PRN: (impresora), CAS: (cinta de casete), E:/F:/G: (archivo de memoria), S1:/S2:/S3: (tarjeta de memoria), X:/Y: (disquete), SYSTM: (sistema) y NIL: (función). [22]
El siguiente paso más allá de un dispositivo abierto individualmente es permitir que un solo usuario abra un dispositivo en varios procesos, pero permitir que solo un usuario tenga el dispositivo abierto a la vez.
proporciona una gestión configurable de los nodos de dispositivos mediante el sistema de archivos de dispositivos de Linux.