Sunteți pe pagina 1din 9

Unelte de dezvoltare pentru un sistem de operare sigur in IoT

1. Introducere
Internet of Things (IoT), sau Internetul lucrurilor daca facem traducerea in romana, face
referire la absolut toate dispozitivele din lume care sunt conectate la internet. Cu ajutorul acestor
dispozitive se pot automatiza diferite procese cu usurinta si de asemenea se pot colecta date ce
pot fi ulterior analizate, pe baza carora se pot lua decizii viitoare. O parte dintre dispozitivele ce
fac parte din aceasta categorie sunt microcontrolere low-power, care beneficiaza de o cantitate
redusa de resurse din puct de vedere hardware. Majoritatea sistemelor de operare existente pe
piata pentru aceste tipuri de dispozitive au fost dezvoltate cu scopul final de a fi functionale, iar
acest lucru a condus la omiterea unor detalii foarte importante, cum ar fi concurenta, alocarea
dinamica de memorie, sau izolarea memoriei. Din cauza modului in care au fost concepute,
acestea nu au luat in considerare niciodata faptul ca aceste dispozitive sunt foarte predispuse la
atacuri din exterior, ce pot face vulnerabile toata dispozitivele utilizatorului.

2. Tehnologii folosite
2.1. TockOS
TockOS, dedicat microcontrolerelor, este unul dintre primele sisteme de operare ce are ca
principal scop imbunatatirea securitatii dispozitivelor pe care acesta ruleaza. Desi acest
sistem de operare ofera numeroare facilitati, se afla inca intr-o faza incipienta, motiv pentru
care nu exista un set de aplicatii ce pot ajuta la dezvoltarea facila si rapida de aplicatii. Unul
dintre factorii care ingreuneaza dezvoltarea aplicatiilor il reprezinta faptul ca initializarea
capsulelor este foarte dificila si anevoioasa, fiind necesare cunostinte superioare de hardware.
Pentru a veni in sprijinul dezvoltarii unui mediu cat mai facil de utilizat, ne-am propus sa
realizam un “device tree” si un sistem de unelte ce ajuta la generarea fisierului de initializare
a capsulelor si un plugin de Visual Studio Code ce faciliteaza compilarea sistemului de
operare si incarcarea acestuia pe dispozitiv.
TockOS este dezvoltat de o comunitate din care fac parte si: Universitatea Stanford,
Universitatea Princeton, Google, etc. Principalul avantaj al acestuia este faptul ca imbina
mecanismele limitate de securitate de tip hardware disponibile pe aceste dispozitive
constranse si de asemenea, adauga unele noi de tip software fiind dezvoltat in limbajul Rust,
care este sigur din punct de vedere al tipurilor de date (type-safety). Acest limbaj se imparte
in 2 categorii care sunt caracterizate chiar de denumirea lor, mai exact Safe Rust si Unsafe
Rust.
Dupa cum se poate observa in imaginea de mai jos (Fig. 1), delimitarea este destul de
clara intre zonele ce sunt trusted si zonele ce sunt untrusted. In zonele trusted se afla nucleul,
driverele si abstractizarile hardware, aici compilatorul de rust ii permite dezvoltatorului sa
foloseasca anumite functii ale limbajului care in mod normal ar putea duce la posibile
probleme de securitate sau de functionalitate corecta a dispozitivului, insa care sunt necesare
pentru a crea driverele si abstractizarile hardware, necesare nivelurilor superioare. La polul
opus se afla zonele untrusted, unde compilatorul nu mai face nici un compromis, astfel
eliminand din ecuatie posibilele erori ce apar in dezvoltare, acesta fiind foarte strict si riguros
in momentul in care compileaza codul. Aceasta caracteristica a sistemului reuseste sa
diminueze vulnerabilitatile de tip buffer-overflow ce pot aparea in interiorul programelor si
poate pastra siguranta tipurilor fara a fi nevoie de un Runtime Garbage Collector pentru a
gestiona memoria. Pe langa aceste avantaje, Rust mai vine la pachet si cu protectia memoriei
cat si o gestiune eficienta a acesteia pentru aplicatii scrise in orice alt limbaj.

Fig. 1
TockOS poate fi vazut ca o combinatie intre un RTOS si un sistem de operare normal.
Acesta dispune atat de un spatiu al nucleului (kernel space), cat si de spatiu al utilizatorului
(user space), acestea fiind independente, si comunicand prin intermediul a patru apeluri de
sistem: Yield (suspenda un proces pana cand un callback este apelat), Subscribe
(inregistreaza un callback pentru un proces), Allow (permite nucleului accesul in memoria
unui proces), Command (apeleaza o anumita functie dintr-un driver) si Memop (modifica
memoria unui proces).
Toate apelurile de sistem, exceptand Yield, sunt apeluri non-blocante, astfel un apel ce ar
putea avea nevoie de un timp mare de executie, cum ar fi trimiterea unui mesaj pe UART,
returneaza imediat un raspuns si invoca un callback in momentul in care isi termina executia.
Kernelul, driverele, abstractizarile hardware si capsulele sunt scrise in Rust, si nu permit
utilizarea memoriei in alt mod fata de cel dorit de dezvoltator. In cazul userspace-ului,
aplicatiile nu mai sunt dependente de limbajul Rust, acestea putand fi scrise in orice alt
limbaj, alegerea ramanand la latitudinea programatorului. Desi ofera o mare flexibilitate,
TockOS ramane in continuare sigur, deoarece tot ce se afla in kernelspace are abilitatea de a
se proteja impotriva actiunilor ce pot duce la compromiterea sistemului.
2.2. Microsoft Visual Studio Code
Visual Studio Code este un editor pentru coduri sursa, puternic, care ruleaza pe desktop si
este disponibil pentru Windows, macOS si Linux. Pachetul de instalare este unul minimal si
are dimensiuni reduse, avand initial un numar redus de componente esentiale celor mai
comune medii de dezvoltare.
Functionalitatile de baza ale editorului sunt:
 Editarea fisierelor text
 Gestionarea spatiului de lucru
 Gestionarea ferestrelor deschise
 Editarea setarilor de preferinte
 Instalarea si utilizarea de extensii ale unor terti
Editorul a fost conceput cu scopul de a putea fi extins cu usurinta si de a oferi oricui
abilitatea de a-si contura mediul de dezvoltare potrivit nevoilor si preferintelor sale. Extensiile se
integreaza in interfata utilizatorului, in comenzi si in sarcinile ce ruleaza pe sistem, astfel
facilitand lucrul cu diferite tehnologii prin intermediul interfetei partajate a Visual Studio Code.
Se poate verifica oricand magazinul pentru extensii pentru a verifica ce este disponibil pentru
nevoile fiecaruia.
Pentru a dezvolta o extensie de Visual Studio Code sunt necesare cunostinte de
TypeScript si NodeJS. Se va folosi VS Code API pentru a extine functionalitatile editorului.
Noua extensie trebuie sa respecte o structura ierarhica a fisierelor pentru a putea fi compilata si
utilizata, aceasta avand fisierele sursa, fisierul pentru configurarea debugger-ului (launch.json),
cel pentru a defini task-urile (tasks.json), cel pentru a configura TypeScript-ul (tsconfig.json) si
un fisier ce descrie modulele necesare extensiei (package.json).
Fisierul de baza a extensiei, trebuie sa exporte doua functii, “activate” si “deactivate”,
prima functie fiind executata cand se inregistreaza evenimentul de activare al acesteia, iar cea de-
a doua oferind posibilitatea de a sterge datele folosite inainte de a dezactiva extensia. In
interiorul functiei “activate”, se vor scrie metodele noii extensii, folosindu-se VS Code API, ce
pune la dispozitie dezvoltatorilor functii utilizate in scrierea extensiei, astfel incat aceasta sa-si
atinga scopul pentru care a fost dezvoltata.

3. Solutii
3.1. Device Tree
Un device tree reprezinta o structura de date ce descrie configuratia hardware a unui
dispozitiv. Pentru a facilita dezvoltarea, am creat o descriere generala a componentelor
necesare pentru initializarea capsulelor. Aceasta descriere este necesara pentru a putea
verifica validitatea configuratiei pe care utilizatorul doreste sa o foloseasca. Aceste descrieri
vor fi specifiece pentru fiecare dispozitiv suportat de TockOS. Astfel, am creat urmatoarele
forme generale:
Avand precizate descrierile de mai sus si modalitatea de initializare a capsulelor, cu
ajutorul unui script de NodeJS se poate genera in totalitate initializarea oricarei configuratii
valide. De asemenea, cu ajutorul scriptului, se pot evita greseli elementare, sau de neatentie,
cum ar fi, maparea a doua componente la acelasi pin, in acelasi timp, acesta se asigura ca
toate abstractizarile hardware necesare utilizarii capsulei sunt prezente, evitand astfel posibile
complicatii ulterioare. Pentru a putea utiliza acest script, utilizatorul trebuie sa descrie
minimal configuratia dorita.
Un exemplu de configuratie ar putea fi:
Utilizand un fisier de configuratie, relativ simplu de realizat, orice utilizator poate
initializa toate capsulele necesare dezvoltarii unei aplicatii.
Acest script se afla in strare incipienta. Am ales initial dezvoltarea unui prototip in
NodeJS, deoarece timpul necesar implementarii unor concepte initiale pentru a le putea
valida este semnificativ mai mic in comparatie cu timpul necesar pentru implementarea lor in
Rust. Scopul final fiind acela de a implementa solutia in Rust.

3.2. Unelte de dezvoltare


In prezent, ecosistemul TockOS este unul ce nu ofera o varietate foarte mare din punct de
vedere al uneltelor de dezvoltare disponibile. Cu alte cuvinte, este destul de dificil sa
compilezi manual intreg sistemul de operare si sa il incarci pe dispozitiv fara a avea
cunostinte solide de Linux. Am inceput dezvoltarea unei extensii de Visual Studio Code ce
are ca scop automatizarea intregului proces, pentru a usura si a facilita dezvoltarea acestui
sistem de operare.
Pentru inceput, am urmati pasii descrisi anterior in paragraful 2.2 si am facut urmatoarele
fisiere:
Dupa crearea si scrierea fisierelor de mai sus, am inceput prin a scrie functia
“activate” necesara la inregistrarea evenimentului de activare. In aceasta am inceput sa
definesc doua cai absolute pentru directorul din care se va lansa in executie compilarea si
incarcarea sistemului pe dispozitiv. Am definit un eventEmitter ce are ca rol transmiterea
de date catre un terminal in care dezvoltatorul primeste date prin portul serial de la
dispozitiv. Ulterior, am definit si Pseudoterminalul, caruia i-am adaugat si regulile dupa
care va afisa datele primite. Pentru moment, ultimele doua functii facute au fost cea
pentru crearea unui Pseudoterminal, in cazul in care nu exista unul, lansarea in executie a
compilarii si incarcarii sistemului de operarea, iar cea de-a doua, fiind folosita de prima,
este functia ce verifica disponibilitatea unui Pseudoterminal si returnarea acestuia in
cazul in care exista, undefined altfel.
La finalul incarcarii sistemului de operare pe dispozitiv, in cazul in care acesta se
termina cu succes, se porneste un script de NodeJS, bazat pe serialport, care citeste datele
primite pe portul serial la care este conectat dispozitivul.
In momentul de fata inca se lucreaza la redirectatul datelor primite pe portul serial
catre Pseudoterminal pentru afisarea acestora. Ulterior, extensia va mai beneficia si de o
interfata grafica din care se va putea selecta tipul dispozitivului pe care se doreste sa
incarce noua varianta de sistem.

4. Concluzie
Pe o piata unde deja se afla destule sisteme de operare ce au ca principal scop simpla
functionalitate a dispozitivelor, TockOS vine cu dorinta de a inova si a revolutiona modul in
care sunt percepute si dezvoltate sistemele de operare dedicate dispozitivelor IoT. Avand o
comunitate in crestere, sistemul de operare incepe sa prinda din ce in ce mai mult avant. In
prezent, din cauza ca acest sistem de operare a aparut in urma cu doar 5 ani, ecosistemul
disponibil pentru dezvoltarea acestuia nu dispune de prea multe unelte de dezvoltare. Astfel,
sarcina contribuitorilor si a dezvoltatorilor fiind una mult mai dificila.
Ne dorim sa contribuim la rezolvarea acestei probleme cu uneltele prezentate anterior,
care momentan se aflta inca in dezvoltare. Situatia actuala a acestor unelte este urmatoarea:
 Device tree-ul este definit momentan pentru un numar finit de abstractizari
hardware, acesta putand fii extins cu usurinta in viitor. Generatorul de cod, ce are
ca scop initializarea capsulelor se afla intr-o stare destul de avansata fiind capabil
sa creeze fisierul necesar initializarii capsulelor prezente in device tree-ul aferent
si verificarea corectitudinii fisierului de configurare primit ca input
 Extensia de Visual Studio Code poate in momentul de fata sa compileze sistemul
de operare si sa il scrie pe dispozitiv. De asemenea aceasta poate prelua date de pe
conexiunea seriala.

5. Bibliografie
Klabnik, S., & Nichols, C. (2018). The Rust Programming Language. Preluat de pe rust-lang.org:
https://doc.rust-lang.org/

Levy, A., Campbell, B., Pannuto, P., Ghena, B., Levis, P., & Giffin, D. B. (2020). Tock Overview. Preluat de
pe GitHub: https://github.com/tock/tock/blob/master/doc/Overview.md

Likely, G., & Boyer, J. (2008). A Symphony of Flavours: Using the device tree to describe embedded.
Preluat de pe http://www.landley.net/: http://www.landley.net/kdocs/ols/2008/ols2008v2-
pages-27-38.pdf

Microsoft. (2020). Documentation for Visual Studio Code. Preluat de pe https://code.visualstudio.com/:


https://code.visualstudio.com/docs

Microsoft. (2020). Extension API | Visual Studio Code Extension API. Preluat de pe code.visualstudio.com:
https://code.visualstudio.com/api

S-ar putea să vă placă și