All hardware, whether concrete (video card) or abstract (virtual terminal) are managed by a device driver. A device driver simply tells the kernel what the device can do and provides the interface (often through function calls and ioctls) to do it with. The driver provides the means to communicate with the hardware.
Now how do we communicate with the driver? Typically through device files. A device file is simply a special file, usually residing in /dev, with two numbers associated with it, called the major and minor numbers. Also, there are two types of device files: character and block. Character device files are interfaces to character device drivers and block device files are interfaces to block device drivers. You can think of of a char driver as a driver to hardware that you can only read forward with (like a modem) and a block driver as a driver that you can move forward and backward with (like a hard drive). Here are two device files from my system:
brw-rw---- 1 root disk 3, 1 Oct 16 05:48 hda1 crw-rw---- 1 root dialout 4, 67 Jul 5 2000 ttyS3
So for example, if we wanted to write "hello world" to a modem, it can more or less be thought of as:
char *msg = "hello world"; int FileDescriptor FileDescriptor = open("/dev/modem", O_RDWR); write(FileDescriptor, msg, strlen(hello world)); close(FileDescriptor);
You can make your own device files using the mknod command.