Enhetsfil - Device file
I Unix-liknande operativsystem är en enhetsfil eller specialfil ett gränssnitt till en enhetsdrivrutin som visas i ett filsystem som om det vore en vanlig fil . Det finns också specialfiler i DOS , OS/2 och Windows . Dessa speciella filer tillåter ett program för att interagera med en enhet med hjälp av dess drivrutin via standard input / output systemanrop . Att använda standardsystemsamtal förenklar många programmeringsuppgifter och leder till konsekventa I/O-mekanismer för användarutrymme oavsett enhetens funktioner och funktioner.
Enhetsfiler ger vanligtvis enkla gränssnitt till standardenheter (t.ex. skrivare och seriella portar), men kan också användas för att komma åt specifika unika resurser på dessa enheter, till exempel diskpartitioner . Dessutom är enhetsfiler användbara för att få åtkomst till systemresurser som inte har någon koppling till någon faktisk enhet, till exempel datasänkor och slumptalsgeneratorer .
Det finns två allmänna typer av enhetsfiler i Unix-liknande operativsystem, kända som specialteckenfiler och blockera speciella filer . Skillnaden mellan dem ligger i hur mycket data som läses och skrivs av operativsystemet och hårdvaran. Dessa tillsammans kan kallas enhetsspecialfiler i motsats till namngivna rör , som inte är anslutna till en enhet men inte heller är vanliga filer.
MS-DOS lånade konceptet med specialfiler från Unix men bytte namn på dem till enheter . Eftersom tidiga versioner av MS-DOS inte stöder en katalog hierarki, har enheter skiljer sig från vanliga filer genom att göra deras namn reserverade ord , till exempel: den ökända CON. Dessa valdes för en viss kompatibilitet med CP/M och finns fortfarande i moderna Windows för bakåtkompatibilitet.
I vissa Unix-liknande system hanteras de flesta enhetsfiler som en del av ett virtuellt filsystem som traditionellt är monterat på /dev, möjligen associerat med en kontrollerande demon, som övervakar tillägg och borttagning av maskinvara vid körning, vilket gör motsvarande ändringar i enhetens filsystem om det görs inte automatiskt av kärnan, och möjligen påkallar manus i system- eller användarutrymme för att hantera speciella enhetsbehov. Den FreeBSD , DragonFly BSD och Darwin har en dedikerad filsystemet devfs ; enhetsnoder hanteras automatiskt av detta filsystem i kärnutrymmet . Linux brukade ha en liknande devfs -implementering , men det övergavs senare och togs sedan bort sedan version 2.6.17; Linux använder nu främst en implementering av användarutrymme som kallas udev , men det finns många varianter.
I Unix -system som stöder chroot -processisolering, till exempel Solaris -behållare , behöver vanligtvis varje chrootmiljö sin egen /dev; dessa monteringspunkter kommer att synas på värd -operativsystemet vid olika noder i det globala filsystemträdet. Genom att begränsa enhetsnoderna som är befolkade i chroot -instanser av /devkan maskinvaruisolering verkställas av chrootmiljön (ett program kan inte blanda sig med hårdvara som det varken kan se eller namnge - en ännu starkare form av åtkomstkontroll än Unix -filsystemtillstånd ).
MS-DOS-hanterad hårdvaruenhetskonflikt (se TSR ) genom att göra varje enhetsfil exklusiv öppen. Ett program som försöker komma åt en enhet som redan används skulle upptäcka att det inte går att öppna enhetsfilnoden. En mängd enhetsdrivrutinsemantik implementeras i Unix och Linux angående samtidig åtkomst .
Unix och Unix-liknande system
Enhetsnoder motsvarar resurser som ett operativsystems kärna redan har tilldelat. Unix identifierar dessa resurser med ett stort nummer och ett mindre nummer , båda lagrade som en del av strukturen hos en nod . Tilldelningen av dessa nummer sker unikt i olika operativsystem och på olika datorplattformar . Generellt identifierar huvudnumret enhetsdrivrutinen och det mindre numret identifierar en viss enhet (möjligen av många) som föraren kontrollerar: i detta fall kan systemet skicka det mindre numret till en förare. Men i närvaro av dynamisk nummerallokering är detta kanske inte fallet (t.ex. på FreeBSD 5 och senare).
Precis som med andra speciella filtyper har datorsystemet åtkomst till enhetsnoder med standardsystemsamtal och behandlar dem som vanliga datorfiler. Det finns två standardtyper av enhetsfiler; tyvärr är deras namn ganska kontraintuitiva av historiska skäl, och förklaringar till skillnaden mellan de två är ofta felaktiga som ett resultat.
Tecken enheter
Teckenspecialfiler eller tecken enheter ger obuffrade, direkt tillgång till maskinvara. De tillåter inte nödvändigtvis program att läsa eller skriva enskilda tecken åt gången; det är upp till enheten i fråga. Teckenutrustningen för en hårddisk, till exempel, kommer normalt att kräva att alla läsningar och skrivningar justeras för att blockera gränser och kommer säkert inte att tillåta läsning av en enda byte.
Teckenanordningar är ibland kända som råa enheter för att undvika förvirringen kring det faktum att en teckenanordning för en bit blockbaserad hårdvara vanligtvis kräver program för att läsa och skriva justerade block.
Blockera enheter
Blockera speciella filer eller blockera enheter ger buffrad åtkomst till hårdvaruenheter och ge lite abstraktion från deras specifika egenskaper. Till skillnad från teckenenheter, kommer blockenheter alltid att tillåta programmeraren att läsa eller skriva ett block av valfri storlek (inklusive enstaka tecken/byte) och alla justeringar. Nackdelen är att eftersom blockenheter är buffrade vet inte programmeraren hur lång tid det kommer att ta innan skriftlig data skickas från kärnans buffertar till den faktiska enheten, eller i vilken ordning två separata skriv kommer till den fysiska enheten. Om samma hårdvara exponerar både tecken- och blockenheter finns det dessutom risk för datakorruption på grund av att klienter som använder teckenenheten inte är medvetna om ändringar som gjorts i blockenhetens buffert.
De flesta system skapar både block- och karaktärsenheter för att representera hårdvara som hårddiskar. FreeBSD och Linux gör det särskilt inte; den förra har tagit bort stöd för blockenheter, medan den senare bara skapar blockenheter. I Linux, för att få en teckenenhet för en disk, måste man använda "raw" -drivrutinen, även om man kan få samma effekt som att öppna en teckenenhet genom att öppna blockenheten med den Linux-specifika O_DIRECTflaggan.
Pseudo-enheter
Enhetsnoder på Unix-liknande system behöver inte nödvändigtvis motsvara fysiska enheter . Noder som saknar denna korrespondens utgör gruppen av pseudo-enheter . De ger olika funktioner som hanteras av operativsystemet. Några av de mest använda (teckenbaserade) pseudo-enheterna inkluderar:
- /dev/null - accepterar och kasserar all ingång som skrivs till den; ger en filändelse när den läses från.
- /dev/zero - accepterar och kasserar all ingång som skrivs till den; producerar en kontinuerlig ström av nulltecken (byte med nollvärde) som utmatning vid läsning från.
- /dev/full- producerar en kontinuerlig ström av nulltecken (byte med nollvärde) som utmatning vid läsning från och genererar ett ENOSPC-fel ("disk full") vid försök att skriva till det.
- /dev/random - producerar byte som genereras av kärnans kryptografiskt säkra pseudoslumpgenerator . Dess exakta beteende varierar beroende på implementering, och ibland tillhandahålls ocksåvarianter som /dev /urandom eller /dev /arandom .
Dessutom kan BSD-specifika pseudo-enheter med ett ioctl- gränssnitt också innehålla:
- /dev/pf - tillåter användarlandsprocesser att styra PF via ett ioctl -gränssnitt.
- /dev /bio - ger ioctl -åtkomst till enheter som annars inte finns som /dev -noder, som används av bioctl för att implementera RAID -hantering i OpenBSD och NetBSD .
- /dev/sysmon - används av NetBSD: s envsys -ramverk för hårdvaruövervakning , åtkomlig i användarlandet via proplib (3) av envstat -verktyget.
Nodskapande
Noder skapas av mknod systemet samtalet . Kommandoradsprogrammet för att skapa noder kallas också mknod. Noder kan flyttas eller raderas med vanliga filsystemsystemsamtal ( byta namn , ta bort länk ) och kommandon ( mv , rm ).
Vissa Unix -versioner innehåller ett skript som heter makedev eller MAKEDEV för att skapa alla nödvändiga enheter i katalogen /dev. Det är bara meningsfullt på system vars enheter är statiskt tilldelade huvudnummer (t.ex. med hjälp av hårdkodning av det i sin kärnmodul).
Medan vissa andra Unix-system som FreeBSD använde endast kernelbaserad enhetsnodhantering via devfs och inte stödde manuell nodskapande. mknod (2) systemanrop och mknod (8) -kommando finns för att behålla kompatibilitet med POSIX, men manuellt skapade enhetsnoder utanför devfs fungerar inte alls.
Namnkonventioner
Följande prefix används för namnen på vissa enheter i /devhierarkin för att identifiera enhetstypen:
-
lp: linjeskrivare (jämför lp ) -
pt: pseudoterminaler (virtuella terminaler) -
tty: terminaler
Några ytterligare prefix har kommit till vanlig användning i vissa operativsystem:
-
fb: rambuffert -
fd: (plattform) disketter , även om samma förkortning också vanligtvis används för att referera till filbeskrivning -
hd: ( ”Klassiska”) IDE drivrutin (som tidigare använts för ATA -hårddisk , ATAPI optiska skivenheter , etc.)-
hda: master -enheten på den första ATA -kanalen (vanligtvis identifierad med major nummer 3 och mindre nummer 0) -
hdb: slavenheten på den första ATA -kanalen -
hdc: master -enheten på den andra ATA -kanalen -
hdd: slavenheten på den andra ATA -kanalen
-
-
parport,pp: parallellportar -
mem: Huvudminne (teckenenhet) -
NVMe förare
-
nvme0: första registrerade enhets enhetskontroller (teckenenhet) -
nvme0n1: första registrerade enhets första namnområde (blockenhet) -
nvme0n1p1: första registrerade enhets första namnutrymme första partition (blockenhet)
-
- MMC -drivrutin
-
SCSI -drivrutin, används också av libATA (modern PATA / SATA -drivrutin), USB , IEEE 1394 , etc.
-
sd: masslagringsdrivrutin (blockenhet)-
sda: första registrerade enheten -
sdb, sdc, etc.: andra, tredje, etc. registrerade enheter
-
-
ses: Kapslingsförare -
sg: generiskt SCSI -lager -
sr: "ROM" -drivrutin (dataorienterade optiska skivenheter; scd är bara ett sekundärt alias) -
st: Magnetband drivrutin
-
-
tty: terminaler-
ttyS: (plattform) seriell portdrivrutin -
ttyUSB: USB -serieomvandlare, modem, etc.
-
Den kanoniska listan över prefix som används i Linux finns i Linux Device List, det officiella registret över tilldelade enhetsnummer och /devkatalognoder för Linux -operativsystemet.
För de flesta enheter följs detta prefix av ett nummer som unikt identifierar den specifika enheten. För hårddiskar används en bokstav för att identifiera enheter och följs av ett nummer för att identifiera partitioner . Således kan ett filsystem "känna" till ett område på en disk som /dev/sda3till exempel eller "se" en nätverksansluten terminalsession som är associerad med /dev/pts/14.
På diskar som använder den vanliga PC -master -startposten är enhetsnumren för den primära och den utökade utökade partitionen numrerade 1 till 4, medan indexen för alla logiska partitioner är 5 och framåt, oavsett layouten för de tidigare partitionerna (deras förälder utökad partition behöver inte vara den fjärde partitionen på disken, inte heller behöver alla fyra primära partitionerna existera).
Enhetsnamn är vanligtvis inte bärbara mellan olika Unix-liknande systemvarianter, till exempel på vissa BSD- system heter IDE-enheterna /dev /wd0, /dev /wd1, etc.
devfs
devfs är en specifik implementering av ett enhetsfilsystem på Unix-liknande operativsystem, som används för att presentera enhetsfiler. Den bakomliggande implementeringsmekanismen kan variera beroende på operativsystem.
Att behålla dessa specialfiler på ett fysiskt implementerat filsystem (dvs hårddisk) är obekvämt, och eftersom det ändå behöver kärnhjälp uppstod tanken på ett logiskt specialsystem som inte är fysiskt lagrat.
Att definiera när enheter är redo att visas är inte heller helt trivialt. "Devfs" -metoden är för enhetsdrivrutinen att begära skapande och radering av "devfs" -poster relaterade till de enheter som den aktiverar och inaktiverar.
PC DOS, TOS, OS/2 och Windows
En enhetsfil är ett reserverat nyckelord som används i PC DOS , TOS , OS/2 och Windows -system för att ge åtkomst till vissa portar och enheter.
MS-DOS lånade konceptet med specialfiler från Unix men bytte namn på dem till enheter . Eftersom tidiga versioner av MS-DOS inte stöder en katalog hierarki, har enheter skiljer sig från vanliga filer genom att göra deras namn reserverade ord . Detta innebär att vissa filnamn var reserverade för enheter och inte bör användas för att namnge nya filer eller kataloger. De reserverade namnen själva valdes för att vara kompatibla med "specialfiler" hantering av PIPkommando i CP/M . Det fanns två typer av enheter i DOS: Block Devices (används för hårddiskar) och Character Devices (i allmänhet alla andra enheter, inklusive COM- och PRN -enheter).
DOS använder enhetsfiler för åtkomst till skrivare och portar. De flesta versioner av Windows innehåller också detta stöd, vilket kan orsaka förvirring när man försöker skapa filer och mappar med vissa namn, eftersom de inte kan ha dessa namn. Versioner 2.x av MS-DOS tillhandahåller parametern AVAILDEV CONFIG.SYS som, om de är inställda på FALSE, gör dessa specialnamn endast aktiva om de har prefix med \DEV\, vilket gör att vanliga filer kan skapas med dessa namn.
GEMDOS , den DOS-liknande delen av Atari TOS , stödde liknande enhetsnamn som DOS, men till skillnad från DOS krävdes det ett efterföljande ":" -tecken (på DOS, detta är valfritt) för att identifiera dem som enheter i motsats till vanliga filnamn (alltså " CON: "skulle fungera på både DOS och TOS, men" CON "skulle namnge en vanlig fil på TOS men konsolenheten på DOS). I MiNT och MagiC placerade en särskild UNIX-liknande enhetlig filsystemvy via enhetsbrevet "U:" också enhetsfiler i "U: \ DEV".
| Enhetsord | Använd som ingång | Använd som utgång |
|---|---|---|
| LURA | Tar emot skrivna data tills ^ Z (Ctrl-Z) trycks in. | Skriver ut data till konsolen. |
| PRN | Ej tillgängligt | Skriver ut text till skrivaren, vanligtvis omdirigeras till LPT1 eller LST . Ibland kan omkonfigureras till andra enheter. |
| AUX (ej i OS/2) | Läser data från en extra enhet, vanligtvis en seriell enhet som COM1 . Ibland kan omkonfigureras till andra enheter. | Skickar data till en hjälpenhet, vanligtvis en seriell enhet som COM1 . Ibland omkonfigurerbar till andra enheter. |
| NUL | Returnerar null eller ingen data. | Kasserar mottagen data. |
| CLOCK $ (heter fortfarande CLOCK i vissa versioner av MS-DOS 2.11) | Ej tillgängligt | Ej tillgängligt |
| KEYBD $ (endast i multitasking MS-DOS ) | ? | ? |
| KBD $ (endast i OS/2 ) | ? | ? |
| SKÄRM $ (endast i multitasking MS-DOS och OS/2) | ? | ? |
| POINTER $ (endast i OS/2) | ? | ? |
| MOUSE $ (endast i OS/2) | ? | ? |
| $ IDLE $ (endast i DR-DOS (sedan 5.0) och Multiuser DOS (sedan samtidiga DOS 386 ) -familjer) | Ej tillgängligt | Ej tillgängligt |
| CONFIG $ (endast i MS-DOS 7.0 och högre) | Ej tillgängligt | Ej tillgängligt |
| LST (endast i 86-DOS och DOS 1.x, även i Hewlett-Packards MS-DOS 2.11 för HP Portable Plus ) | Returnerar ingen data. | Skickar data till linjeskrivaren. (LPT2 för Hewlett-Packards MS-DOS 2.11) |
| PLT (endast i Hewlett-Packards MS-DOS 2.11 för HP Portable Plus ) | Returnerar ingen data. | Skickar data till den tilldelade plotteren . Den anslutna plotterenheten kan omkonfigureras. |
| LPT1 , LPT2 , LPT3 och ibland LPT4 (i DR-DOS 7.02 och högre och vissa versioner av Multiuser DOS) | Ej tillgängligt | Skickar data till den valda parallellporten. |
| COM1 , COM2 , COM3 , COM4 | Läser data från den valda serieporten. | Skickar data till den valda serieporten. |
| 82164A (endast i Hewlett-Packards MS-DOS 2.11 för HP Portable Plus ) | Omdirigerar till COM2. | Omdirigerar till COM2. |
Med hjälp av skalomdirigering och rör kan data skickas till eller tas emot från en enhet. Om du till exempel skriver följande skickas filen c:\data.txttill skrivaren:
TYPE c:\data.txt > PRN
PIPE, MAILSLOT och MUP är andra vanliga Windows -enheter.
IOCS
8-bitars operativsystem för Sharp pocket-datorer som PC-E500 , PC-E500S etc. består av en BASIC- tolk, ett DOS 2-liknande File Control System (FCS) som implementerar ett rudimentärt 12-bitars FAT- liknande filsystem och ett BIOS-liknande Input/Output Control System (IOCS) som implementerar ett antal standarddrivrutiner för tecken och block, samt speciella filenheter inklusive STDO:/SCRN: (display), STDI:/KYBD: (tangentbord), COM: ( seriell I/O), STDL:/PRN: (skrivare), CAS: (kassettband), E:/F:/G: (minnesfil), S1:/S2:/S3: (minneskort), X: /Y: (diskett), SYSTM: (system) och NIL: (funktion).
Implementeringar
| Operativ system | Filsystem eller hanteringsprogram | Standard monteringspunkt | Författare | Anteckningar |
|---|---|---|---|---|
| Linux 2.3.46pre5–2.6.17 | devfs och devfsd |
/dev
|
Richard Gooch | Implementerad helt i kärnan, med valfri daemon devfsd för att hantera enhetsnodhändelser i användarutrymme. Föråldrad - användare uppmuntras att migrera till udev och/eller devtmpfs . |
| Linux 2.5– | udev på alla fs, men vanligtvis tmpfs |
/dev
|
Greg Kroah-Hartman , Kay Sievers och Dan Stekloff | Implementerad till stor del i användarutrymme, enhet information samlas in från sysfs . Enhetsfiler kan lagras på ett konventionellt filsystem för allmänna ändamål eller i ett minnesfilsystem ( tmpfs ). |
| Linux 2.6.32– | devtmpfs med eller utan udev |
/dev
|
Kay Sievers , Jan Blunck, Greg Kroah-Hartman | En hybridkärna/användarutrymme för ett enhetsfilsystem för att tillhandahålla noder innan udev körs för första gången |
| Solaris | devfs |
/devices
|
Sun Microsystems | Presenteras med dynamiskt laddade drivrutiner i Solaris-2.1 |
| FreeBSD 2.0– | devfs |
/dev
|
Poul-Henning Kamp | Implementerad helt i kärnan. |
| DragonFly BSD 2.3.2– | devfs |
/dev
|
Alex Hornung | Implementerad helt i kärnan. |
| Mac OS | devfs |
/dev
|
Apple Inc. | Implementerad helt i kärnan. |
| HP-UX B.11.31 | devfs |
/dev
|
HP | Implementerad helt i kärnan. |
| Plan 9 |
#
|
Bell Labs | Implementerad i kärnan. | |
| RISC OS | DeviceFS |
Devices:
|
Acorn Computers | DeviceFS startades 1991 och visades först i RISC OS 3. Den hanterar flera enheter som speciella filer, oftast: Parallell, Serial, FastParallel och USB. SystemDevices -modulen implementerar pseudo -enheter som: Vdu, Kbd, Null och Printer. |
| MS-DOS , PC DOS , DR-DOS | FETT |
\DEV(och /DEV)
|
olika | Som implementerat i kärnan visas teckenenheter i den virtuella \ DEV -katalogen och i alla diskkataloger. Under MS-DOS/PC DOS 2.x kan CONFIG.SYS AVAILDEV = FALSE-direktivet användas för att tvinga enheter att existera endast i \ DEV. |
| MagiC , MiNT , MultiTOS |
U:\DEV
|
Applikationssystem Heidelberg, Eric R. Smith, Atari Corp. | Den speciella U: -enheten innehåller en virtuell DEV -katalog, i vilken man kan hitta enhetsfiler. | |
| Windows 9x |
\\devices\
|
Microsoft | ||
| Windows NT |
\Device
|
Microsoft | Den \Devicekatalogen är en del av Windows NT objektnamnutrymme.
|
|
| Windows NT Win32 delsystem |
\\.\
|
Microsoft | De \\.\prefix fabrikat som stöder API tillgång till Win32 enheten namespace i stället för Win32-filen namnrymden. Win32 -enhetsnamnen är symboliska länkar till enhetsnamn under Windows NT \Device-katalogen.
|
Se även
Referenser
Vidare läsning
- Philip Streck (2002-09-24). "devfs för förvaltning och administration" . Linux Journal .
- Daniel Robbins (2001-10-01). "Del 4: Introduktion till devfs" . Vanliga trådar: Avancerad filsystems implementeringsguide . IBM.
- Daniel Robbins (2001-10-01). "Del 5: Konfigurera devfs" . Vanliga trådar: Avancerad filsystems implementeringsguide . IBM.
- Daniel Robbins (2001-10-01). "Del 6: Implementering av devfs (med init -omslaget)" . Vanliga trådar: Avancerad filsystems implementeringsguide . IBM.
- Doug Gilbert (2001-01-22). "DEVFS och SCSI" .
- "3.3. Enhetsnamn i devfs" . Delsystemet Linux 2.4 SCSI HOWTO: Kapitel 3. Namn och adresser . Linux dokumentationsprojekt .
- "Systemguide för enhetsfil" . Gentoo Linux -dokumentation . Gentoo Foundation, Inc. Arkiverat från originalet 2008-05-21 . Hämtad 2008-06-19 .
- Mark Ellis (2003-09-23). "Hur man använder kärnmodulen för autoladdning med devfs och devfsd" . Linux From Scratch Hints .
- Martial Daumas (2003-09-18). "Hur man skapar ett grundläggande mk_initrd -kommando som fungerar bra med LFS och devfs" . Linux From Scratch Hints .
- Jeroen Coumans (2003-04-19). "Så här konfigurerar du devfs med din nuvarande LFS-konfiguration med devfsd. Hur du kan använda devfs från början" . Linux From Scratch Hints .
- Tushar Teredesai (2003-03-05). "Använda devfs och devfsd" . Linux From Scratch Hints .