Firmware is a relative of software, but unlike software, it is written as a low-level language and incorporated directly into a piece of hardware through the use of on-board memory, such as a ROM or flash memory. Firmware is different from software because it is essential to determine how a device operates. For example, when a hard drive receives a command from the higher levels, it needs to know what to do with that command. If that data is not available, then the hard drive will do nothing. This is different from software. A piece of software may be critical for accomplishing a specific task, but it is not critical to the operation of the PC's hardware.
Firmware is a layer of abstraction, but it is common to find situations where firmware does not work with higher layers of abstraction. For example, a TV remote control has firmware that determines what happens when you press a button, but most remote controls don't have an operating system capable of running specific applications or a kernel that decides how to load applications into the remote's memory.