File descriptors are an index into a file-descriptor table stored by the kernel. The kernel creates a file-descriptor in response to an open call and associates the file-descriptor with some abstraction of an underlying file-like object; be that an actual hardware device, or a file-system or something else entirely.
The value returned by an open call is termed a file descriptor and is essentially an index into an array of open files kept by the kernel.
In short, the file-descriptor is the gateway into the kernel's abstractions of underlying hardware.
1)Devices register with the kernel that gives them a file.
2)Opening a file associates a file descriptor with the associated device.
3)Further references to the file descriptor are routed to the device.