Tradicionalmente, o firmware é o código da CPU que reside em uma ROM não modificável que é necessária para que um dispositivo de hardware inicialize e carregue um sistema operacional ou um binário (software) de sua escolha. Às vezes, nenhuma escolha de um binário é dada e uma anexada ao firmware da parte de inicialização é usada.
Todas as CPUs têm o problema clássico de que, uma vez que buscam instruções de memória, algum tipo de memória pré-programada deve existir em um endereço fixo quando a CPU é inicializada, para que possa fazer algo automaticamente na inicialização. Firmware existe para este propósito. Alguns firmware também tem código que os programas posteriores podem usar para serviços. O firmware do BIOS expõe muitas funções usadas pelo DOS para entrada e saída básicas (daí porque o BIOS significa Basic Input Output System).
A distinção não é totalmente clara. Algumas (mais) placas WLAN requerem que o firmware seja carregado antes de começar a funcionar. No entanto, normalmente há um pequeno firmware no dispositivo cujo trabalho é não fazer nada além de aceitar um "firmware" principal através do barramento USB quando o dispositivo é iniciado pelo sistema operacional e entregar o controle quando ele é carregado. A maioria das pessoas diria que tudo é firmware.
Como a EEPROM e a memória flash se tornaram mais comuns, o firmware geralmente não reside mais em uma ROM não gravável, mas na memória flash e pode ser modificado. A distinção entre firmware e software está embaçada hoje com o advento da memória flash. No entanto, uma coisa não mudou ao longo dos anos e as CPUs ainda são CPUs e exigem que algum código, ou firmware, seja visível na inicialização para, assim, iniciar.
As CPUs estão em mais dispositivos do que nunca, portanto, desenvolver e permitir que o firmware seja atualizado no caso de bugs é um grande negócio agora e muitos dispositivos de hardware com uma CPU possuem interfaces de atualização de firmware, às vezes não documentadas.
Um firmware pode ser usado para carregar um sistema operacional. Ele pode conter um gerenciador de inicialização ou código que carregue um carregador de inicialização. É possível armazenar uma imagem do sistema operacional no mesmo local do firmware e deixar que o código de tempo de inicialização do firmware carregue o sistema operacional (os telefones celulares fazem isso). As BIOS do PC, como regra, não incluem os carregadores de inicialização. O U-boot (não para PCs) é um exemplo de um firmware "ciente de sistema de arquivos" que carrega diretamente um sistema operacional.
FIrmwares geralmente não possuem todos os recursos de um sistema operacional completo devido ao princípio de que o mais simples é mais confiável. Os firmwares mais simples simplesmente inicializam um mínimo de hardware, carregam um setor ou bloqueiam um dispositivo de armazenamento e executam a execução nele. Isso é simples de programar e, portanto, fácil de verificar como livre de erros. Bugs no firmware do tempo de inicialização podem significar um desastre para um dispositivo.