Tietojenkäsittelyssä laiteohjelmalla tarkoitetaan tietokoneohjelmaa, joka on "upotettu" laitteistoon ja joka on olennainen osa laitteistoa. Sitä kutsutaan joskus myös sulautetuksi ohjelmistoksi. Esimerkkinä on mikrokontrolleri, mikroprosessorin osa, joka kertoo mikroprosessorille, mitä toimia se tekee. Se voi olla myös laajempi ohjelma, joka on tallennettu flash-muistiin tai jonka käyttäjä lataa olemassa olevaan laitteistoon.
Nimensä mukaisesti laiteohjelmisto on laitteiston ja ohjelmiston välissä ja yhdistää nämä kaksi maailmaa. Se voi merkitä eri ihmisille hieman eri asioita, varsinkin kun itsenäisistä elektronisista laitteista on tullut yhä enemmän tietokoneiden kaltaisia. Ohjelmiston tavoin se on tietokoneohjelma, jota mikroprosessori ajaa. Se on kuitenkin myös sidoksissa laitteistoon, eikä sillä ole merkitystä ilman sitä.
Mitä laiteohjelmisto tekee?
Laiteohjelmiston tehtävä on hallita ja ohjata laitteiston toimintoja sekä tarjota rajapinta korkeampitasoisille ohjelmistoille. Käytännössä se voi:
- käynnistää laitteiston (boot-prosessi) ja alustaa komponentit (esim. muisti, I/O, verkkoliitännät),
- tarjota laiteajureita ja laitteiston hallintafunktioita,
- hoitaa reaaliaikaiset tehtävät, aikataulutuksen ja virheenkäsittelyn sulautetuissa järjestelmissä,
- muuttaa tai päivittää laitteen ominaisuuksia ilman fyysistä muutosta, ja
- turvata laitteiston toiminta (esim. salaukset, todennus, päivitysten allekirjoitus).
Missä laiteohjelmisto sijaitsee ja miten se tallennetaan?
Laiteohjelmisto voi olla tallennettuna eri tavalla riippuen laitteesta ja käyttötarkoituksesta. Yleisiä tallennusmuotoja:
- Mask ROM / PROM: pysyvä, valmistusvaiheessa ohjelmoitu; käytettiin aikaisemmin yksinkertaisissa piireissä.
- EEPROM / Flash-muisti: uudelleenkirjoitettava muisti, yleisin moderni tallennus; mahdollistaa päivitykset.
- Erilliset säilytystiedostot tai partitiot: esim. PC:n BIOS/UEFI-laiteohjelmisto tallennetaan emolevyn flash-piiriin.
Joissain laitteissa, kuten FPGA:issa, laiteohjelmisto voi tarkoittaa konfiguraatiobittivirtaa (bitstream), joka ladataan käynnistyksen yhteydessä.
Päivitykset, bootloader ja palautus
Laiteohjelmiston päivittäminen (firmware update / flashing) voi lisätä ominaisuuksia, korjata virheitä tai paikkaa tietoturva-aukkoja. Päivitysprosessissa on usein mukana bootloader, pieni ohjelma, joka mahdollistaa uuden laiteohjelmiston vastaanoton ja kirjoittamisen muistiin turvallisesti. Päivitystapoja ovat mm. USB-, sarjaliikenne-, TFTP-, tai verkon yli tapahtuvat (OTA, over-the-air) päivitykset.
Päivityksiin liittyy riskejä: keskeytetty päivitys tai viallinen kuva voi "brickata" laitteen eli tehdä siitä käyttökelvottoman. Siksi monissa laitteissa on palautusmoodi, kaksi erillistä firmware-partitiota (A/B) tai varmentaminen allekirjoitetuilla päivityksillä.
Erot laiteohjelmiston ja muun ohjelmiston välillä
Vaikka laiteohjelmisto on ohjelmistoa, se eroaa tyypillisestä sovellusohjelmistosta muun muassa seuraavasti:
- Se on tiiviisti sidottu laitteistoon ja usein reaaliaikaiseen toimintaan.
- Se suoritetaan suoraan käytetyllä laitteistolla ilman erillistä käyttöjärjestelmää (vaikka joskus se tarjoaakin yksinkertaisen RTOS-ympäristön).
- Päivitykset ja virheiden käsittely ovat usein riskialttiimpia; virhe voi vaikuttaa laitteiston perustoimintoihin.
- Turvallisuusvaatimukset voivat olla tiukempia, erityisesti teollisuudessa, autoteollisuudessa ja lääketieteessä.
Turvallisuus ja haavoittuvuudet
Laiteohjelmisto on yleinen hyökkäyskohde, koska se toimii lähellä laitteistoa ja sillä on usein korkeat oikeudet. Hyvä käytäntö sisältää:
- päivitysten allekirjoituksen ja allekirjoituksen tarkistuksen ennen asennusta,
- salaus ja todennus kriittisissä järjestelmissä,
- mahdollisuus palauttaa aikaisempi toimiva tila (rollback-suojat huomioiden), ja
- validoidut päivitysprosessit sekä toimitusketjun turvallisuus (supply chain security).
Esimerkkejä laiteohjelmiston haavoittuvuuksista ovat etäkäytön mahdollistavat bugit reitittimissä, matkapuhelinten baseband-haavoittuvuudet ja kovalevyjen firmware-ongelmat, jotka voivat johtaa datan menetykseen tai laitteen haltuunottoon.
Laiteohjelmiston kehitys ja debuggaus
Laiteohjelmisto kehitetään usein sulautettujen järjestelmien ohjelmointikielillä (C/C++), ja se käännetään kohdealustalle cross-kompilaattorilla. Debuggaus tapahtuu usein JTAG- tai SWD-liitännän kautta, ja käytössä on emulaattoreita, logitietoja sekä laitteistotestit. Monimutkaisemmissa järjestelmissä käytetään testiautomaatioita ja verifikaatiomenetelmiä (esim. staattinen analyysi, yksikkötestit).
Avoin vs. suljettu laiteohjelmisto
On olemassa sekä avoimen lähdekoodin että suljettuja firmware-projekteja. Avoimet projektit, kuten Coreboot (emolevyjen firmware) ja OpenWrt (reitittimet), antavat käyttäjille mahdollisuuden auditointiin ja räätälöintiin. Suljetussa firmwaressä valmistaja hallinnoi koodia ja päivityksiä, mikä voi tarjota tuen ja takuun mutta rajoittaa läpinäkyvyyttä.
Parhaat käytännöt käyttäjälle
- Tarkista valmistajan päivitykset säännöllisesti — tärkeät tietoturvapäivitykset julkaistaan usein.
- Käytä vain virallisia tai allekirjoitettuja firmware-päivityksiä.
- Älä keskeytä päivitystä (älä sammuta laitetta tai poista virtaa päivityksen aikana).
- Ota varmuuskopio verkkolaitteiden asetuksista ennen päivitystä, jos mahdollista.
- Harkitse A/B-päivitysjärjestelmää tai vaihtoehtoista palautusmenetelmää kriittisissä laitteissa.
Laiteohjelmisto on siis keskeinen osa moderneja laitteita: se yhdistää laitteiston ja ohjelmiston, mahdollistaa laitteiden päivittämisen ja optimoinnin, mutta vaatii huolellista suunnittelua ja turvallisuustoimia, jotta laite pysyy luotettavana ja suojattuna.