Upravljački programi za mrežnu karticu u operacijskom sustavu Benu

Similar documents
Programiranje Programski jezik C. Sadržaj. Datoteke. prof.dr.sc. Ivo Ipšić 2009/2010

VDSL modem Zyxel VMG1312-B10A/B30A

Microsoft Hyper-V Server 2016 radionica EDU IT Pro, Zagreb,

Sberbank Business Online na Mozilla FireFox

Računarske osnove Interneta (SI3ROI, IR4ROI)

Uputa za instaliranje programske potpore za operativni sustav WINDOWS

Upute za postavljanje Outlook Expressa

PARALELNO PROGRAMIRANJE

VRIJEDNOSTI ATRIBUTA

TP-LINK TL-WPA4220 strujni prijenosnik Internet ili IPTV signala s bežičnim modulom. Priručnik za korištenje i brzu instalaciju

PKI Applet Desktop Application Uputa za instalaciju programske potpore

ETHERNET LOKALNA MREŽA. I. Podešavanje mrežnih postavki računala u Linux operacijskom sustavu

PREDMET. Osnove Java Programiranja. Čas JAVADOC

Uputa: Zabranjeno je koristiti bilo kakva pomagala. Rje²enja pi²ete desno od zadatka. Predajete samo ovaj list.

CSS CSS. selector { property: value; } 3/20/2018. CSS: Cascading Style Sheets

VHDLPrimeri Poglavlje5.doc

Osnove programskog jezika C# Čas 4. Nasledjivanje 2. deo

Naredbe za kontrolu toka

Windows Server 2012, VDI Licenciranje najprodavanijeg servera, što je novo, VDI licenciranje. Office 2013 / Office 365

VB komande. Programiranje 1

UNIVERZITET U BEOGRADU ELEKTROTEHNIČKI FAKULTET

Informatika Uvod u C#,.NET Framework i Visual Studio... nastavak...

Uputstvo za podešavanje mail klijenta

Programiranje III razred

Osnove programskog jezika C# Čas 5. Delegati, događaji i interfejsi

Sveučilište u Zagrebu PMF Matematički odsjek. Mreže računala. Vježbe 08. Zvonimir Bujanović Slaven Kožić Vinko Petričević

Mrežni koncepti (koncept, skica, nacrt, plan) o Pregled na najvažnije koncepte mreže. Slanje paketa sa Argon-1 prema Neon-u

Modbus TCP i dva PLC S7 1200

Izrada VI laboratorijske vježbe

Binarne hrpe. Strukture podataka i algoritmi VJEŽBE 26. siječnja / 133

Sveučilište u Zagrebu Fakultet strojarstva i brodogradnje. WEB programiranje HTML & CSS

UPUTSTVO ZA KORIŠĆENJE NOVOG SPINTER WEBMAIL-a

var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin ListBox1.Items.LoadFromFile('d:\brojevi.

Upute za pristup bežičnoj mreži Medicinskog fakulteta u Splitu (MS Windows XP) ver 1.1, lipanj 2010.

Svi Java tipovi imaju ekvivalentan tip u jeziku Scala Većina Scala koda se direktno preslikava u odgovarajući Java konstrukt

Vežbe - XII nedelja PHP Doc

PROGRAMIRANJE. Amir Hajdar

SVEUČILIŠTE U ZAGREBU FAKULTET PROMETNIH ZNANOSTI

Prva recenica. Druga recenica.

Uputstvo za korišćenje logrotate funkcije

JavaScript i HTML DOM

NASLOV SEMINARSKOG RADA (16 pt, Bold) Seminarski rad. (16 pt, Bold)

Sistemska programska podrška. Programska podrška. MS Windows. MS Windows NT

1. Uvod. Evolucija Interneta.

Sveučilište Jurja Dobrile u Puli. Odjel za informacijsko-komunikacijske tehnologije KRISTIJAN BABIĆ. USPOREDBA IPV4 I IPV6 PROTOKOLA Završni rad

Uputstva za instaliranje čitača Datalogic Skorpio u operativnom sistemu Windows 7 i višim POM-NA-XX-46, V3.0

pojedinačnom elementu niza se pristupa imeniza[indeks] indeks od 0 do n-1

b) program deljiv3; uses wincrt; var i:integer; begin i:=3; while i<100 do begin write(i:5); i:=i+3; end; end.

Operacijski sustavi. Laboratorijska vježba 2. Petra Lončar, mag. ing. el., asistent FESB, 2016.

Lab. vježba PROGRAMIRANJE ZA INTERNET. Upute za laboratorijske vježbe. (izradio: Marin Bugarić) CSS3

FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA

Case Study Hrvatska pošta: Korisničko iskustvo iz snova. Tomislav Turk Samostalni sistem inženjer, Combis d.o.o. Zagreb,

SMARTPHONE TO MICROCONTROLLER COMMUNICATION ANDROID FRAMEWORK FOR STUDENTS

/*#include <iostream> // Prvi zadatak sa integralnomg ispita

QRadar & StealthINTERCEPT

Računarske mreže treći razred

Učitati cio broj n i štampati njegovu recipročnu vrijednost. Ako je učitan broj 0, štampati 1/0.

Vežba 3 Mrežni protokoli

Geant2 - JRA1. Upravljanje mjerenjem i performansama mreža (perfsonar, baza multi-domain nadzorne usluge) Danijel Matek (Srce)

9. RAD S DATOTEKAMA PODATAKA

Računalne mreže 5. LOKALNE MREŽE

FAT32 datotečni sustav

u Zagrebu PMF Matematički odjel Sveučilište Mreže računala Vježbe 01 Matko Botinčan Zvonimir Bujanović Igor Jelaska Maja Karaga

Sadržaj. Verzija 03/2017 Primjenjuje se od 20. novembra godine

Cjenovnik usluga informacionog društva

2. Linijska algoritamska struktura

GUI - događaji (Events) i izuzeci. Bojan Tomić

Računarska tehnika i računarske komunikacije Osnovi računarskih mreža 1. Vežba 7 Wireshark

KINEMATIČKA ANALIZA MEHANIZAMA INDUSTRIJSKIH ROBOTA KORIŠTENJEM PROGRAMSKOG JEZIKA MATLAB

Upute za VDSL modem BiPAC 8700VNXL R3

FRAME RELAY komunikacijski protokol

dr. sc.. Josip Musić Originalne slideove izradio:

Single Sign-On s Officeom 365 na Kineziološkom fakultetu Sveučilišta u Zagrebu

za praćenje i vođenje procesa

SVEUČILIŠTE U MOSTARU FAKULTET PRIRODOSLOVNO-MATEMATIČKIH I ODGOJNIH ZNANOSTI BAZE PODATAKA 2. Doc.dr.sc. GORAN KRALJEVIĆ BAZE PODATAKA 2 1

Računalne mreže. Lokalne mreže: zahtjevi. Lokalne mreže: arhitektura. Lokalne mreže: zahtjevi. Upravljanje logičkom vezom, LLC (Logical Link Control)

PLANIRANJE MIGRACIJE S PROTOKOLA IPv4 NA IPv6

Uvod u računarstvo. Preddiplomski studij elektrotehnike 2008/2009. prof.dr.sc. Ivo Ipšić UUR 2008/2009

Uvod u programiranje - vežbe. Kontrola toka izvršavanja programa

PROTOKOLI ZA NADZOR I KONFIGURACIJU MREŽE RAČUNALA

Jezik Baze Podataka SQL. Jennifer Widom

ANALIZA KORIŠTENJA REDUNDANTNIH POVEZNICA SA SVRHOM POVEĆANJA UKUPNOG KAPACITETA

Visoka tehnička škola strukovnih studija Novi Sad. seminarski rad na temu: Modbus protokol. dr. Velibor Pjevalica

progecad NLM Korisničke upute

FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA. SMTP autentikacija

PITANJA ZA II KOLOKVIJUM NASLJEĐIVANJE, VIRTUELNE FUNKCIJE I POLIMORFIZAM

16. Sigurnije programiranje

Računalne mreže. Analiza Grafičkog mrežnog simulatora GNS3

Mašinska vizija. Dr Nenad Jovičić tnt.etf.rs/~mv

Fcheck IDS alat CCERT-PUBDOC

Predavanje 10. Odjel za matematiku 1 IP NETWORKING. Detaljnije o domenama, hostovima, socketima, TLSu, SSLu

namespace spojneice { public partial class Form1 : Form { public Form1() { InitializeComponent(); }

Numeričke metode i praktikum

for i:=2 to n do if glasovi[i]>max then begin max:=glasovi[i]; k:=i {*promenljiva k ce cuvati indeks takmicara sa najvise glasova *} end;

VII Lokalne mreže LAN SNA Digital

Programska podrška

Usmjeravanje na Internetu

Komunikacije i mreže

Uvod u računarstvo. Preddiplomski studij elektrotehnike 2009/2010. prof.dr.sc. Ivo Ipšić UUR 2009/2010

Lab. vježba PROGRAMIRANJE ZA INTERNET. Upute za laboratorijske vježbe. (izradio: Marin Bugarić) HTML5

Transcription:

SVEUČILIŠTE U ZAGREBU FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA ZAVRŠNI RAD br. 4812 Upravljački programi za mrežnu karticu u operacijskom sustavu Benu Antun Kukolja Zagreb, lipanj 2017.

Sadržaj 1. Uvod... 1 2. Mrežna kartica RTL8139... 3 3. Komponente operacijskog sustava... 5 3.1 PCI podsloj... 6 3.2 Sučelje za mrežne uređaje net_dev... 10 3.3 Jezgrin međuspremnik za mrežne pakete sk_buff... 12 4. Inicijalizacija kartice... 14 5. Slanje Okvira... 16 6. Prihvat Okvira... 18 7. Prikaz rada ostvarena sustava na primjeru... 21 Zaključak... 23 Literatura... 24 Sažetak... 25 Summary... 26

1. Uvod Stalna povezanost postala je jedan od najvažnijih dijelova javnog i privatnog života ljudi. Za održavanje komunikacije računalnih sustava, a time i ljudi, odgovoran je pretežito internet. Računala se u internetsku mrežu spajaju preko komunikacijskih uređaja koji najčešće dolaze u obliku mrežnih kartica. Te kartice mogu se pojaviti kao diskretni elementi koji se dodaju računalnom sustavu ili češće kao integrirani element računalnog sustava. Uz sklopovlje koje se dodaje računalu proizvođač obično isporučuje i upravljački program koji je zadužen za ispravnu komunikaciju sklopovlja i operacijskog sustava koji upravlja računalom. Kako upravljački program ne ovisi samo o arhitekturi sustava nego i o operacijskom sustavu proizvođači će razviti upravljačke programe samo za najkorištenije operacijske sustave. Oni korisnici koji koriste manje poznate operacijske sustave prisiljeni su upravljački program potražiti od drugih izvora. Oni korisnici koji razvijaju vlastit operacijski sustav primorani su sami ostvariti upravljačke programe za nadogradnje koje dodaju na osnovno sklopovlje računala. Cilj ovog završnog rada je ostvarenje komunikacije dva ili više emuliranih računalnih sustava kojima upravlja operacijski sustav Benu. U tu svrhu potrebno je odabrati prikladnu mrežnu napravu te ostvariti upravljački program za istu. U poglavlju Mrežna kartica RTL8139 objašnjene su osnovne značajke mrežne kartice. Dan je tablični popis registara, i njihovih pomaka, koje koristi ostvareni upravljački program. U poglavlju Komponente operacijskog sustava dan je detaljan opis komponenti koje su dodane operacijskom sustavu u sklopu ovog završnog rada. Osim opisa ponuđeni su razlozi izgradnje proširenja i opisan je načina na koji ona pojednostavljuju razvoj i učinkovitost upravljačkog programa. 1

U poglavlju Inicijalizacija kartice detaljno je objašnjen postupak prvog pokretanja kartice. Objašnjeni su svi koraci inicijalizacije te uporabe pojedinih registara kartice na primjerima. U poglavljima Slanje Okvira i Prihvat Okvira dan je detaljan opis mehanizama kojima se kartica koristi za slanje i primanje Ethernet okvira. Uz mehanizme kartice objašnjeni su koraci koje upravljački program poduzima kako bi osigurao pravilan rad mrežne kartice. U poglavlju Prihvat Okvira dana je dodatna argumentacija za ostvarenje jezgrinog međuspremnika za mrežne pakete opisane u drugom poglavlju. Poglavlje Prikaz rada ostvarena sustava na primjeru ukratko objašnjava demonstracijski primjer razvijen u sklopu završnog rada i način povezivanja emuliranih računalnih sustava u virtualnu lokalnu mrežu. 2

2. Mrežna kartica RTL8139 Za emuliranje računalnog sustava koristi se emulator QEMU. Potrebno je odabrati mrežnu karticu koju QEMU može emulirati i kojom se što lakše upravlja budući da je operacijski sustav prilično jednostavan. Mrežna kartica koja odgovara opisu, podržana od strane emulatora, jednostavna i dobro dokumentirana je RTL8139 koju proizvodi Realtek Semiconductor Corp baziran u Tajvanu. Kartica se u računalni sustav spaja preko PCI sabirnice i nakon pravilnog podešenja omogućava prijenos podataka putem Ethernet veze (IEEE 802.3u 100Base-T i IEEE 802.3x Full Duplex Flow Control) do susjednog čvora u mreži tj. omogućava slanje i primanje podataka na razini podatkovne poveznice. [1] Dodatne mogućnosti kartice uključuju sučelja za upravljanje potrošnjom energije kao što su Advanced Configuration Power management Interface (ACPI), PCI power management za operacijske sustave koji podržavaju Operating System Directed Power Management (OSPM). [1] Budući da je cilj ovog rada samo ostvariti komunikaciju dva ili više emuliranih računala ta se svojstva zanemaruju. Sama kartica je dobro dokumentirana od strane proizvođača. Dokumentacija je ponuđena u obliku vodiča za programiranje i tehničkog lista (eng. datasheet). Oba dokumenta dostupna su na engleskom jeziku na mrežnom sjedištu proizvođača Iz dokumentacije doznajemo da kartica koristi mehanizme prstenastog međuspremnika (eng. ring buffer) za slanje i primanje Ethernet okvira. Budući da je kartica prilično jednostavna, u usporedbi sa sličnim sklopovskim rješenjima, međuspremnik se ne nalazi na kartici. Upravljački program mora od operacijskog sustava osigurati izravan pristup spremniku kako bi kartica mogla pravilno pisati dolazeće okvire i čitati one koji se trebaju poslati. Spomenuti mehanizmi bit će detaljnije opisani u vlastitim poglavljima. Osim adresnog prostora za postavke PCI uređaja koji ima svaki uređaj koji se spaja na sabirnicu kartica RTL8139 sadrži još i 86 registara [1] kojima se pristupa I/O instrukcijama koje su specifične za arhitekturu računala na koje se 3

kartica spaja. Ti registri koriste se za primanje i slanje okvira, postavke izazivanja zahtjeva za prekidom, postavke potrošnje energije, itd. Budući da je potrebno razviti jednostavan upravljački program većina tih registara se ne koristi. Korišteni registri navedeni su u tablici 1.1. Pomak označava vrijednost koja se dodaje osnovnoj adresi dodijeljenoj kartici MMIO (eng. Memmory Mapped I/O). Zbroj te dvije vrijednosti je adresa registra koja se koristi za čitanje vrijednosti i upisivanje novih vrijednosti u iste. Tablica 2.1 Korišteni registri [2] Oznaka Pomak Opis IDRx 0x00 MAC adresa kartice, x [0,5] TSDx 0x10-0x1F Statusni registri opisnika za slanje, 4B, x [0,3] TSADx 0x20-0x2F Početna adresa međuspremnika za slanje, 4B, x [0,3] RBSTART 0x30-0x33 Adresa međuspremnika za prihvat okvira CR 0x37 Omogućuje slanje, primanje i ponovno pokretanje IMR 0x3C - 0x3D Dozvoljava/zabranjuje prekide za određene uvjete ISR 0x3E - 0x3F Zastavice uzroka prekida TCR 0x40-0x43 Parametri slanja okvira RCR 0x44-0x07 Paramteri primanja okvira CONTROL1 0x52 Programsko pokretanje kartice MULINT 0x5C - 0x5D Upravljanje uzastopnim prekidima 4

3. Komponente operacijskog sustava Operacijski sustavi na upravljačke programe gledaju kao na svojevrsne crne kutije, a operacijski sustav Benu nije iznimka. Benu definira sučelje za pisanje upravljačkih programa koje ima sljedeću strukturu: struct _device_t_ { char int dev_name[dev_name_len]; irq_num; int (*irq_handler) ( int irq_num, void *device ); /* interrupt handler function (test if device is * interruptsource and handle it if it is) */ int (*callback) ( int irq_num, void *device ); /* callback function (to kernel) - when event require * kernel action */ /* device interface */ int (*init) ( uint flags, void *params, device_t *dev ); int (*destroy) ( uint flags, void *params, device_t *dev ); int (*send) ( void *data, size_t size, uint flags, device_t *dev ); int (*recv) ( void *data, size_t size, uint flags, device_t *dev ); }; int (*status) ( uint flags, device_t *dev ); /* various flags and parameters specific to device */ int void flags; *params; Kod 3.1 Struktura sučelja upravljačkog programa [7] Upravljački program ostvaruje funkcije sučelja kako bi osigurao pravilan rad uređaja. Svaki upravljački program dužan je ostvariti funkcije init, destroy i status. Funkciju recv npr. nije potrebno ostvariti ako uređaj ne nudi mogućnost 5

čitanja ili ako pozivanje funkcije za čitanje nema smisla. [6] Primjer takvog uređaja je mrežnia kartica jer se primanje okvira obično obavlja tijekom obrade prekida. Jezgra operacijskog sustava poziva funkcije sučelja kada je potrebno izvesti neku operaciju. Pri podizanju sustava jezgra će pokušati osigurati pravilnu inicijalizaciju svih uređaja tako da prolazi kroz sve poznate uređaje i poziva funkciju init. [6] Isto se događa pri gašenju jezgre kada ona ponovo iterira kroz uređaje i poziva funkciju destory. Član irq_num označava broj prekida koji uređaj izaziva. Ako uređaj izaziva prekid tj. irq_num je različit od -1 dužan je ostvariti funkciju irq_handler. Uspješna inicijalizacija uređaja od strane jezgre uključuje registraciju prekidne rutine za uređaj. [7] 3.1 PCI podsloj Upravljački program za RTL8139 razvija se na inačici operacijskog sustava Benu za arhitekturu i386. PCI (eng. Peripheral Component Interconnect) omogućuje potpuno programsku inicijalizaciju svakog uređaja spojenog na sabirnicu. Svaki uređaj koji se spaja na sabirnicu dužan je podržati najmanje 256B adresnog prostora za PCI postavke u obliku 64 32-bitna registra. Pristup adresnom prostoru za PCI postavke uređaja različit je od platforme do platforme. Arhitektura i386 koristi dvije 32-bitne I/O lokacije za pristup adresnom prostoru PCI postavki. [8] Za čitanje i pisanje PCI postavki uređaja arhitektura i386 koristi dvije I/O adrese: CONFIG_ADDRESS (0xCF8) i CONFIG_DATA (0xCFC). Kod pristupanja adresnom prostoru za PCI postavke potrebno je na I/O CONFIG_ADDRESS upisati vrijednost sljedećeg formata: 6

Tablica 3.1 Struktura 32-bitovne adrese prostora za PCI postavke 31 30-24 23-16 15-11 10-8 7-2 1-0 Enable Reserved Bus Device Function Register 00 Prvi bit adrese je Enable i njega uvijek postavljamo na 1. Polja Bus i Device označavaju sabirnicu i uređaj na toj sabirnici respektabilno. Polje Function označava funkciju PCI uređaja. Svaki uređaj mora podržati barem prvu funkciju (vrijednost 0), ako podržava više funkcija svaka će funkcija imati vlastiti adresni prostor za PCI postavke. Polje Register označava registar u adresnom prostoru tj. ono predstavlja pomak (eng. offset) registra adresnog prostora za konfiguraciju kojemu želimo pristupiti. Posljednja dva bita adrese uvijek moraju biti 0 zato što PCI dozvoljava samo 32-bitno poravnati pristup (eng. aligned). Nakon što je pravilna PCI adresa upisana u CONFIG_ADDRESS I/O adresu CONFIG_DATA koristimo za pristup registrima adresnog prostora za PCI postavke. Kod čitanja nakon unošenja adrese sa CONFIG_DATA jednostavno čitamo vrijednost. Kod pisanja nakon unošenja adrese u CONFIG_DATA upisujemo vrijednost koju treba unijeti u registar prostora za PCI postavke. Budući da je dozvoljen samo 32-bitni pristup kod pisanja i čitanja, vrijednosti moramo maskirati konstantom željene širine te posmaknuti vrijednost u desno. Ako je došlo do greške pri čitanju registra iz adresnog prostora za PCI postavke pročitana vrijednost bit će 0xFFFFFFFF. Do grešaka dolazi ako se pokušava čitati s nepravilne adrese, npr. sabirnice na kojoj nema uređaja ili adresnog prostora za postavke funkcije različite od 0 na uređaju koji podržava samo jednu funkciju. 7

Slika 3.1 Skica generičkog adresnog prostora za PCI postavke [8] Slika 3.1 prikazuje generički adresni prostor za PCI postavke. Adresni prostor za postavke svih uređaja mora biti identičan barem do pomaka 0x10 kako bi operacijski sustav mogao pravilno pretražiti uređaje koji su spojeni u sustav. Kartica RTL8139 poštuje to pravilo te je adresni prostor identičan generičkom samo u prve četiri 32-bitne lokacije, tj. do adrese pomaka (eng. offset) 0x10. Jezgri operacijskog sustava dodana je struktura prikazana kodom 3.2 s ciljem izdvajanja logike upravljanja PCI uređajima u posebno sučelje. Nusprodukt takvog dizajna je jednostavniji postupak inicijalizacije u upravljačkom programu. Prije inicijalizacije uređaja jezgra će proći kroz sve kombinacije polja Bus, Device i Function (samo nulta funkcija). Za svaku kombinaciju izgradit će pravilnu adresu adresnog prostora za postavke i s te adrese pokušat će pročitati 32-bitnu vrijednost s pomakom 0x00 tj. vrijednost DeviceID i VendorID. Ako je pročitana vrijednost različita od koda greške to znači da je na toj adresi prisutan PCI uređaj, tada jezgra zauzima prostor u spremniku za jedan primjerak strukture prikazane kodom 3.2 i sprema je u listu spojenih PCI uređaja. 8

typedef struct kpci_device_t { pci_device dev; id_t k_id; list_h node; } kpci_device; Kod 3.2 Jezgrina struktura za PCI uređaj typedef struct _pci_device_t_ { uint8 bus; uint8 slot; uint8 func; uint16 vendor; uint16 device;... uint16 status;... enum header_type type; } pci_device; Kod 3.3 Struktura PCI uređaja za upravljački program Kod 3.3 prikazuje strukturu na koju jezgra daje pokazivač onim upravljačkim programima koji traže uređaj s DeviceID i VendorID identičnom onome pronađenog uređaja. 9

int pci_read_config_byte(pci_device *dev, uint8 where, uint8 *val); int pci_read_config_word(pci_device *dev, uint8 where, uint16 *val); int pci_read_config_long(pci_device *dev, uint8 where, uint32 *val); int pci_write_config_byte(pci_device *dev, uint8 where, uint8 value); int pci_write_config_word(pci_device *dev, uint8 where, uint16 value); int pci_write_config_long(pci_device *dev, uint8 where, uint32 value); Kod 3.4 Funkcije kojima upravljački program komunicira s uređajem 3.2 Sučelje za mrežne uređaje net_dev Za kontrolu mrežnih uređaja u računalnom sustavu, operacijskom sustavu dodajemo strukturu prikazanu kodom 3.5. Struktura predstavlja jezgrin pogleda na mrežne uređaje. Za zauzimanje strukture net_dev upravljački program za vrijeme inicijalizacije mora pozvati jezgru funkcijom alloc_init_ndev kojoj predaje niz znakova koji predstavlja ime uređaja. Jezgra će zatim potražiti generički uređaj s istim imenom te dodati pokazivač na isti u zauzetu strukturu, na posljetku se inicijaliziraju podaci o mrežnom uređaju i pokazivač na njega se vraća upravljačkom programu. Za vrijeme rada upravljački program će bilježiti statističke podatke o broju poslanih i primljenih paketa, broju pogrešaka itd. U funkciji destory upravljački program poziva jezgru funkcijom free_net_dev kojom oslobađa resurse zauzete strukturom mrežnog uređaja. 10

typedef struct _k_net_dev_ { net_dev n_dev; /*network device interface(set by the driver)*/ the } knet_dev; kdevice_t *p_dev; /*kernel device which is an interface to network device driver*/ list_h node; list_t *list; Kod 3.5 Jezgrina struktura za mrežne uređaje typedef struct _net_dev_t_ { char *name; /*device name*/ char mac[max_mac_len]; /*devices MAC address*/ char b_mac[max_mac_len]; /*broadcast MAC for this device*/ unsigned char mac_len; /*len of devices MAC address*/ unsigned int max_buff_len; unsigned int mtu; net_dev_stats stats; } net_dev; net_dev *alloc_init_ndev(char *name); void free_net_dev(net_dev *dev); Kod 3.6 Pogled upravljačkog programa na mrežni uređaj Nakon što jezgra upravljačkom programu vrati pokazivač na strukturu mrežnog uređaja koji mu pripada on popunjava članove strukture MAC adrese, MAC adrese za razašiljanje, maksimalnu veličinu međuspremnika za slanje i MTU (eng. maximum transmission unit). Te podatke jezgra koristi pri slanju podataka na mrežni uređaj, npr. pri fragmentaciji ako je potrebna. 11

3.3 Jezgrin međuspremnik za mrežne pakete sk_buff Nakon što je operacijskom sustavu dodana sposobnost rada s mrežnim uređajima potrebno je dodati i kvalitetan način za rad s podatcima koji su primljeni s mreže ili koje treba na mrežu poslati. Ostvarena je struktura sk_buff koja je inspirirana sličnom strukturom u Linux jezgri pod imenom SKB (eng. Socket Kernel Buffer). [4] Struktura je prikazana kodom 3.7 i omogućava jezgri operacijskog sustava da smanji broj kopiranja podataka iz jednog međuspremnika u drugi što se vidi na primjeru ostvarenog upravljačkog programa. typedef struct _sk_buff_t_ { list_t *list; /*list which currently holds this skb*/ net_dev *dev; /*pointer to device which sent/got this skb*/ list_h node; /*node of this skb*/ union { /*protocol header pointers*/ struct eth_hdr *eth_h; unsigned char *raw; } header; union { unsigned char *raw; } mac; unsigned char *head, *data, *tail, *end; unsigned int len, tot_len, mac_len, csum; unsigned short protocol; } sk_buff; Kod 3.7 Struktura jezgrinog međuspremnika za mrežne podatke 12

Prednost strukture sk_buff je u tome što se jednom zauzima, jednom oslobađa, jednom se podatci kopiraju u nju i jednom se podatci kopiraju iz nje. [4] Unija header je skup pokazivača na sve jezgri poznate mrežne protokole. Članovi head, data, tail i end svi pokazuju na podatke koji se trebaju poslati na mrežu ili koji su s nje primljeni. Head uvijek pokazuje na početak podataka, end uvijek na kraj. Pokazivači data i tail mijenjaju poziciju ovisno o tome koji protokol trenutno modificira sadržaj međuspremnika. Kako se primjerak strukture sk_buff s podatcima prenosi kroz mrežni stog svaki bi sloj pomaknuo tail ili data po potrebi kako bi nadodao vlastiti opisnik na podatke koje je primio od višeg sloja. Kada niži sloj prosljeđuje međuspremnik višem sloju on pomiče data ili tail kako bi sakrio svoje zaglavlje od višeg sloja. Struktura sadrži pokazivač na mrežni uređaj s kojeg su podatci primljeni ili na koji se trebaju poslati. Dodatno sadrži i pokazivač na listu u kojoj se trenutno nalazi. Liste u kojima bi se strukture sk_buff trebale nalaziti su liste redova za čekanje na obradu raznih slojeva mrežnoj stoga, npr. red za obradu protokola UDP, red za obradu protokola IP gdje je možda potrebno čekati fragmente IP datagrama. Kako je izgradnja mrežnog stoga van opsega ovog završnog rada ostvaren je samo iznimno jednostavan Ethernet sloj s funkcijom koja ispisuje primljene podatke na serijski izlaz. Slika 3.2 Skica elemenata operacijskog sustava u radu 13

4. Inicijalizacija kartice Inicijalizaciju mrežne kartice u cijelosti obavlja upravljački program, točnije funkcija rtl_8139_init upravljačkog programa. Tu funkciju poziva jezgra pri iteraciji kroz sve poznate uređaje. [6] Prvi korak inicijalizacije je od jezgre zatražiti pokazivač na pci_dev strukturu koja predstavlja mrežnu karticu kao PCI uređaj. To se radi pozivom funkcije pci_get_device s argumentima 0x10EC i 0x8139, tj. VendorID i DeviceID vrijednostima iz adresnog prostora za PCI postavke. [1] Jezgra će zatim iterirati kroz listu pronađenih PCI uređaja i ako kartica uistinu postoji u sustavu upravljačkom programu vraća se pokazivač na strukturu preko koje može pisati i čitati iz adresnog prostora za postavke. Nakon što je osiguran pristup PCI postavkama potrebno je podesiti nekoliko registara. Prvi registar čija se vrijednost podešava je naredbeni registar (eng. command register), 16-bitni registar s pomakom 0x04. Kako bi kartica pravilno prenosila okvire sa žice u spremnik i iz spremnika na žicu potrebno joj je dozvoliti direktan pristup spremniku (eng. direct memory access, DMA), tj. dozvoliti da slobodno piše i čita iz spremnika koji će joj kasnije biti dodijeljen. Prvo čitamo vrijednost registra, toj vrijednosti treći bit postavljamo u 1 te novu vrijednost upisujemo u isti registar. Sada kartica može direktno pristupati međuspremniku. [5] Sljedeći registar je BAR (eng. base address register) s pomakom 0x10. To je 32-bitni registar koji označava početnu I/O adresu za pristup registrima kartice spomenutim u drugom poglavlju. Vrijednost koja se čita iz BAR registra postavljena je od strane BIOS-a (eng. Basic Input/Output System) pri podizanju sustava. Ako je potrebno operacijski sustav može promijeniti početnu adresu za I/O pristup registrima kartice. Međutim vrijednosti koje odabire BIOS emulatora QEMU sasvim su adekvatne. U privatne parametre upravljačkog programa upisana je pročitana I/O adresa što znači da je moguće pristupati registrima mrežne kartice. Upravljački program zatim od jezgre traži zauzimanje prostora u spremniku za strukturu net_dev koja pripada ovom uređaju. Zatim upravljački program upisuje vrijednost 14

0x00 u registar CONTROL1 i tako pokreče mrežnu karticu. [2] Sljedeći korak inicijalizacije je programsko ponovno pokretanje kojim se svi registri kartice postavljaju na pretpostavljene, početne, vrijednosti. Postavljanje registara u početne vrijednosti postiže se upisivanjem 0x10 u naredbeni registar (CR). Za inicijalizaciju prstenastog međuspremnika za slanje okvira upravljački program mora od jezgre operacijskog sustava osigurati kontinuirani dio spremnika veličine 4x1536B, poravnat na 4B. Budući da će se zauzeti dio spremnika koristiti kao međuspremnik kojem kartica pristupa direktno operacijski sustav mora vratiti pokazivač sa stvarnom vrijednosti spremničke lokacije. Međuspremnik se zatim dijeli na četiri dijela i u registre TSAD0 do TSAD3 se upisuje početna adresa svakog dijela. Pri slanju okvira kartica čita podatke iz zadanog međuspremnika i prosljeđuje ih na žicu. [2] Upravljački program ponovno zauzima kontinuirani dio spremnika veličine 32KB+2048B poravnate na 4B. Ponovno operacijski sustav mora vratiti stvarnu adresu spremnika koju zatim upisujemo u registar RBSTART. Mrežna kartica u taj spremnik upisuje okvire koje je primila. Nakon što smo kartici dali adresu međuspremnika moramo joj reći kakve okvire želimo prihvaćati. U registar RCR upisujem vrijednost 0x178E. Tako kartici dajemo do znanja da prihvaća okvire čija je odredišna adresa odgovara MAC adresi kartice, je višeodredišna ili adresa razašiljanja. Kartici također dajemo do znanja da je međuspremnik veličine 32KB s dodatnim prostorom za preljev te da se okviri koji bi izašli iz međuspremnika ne prenose na njegov početak. [1] Kako bi kartica pravilno radila mora moći izazivati prekide. U registar IMR upisujemo vrijednost 0x7F kojom kartici dozvoljavamo izazivanje prekida za pravilno prenesene okvire, pravilno i pogrešno primljene okvire, preljev međuspremnika za primanje okvira, itd. [1] Nakon ponovnog pokretanja vrijednost naredbenog registra je nula. U naredbeni registar se upisuju vrijednosti 0x04 i 0x08 čime omogućujemo prihvat i slanje okvira. Time završava proces inicijalizacije. Mehanizmi slanja i primanja okvira objašnjeni su u sljedećim poglavljima. 15

5. Slanje Okvira Mrežna kartica RTL8139 za slanje okvira koristi prstenasti međuspremnik kojem ima direktan pristup. U procesu inicijalizacije u registre TSADx upisali smo adrese međuspremnika i u privatne parametre upravljačkog programa upisali smo da je trenutno zauzeto 0 izlaznih opisnika. Slanje okvira počinje pozivom funkcije send upravljačkog programa. Upravljački program očekuje da je argument data pokazivač na pravilno strukturirani Ethernet okvir. Zadatak funkcije send je kopirati podatke iz spremnika na koji pokazuje argument u sljedeći slobodni dio međuspremnika za prijenos. Ako je veličina okvira manja od minimalne, tj. manja od 60B. Okvir će se u međuspremniku dopuniti bajtovima vrijednosti 0 kako zahtjeva Ethernet protokol. Ako u trenutku poziva funkcije send ne postoji niti jedan slobodan opisnik funkcija vraća kod greške EBUSY. Nakon što je okvir kopiran u međuspremnik i po potrebi dopunjen nulama, potrebno je kartici signalizirati da postoji okvir kojeg treba prenijeti na žicu, upisom veličine okvira u registar TSDx, gdje x označava prvi slobodni opisnik. Osim veličine okvira u registar se upisuju zastavice koje specificiraju uvijete prijenosa okvira na žicu, npr. polje praga za rani početak prijenosa (eng. EarlyTxTreshold). Za uspješno prenesene okvire RTL8139 izaziva prekid. Upravljački program u obradi prekida mora ažurirati pokazivače na opisnike u svojim privatnim parametrima. Mrežna kartica može izazvati jedan prekid za više uspješno poslanih okvira. To znači da upravljački program mora iterirati po svim zauzetim opisnicima i za svaki ažurirati pokazivače. [2] 16

Slika 5.1 Skica međuspremnika i registara za prijenos [2] Slika 5.1 prikazuje međuspremnik zauzet u postupku inicijalizacije. Kartica podatke iz međuspremnika na koji pokazuje prvi zauzeti opisnik prebacuje u registar TxFIFO a zatim iz registra na žicu. Nakon što su podatci iz međuspremnika preneseni na žicu RTL8139 će nadodati izračunatu FCS (eng. Frame Check Sequence) vrijednost. Zaštitna suma računa se dok kartica prebacuje podatke na žicu. Automatsko računanje zaštitne sume može se onemogućiti postavljanjem šesnaestog bita registra TCR u vrijednost 1, no zbog jednostavnosti upravljačkog programa i brzine prijenosa računanje zaštitne sume ostavljamo kartici. [1][3] 17

6. Prihvat Okvira Svaki primljeni okvir sprema se u međuspremnik čiji je početak u procesu inicijalizacije upisan u registar RBSTART. Osim okvira u međuspremnik je spremljen i opisnik za primljeni okvir. Opisnik okvira dolazi prije okvira u međuspremniku i velik je 4B. [2] Prva dva bajta su statusne zastavice za Ethernet okvir a druga dva bajta su veličina okvira i opisnika. Oba polja zapisana su u Little Endian obliku. Budući da je arhitektura i386 također Little Endian nije potrebno raditi pretvorbe nad vrijednostima. Nakon što je spremila barem jedan cijeli okvir i njegov opisnik u međuspremnik mrežna kartica će izazvati prekid kako bi upravljački program preuzeo primljene okvire i ažurirao pokazivače. [1] Ako je u registru ISR postavljena zastavica RxOK prekidna rutina će ući u petlju u kojoj preuzima sve primljene okvire i predaje ih jezgri. Upravljački program u privatnim parametrima drži pokazivač na međuspremnik koji pokazuje gdje se nalazi prvi novi okvir i njegov opisnik. Iz opisnika čita veličinu okvira i funkcijom alloc_skb poziva jezgru da zauzme mjesto u spremniku za jednu strukturu sk_buff. Nad dobivenom strukturom poziva se funkcija skb_put koja pomiče pokazivač tail strukture sk_buff za broj bajtova zadan u argumentu. Sljedeći korak je kopiranje okvira u zauzeti jezgrin međuspremnik. Pozivom funkcija eth_copy_sum i eth_type_trans okvir se kopira u strukturu sk_buff, pokazivač header pokazuje na početak okvira, a vrijednost člana protocol postavlja se na konstantu ETHERNET. Time je okvir kopiran iz međuspremnika i spreman za predaju jezgri. Pozivom funkcije netif_rx upravljački program predaje strukturu sk_buff jezgri. Nakon što je okvir preuzet potrebno je o tome obavijestiti mrežnu karticu. Poziciju u međuspremniku gdje se već nalazi ili će se nalaziti sljedeći okvir koji treba preuzeti računamo na sljedeći način. Trenutnoj poziciji zbrojimo veličinu okvira kojeg smo preuzeli, zbrojimo konstantu četiri (veličina opisnika) i konstantu 18

tri. Ako je nova pozicija veća od 32K zamjenjujemo ju ostatkom cjelobrojnog dijeljenja njene vrijednosti s 32K. Konačnu vrijednost upisujemo registar CAPR. Nakon što je nova pozicija upisana u CAPR mrežna kartica je uspoređuje s vrijednosti u registru CBR. [1] Ako su te vrijednosti jednake to znači da su iz međuspremnika preuzeti svi primljeni okviri. Mrežna kartica će u prvi bit kontrolnog registra (CR) postaviti vrijednost 1 i time signalizirati upravljačkom programu da je preuzeo sve okvire. Upravljački program prije svake iteracije petlje čita vrijednost registra CR i ako je prvi bit postavljen izlazi iz petlje. Nakon što su preuzeti svi primljeni okviri i prije izlaska iz prekidne rutine upravljački program poziva povratnu (eng. callback) funkciju jezgre kako bi obavijestio jezgru da ima okvire koje mora obraditi. U sklopu ovog završnog rada ostvarena je jednostavna povratna funkcija koja provjerava vrijednost člana protocol strukture sk_buff te ako je vrijednost jednaka konstanti ETHERNET poziva funkciju ethernet podsloja za obradu okvira. Paketi nepoznatih protokola se odbacuju. Slika 6.1 Skica registara i međuspremnika za prihvat okvira [2] 19

Slika 6.1 prikazuje registre mrežne kartice čije vrijednosti upravljački program može mijenjati te kako oni pokazuju na međuspremnik za primanje okvira. Važno je primijetiti kako se nigdje u procesu preuzimanja okvira sa žice ne spominje funkcija recv sučelja device_t. Ona nije ostvarena budući da je kartica dizajnirana tako da se primanje okvira obavlja u prekidnoj rutini. Ostvarenjem jezgrenog međuspremnika za mrežne pakete (sk_buff) izbjegli smo potrebu za korištenjem dodatnog međuspremnika za funkciju recv koja bi držala preuzete okvire. Jedno od razmatranih rješenja bilo je i to da prekidna rutina za svaki primljeni okvir obavještava upravljački program i ne miče okvire i opisnike iz međuspremnika. Takva funkcija recv obavljala bi posao preuzimanja okvira i pomicanja pokazivača kartice. Konačno rješenje koristi jezgrin međuspremnik za prijenos okvira zato što smanjuje broj kopiranja podataka za razliku od rješenja koja ostvaruju funkciju recv. Rješenja s jezgrinim međuspremnikom pokazala su se iznimno fleksibilnim u primjeni u drugim operacijskim sustavima poput Linuxa. [4] 20

7. Prikaz rada ostvarena sustava na primjeru Nakon uspješnog ostvarenja upravljačkog programa i proširenja operacijskog sustava preostaje provjeriti funkcionalnost. Emulator QEMU nudi mogućnost spajanja emuliranih računalnih sustava na virtualne lokalne mreže. Kroz virtualnu lokalnu mrežu promet se prenosi TCP transportnim protokolom.... @xterm -e $(QEMU) $(QFLAGS) -kernel $(BINFILE) -net nic,vlan=1,model=rtl8139,macaddr=52:54:00:12:34:56 -net socket,vlan=1,listen=localhost:1234 & @xterm -e $(QEMU) $(QFLAGS) -kernel $(BINFILE)2 -net nic,vlan=1,model=rtl8139,macaddr=52:54:00:12:34:57 -net socket,vlan=1,connect=localhost:1234 &... Kod 7.1 Isječak Makefile datoteke Kod 7.1 je isječak iz Makefile datoteke koji pokreće dva procesa QEMU gdje svaki dobiva vlastiti xterm terminal i sliku (eng. image) operacijskog sustava Benu s upravljačkim programom za RTL8139. Argumenti -net predani QEMU-u pri pokretanju govore da se u emulirani sustav doda mrežnu karticu modela RTL8139. Osim modela zadane su i MAC adrese te virtualna lokalna mreža na koju je kartica spojena. Drugi po redu -net argument je tipa socket i govori QEMUu da promet kartice koja je spojena na virtualnu mrežu jedan preusmjeri na localhost:1234. Važno je primijetiti razliku između poziva s argumentom listen i connect. Obično je na jednoj virtualnoj lokalnoj mreži samo jedan proces pozvan s argumentom listen. To je poslužiteljski proces i on upravlja prometom na toj virtualnoj mreži. Nakon što je pokrenut poslužiteljski proces ostali se emulirani računalni sustavi pokreću s argumentom listen tj. spajaju se na prvi pokrenuti QEMU proces. QEMU virtualne lokalne mreže ne omogućavaju odabir topologije mreže međutim za primjer komunikacije bitno je samo da računalni sustavi mogu razmjenjivati podatke preko mrežnih kartica. 21

Slika 7.1 Primjer sadržaja Ethernet okvira Slika 7.2 Primjer primljenog Ethernet okvira Slika 7.1 prikazuje izgradnju poruke koja se zamata u Ethernet okvir i preko mrežne kartice RTL8139 šalje na emulirani računalni sustav koji je spojen na virtualnu lokalnu mrežu 1. Slika 7.2 prikazuje izlaz računalnog sustava koji je primio poslane podatke. Crvena boja teksta označava ispis jezgre operacijskog sustava. Primljene Ethernet okvire jezgra prosljeđuje Ethernet sloju na obradu što je u ovom slučaju samo ispis na serijski izlaz. 22

Zaključak Cilj zadatka završnog rada bio je ostvariti mrežnu komunikacija dva ili više emuliranih računalnih sustava kojima upravlja operacijski sustav Benu. Za emulaciju koristi se QEMU emulator. Za mrežnu komunikaciju koristi se mrežna kartica RTL8139 koja je u računalni sustav spojena preko PCI sabirnice. U sklopu završnog rada ostvaren je upravljački program za mrežnu karticu. Upravljački program ostvaren je prema sučelju device_t koje definira operacijski sustav. Osim upravljačkog programa ostvarena su tri proširenja za operacijski sustav čiji je cilj jednostavniji upravljački program i olakšanje daljnjeg razvoja operacijskog sustava. Ostvarena proširenja su PCI podsustav koji olakšava rad s PCI uređajima, sučelje za mrežne uređaje net_dev koje operacijskom sustavu omogućuje da mrežne uređaje tretira različito od ostalih i jezgrin međuspremnik za mrežne pakete sk_buff. Kao dokaz funkcionalnosti rješenja pripremljen je jednostavan primjer koji demonstrira komunikaciju dva sustava preko mreže kartice RTL8139. Umreženim računalnim sustavima upravlja operacijski sustav Benu, a mrežne kartice kontrolira ostvareni upravljački program. 23

Literatura [1] Realtek RTL8139 Data Sheet, http://www.cs.usfca.edu/~cruse/cs326f04/rtl8139d_datasheet.pdf, 9.11.2001. [2] Realtek, RTL8139 Programmingguide, http://www.cs.usfca.edu/~cruse/cs326f04/rtl8139_programmersguide.pdf, 15.1.1999. [3] Mohan Jal Jangir, Writing Network Drivers for Linux, http://linuxgazette.net/156/jangir.html, studeni 2008. [4] JonathanCorbet, Alessandro Rubini, GregKroah-Hartman, Linux DeviceDrivers, O'Reilly Media, SAD veljača, 2005. [5] OSDev Wiki, RTL8139, http://wiki.osdev.org/rtl8139 [6] Leonardo Jelenković, operacijski sustav Benu, https://github.com/l30nard0/benu/ [7] Leonardo Jelenković, skripta predavanja predmeta OSUR, http://www.zemris.fer.hr/~leonardo/osur/predavanja, 5.3.2017. [8] OSDev Wiki, PCI, http://wiki.osdev.org/pci 24

Sažetak Naslov: Upravljački programi za mrežnu karticu u operacijskom sustavu Benu Ključne riječi: upravljački program, Realtek, RTL8139, mrežna kartica, operacijski sustav, Benu, Ethernet, mreža, QEMU, PCI, SKB Cilj završnog rada bio je ostvarenje upravljačkog programa za mrežnu karticu koju QEMU može emulirati te izraditi demonstracijski primjer rada upravljačkog programa. Osim upravljačkog program ostvarena su tri proširenja izvornog operacijskog sustava s kojima je osigurana lakša izvedba upravljačkog programa. Proširenja i upravljački program pisani su programskim jezikom C kao i operacijski sustav Benu. Upravljački program je ovisan o arhitekturi sustava i ostvaren je samo za arhitekturu i386. Demonstracija funkcionalnosti sastoji se od pokretanja dva procesa QEMU gdje svaki emulira jedan računalni sustav s mrežnom karticom RTL8139 i različitim MAC adresama. Procesi međusobno komuniciraju TCP protokolom na adresi 127.0.0.1 i portu 1234. 25

Summary Title: NIC drivers for Benu OS Keywords: driver, Realtek, RTL8139, network interface card, NIC, operating system, Benu, Ethernet, network, QEMU, PCI, SKB The goal of this work was the implementation of a driver program for a NIC which can be emulated in QEMU. Along with the driver three major additions to the operating system were developed. These additions used to simplify the implementation of the driver. The driver program and the developed additions were written in the C programming language, same as the Benu operating system. Since the driver program is architecture dependent it was implemented only for the i386 architecture. The demonstration of the driver program consists of two emulated computer systems where each uses RTL8139 NIC for communication. Emulated systems communicate through the TCP protocol on address 127.0.0.1 and port 1234. 26