Programmazione a oggetti in C nel kernel di Linux. Luca Ceresoli

Documenti analoghi
Ingegneria del Software

Corso di Programmazione ad Oggetti

Grammatica di base: Pointers

Java Native Interface Appunti

Programmazione Orientata agli Oggetti in Linguaggio Java

Corso di Fondamenti di Informatica

La struttura dati ad albero binario

Eredità in C++ Corso di Linguaggi di Programmazione ad Oggetti 1. a cura di Giancarlo Cherchi

Le operazioni di allocazione e deallocazione sono a carico del sistema.

Pila.h versione 6. class Pila { private: int marker; int * contenuto; public:

Corso Programmazione 1 Capitolo 01: Concetti Elementari

Variabili e tipi di dato

Dynamic Linking. Introduzione Creazione di una libreria dinamica Uso di una libreria dinamica

Visibilità dei Membri di una Classe

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Elettronica dei Sistemi Programmabili A.A Microcontrollori. Introduzione allo sviluppo di progetti

!"#$%&&'()#*%+%+!"#$"',,'()#*%+ -")%*&'&'+'$.)+-$$%&&) !"#$%&&'(%)'*+%",#-%"#.'%&'#/0)-+#12"+3,)4+56#7+#.')8'9

Gestione di files Motivazioni

Appello di Informatica B

dall argomento argomento della malloc()

Programmazione Orientata agli Oggetti in Linguaggio Java

Introduzione ai Device Drivers in Linux. E.Mumolo, DEEI

INFORMATICA E PROGRAMMAZIONE PROF. M. GIACOMIN ESPERIENZA IN AULA: ELABORAZIONE DI IMMAGINI A COLORI IN LINGUAGGIO C

Programmazione a Oggetti Lezione 10. Ereditarieta

Introduzione a.net (2)

Università degli Studi di Cassino Corso di Fondamenti di Informatica Puntatori. Anno Accademico 2010/2011 Francesco Tortorella

Introduzione. Laboratorio di Calcolo Corso di Laurea in Fisica. Università degli Studi di Roma La Sapienza

Programmazione a oggetti e JAVA. Prof. B.Buttarazzi A.A. 2011/2012

Introduzione alla programmazione in C

Esercizi di programmazione in C

File e Directory. M. Guarracino - File e Directory 1

Compito di Fondamenti di Informatica

costruttori e distruttori

Laboratorio di Algoritmi e Strutture Dati

Drivers. Introduzione Tipologie Struttura Interazione con il kernel

Comunicazione Digitale

Introduzione alla Programmazione ad Oggetti in C++

I puntatori e l allocazione dinamica di memoria

DESIGN PATTERN CREAZIONALI INGEGNERIA DEL SOFTWARE INTRODUZIONE SINGLETON. Scopo dei design pattern creazionali

DATI IDENTIFICATIVI DEL PROGETTO

strutturare dati e codice

Corso di Grafica Computazionale

Le variabili. Olga Scotti

15 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

Introduzione a Classi e Oggetti

Java: Compilazione e Traduzione. Fondamenti di Informatica L-B Esercitazione n 3 Introduzione a JAVA. C: Editing, compilazione, esecuzione

Laureando: Damiano Vittor. Relatore: Dott. Ing. Massimiliano Nolich

Librerie. Laboratorio di Informatica Antonio Monteleone 28

14 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Studio dello standard mediante il simulatore di reti ns-3

Programmazione ad eventi in PHP Implementare gli eventi e gestire una coda di messaggi

C++ dlopen mini HOWTO

Programmazione AA

Programmazione ad Oggetti Modulo A (Esame del 11/9/2015)

AA Nomi, binding

Linguaggio C. Fondamenti. Struttura di un programma.

Computazione multi-processo. Condivisione, Comunicazione e Sincronizzazione dei Processi. Segnali. Processi e Threads Pt. 2

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

Alfabeto ed elementi lessicali del linguaggio C

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Corso Base. Liceo Norberto Rosa Bussoleno Prof. Angelo GIORGIO

Overview. Linux Security Modules (LSM) I moduli del kernel. Linux e i moduli. Vantaggi e svantaggi. La nascita di LSM

IL CONCETTO DI FILE. È illecito operare oltre la fine del file.

Object Oriented Programming

Rea Re l a Time Audio Stre Str aming con: w w w. p o r t a u d i o. c o m

Il software e la programmazione

Le Liste. Elisa Marengo. Università degli Studi di Torino Dipartimento di Informatica. Elisa Marengo (UNITO) Le Liste 1 / 31

3. Terza esercitazione autoguidata: progetto gestione voli

1: /* Nome del programma: gestione_articoli_01.cpp 2: Realizzato da: Gaetano Della Cerra 3: Data: 06/02/ III Informatica Serale I.T.I.S.

Programmazione Orientata agli Oggetti in Linguaggio Java

2) FILE BINARI: è una sequenza di byte avente una corrispondenza uno a uno con la sequenza ricevuta dal dispositivo esterno.

Distributed Object Computing

Pile (stacks) e code (queues)

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Le command line di Java

Gestione dei File in C

3) Il seguente numerale A1F0 in base 16 a quale numero in base 10 corrisponde?

PROGRAMMAZIONE AVANZATA JAVA E C. Massimiliano Redolfi. Lezione 7: Code, Stack, Liste PAJC. Ricerca. prof. Massimiliano Redolfi PAJC

SISTEMI OPERATIVI 3 febbraio 2014 corso A nuovo ordinamento e parte di teoria del vecchio ordinamento indirizzo SR

DESIGN PATTERN STRUTTURALI INGEGNERIA DEL SOFTWARE INTRODUZIONE ADAPTER. Scopo Convertire l interfaccia di una classe in un altra.

Sottoprogrammi: astrazione procedurale

Corso di Laboratorio 2 Programmazione C++ Silvia Arcelli. 20 Ottobre 2014

Esercizio: gestione di un conto corrente

Sicurezza del File System

Laboratorio di Algoritmi e Strutture Dati

ARRAY BIDIMENSIONALI float [][] mx = new float[3][4]; (float []) [] mx = new float[3][4];

IPC System V. Code di messaggi

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

ESERCIZIO 1 (Definizione funzioni passaggio parametri per copia)

KERNEL ROOTKIT ATTACCHI E CONTROMISURE

Laboratorio di Progettazione di Sistemi Software Progetto: modellazione di un dominio e sue attività

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Laboratorio di Algoritmi e Strutture Dati

Esercizio 1. Esercizio 2

IEIM. Esercizio Gestione Automobili Strutture e Files Alessandro A. Nacci nacci@elet.polimi.it - alessandronacci.it

Esercizio 1. Esercizio 1

Utilizzo e scrittura di classi

Lezione E12. Sistemi operativi open-source, embedded e real-time

Transcript:

Programmazione a oggetti in C nel kernel di Linux Luca Ceresoli

Introduzione

Programmazione non orientata agli oggetti Il software è un insieme di procedure che manipolano dati Le procedure accedono ai dati direttamente

Esempio: shopping cart struct Item { string name; int price; }; int main() { list<item> cart1, cart2; Item kr = {"The C Programming Language", 53}; Item bs = {"The C++ Programming Language", 56}; Item bc = {"Understanding the Linux Kernel", 45}; cart1push_back(kr); cart1push_back(bs); cart2push_back(kr); cart2push_back(bc); int total1 = 0, total2 = 0; for (Item &i: cart1) total1 += iprice; for (Item &i: cart2) total2 += iprice; cout << "Cart1 total: " << total1 << endl; cout << "Cart2 total: " << total2 << endl; }

Programmazione orientata agli oggetti Ogni entità logica è rappresentata da un oggetto Un oggetto contiene: proprietà: i dati che la definiscono metodi: possibili azioni che agiscono sui dati Classe: descrizione astratta di oggetti dello stesso tipo

Esempio ad oggetti /1 struct Item { string name; int price; }; class ShoppingCart { public: void add(item &item); int gettotal(); private: list<item> items; }; void ShoppingCart::add(Item &item) { itemspush_back(item); } int ShoppingCart::getTotal() { int total = 0; for (Item &i: items) total += iprice; return total; }

Esempio ad oggetti /2 int main() { ShoppingCart cart1, cart2; Item kr = {"The C Programming Language", 53}; Item bs = {"The C++ Programming Language", 56}; Item bc = {"Understanding the Linux Kernel", 45}; cart1add(kr); cart1add(bs); cart2add(kr); cart2add(bc); cout << "Cart1 total: " << cart1gettotal() << endl; cout << "Cart2 total: " << cart2gettotal() << endl; }

Linguaggio C Un linguaggio a oggetti (C++) offre molti vantaggi Ma molti software sono tuttora scritti in C Software semplici Firmware per microcontrollori Utility di dimensioni contenute Ma anche software molto complessi (e strutturati a oggetti) Linux kernel GTK+ EFL

Classi e oggetti in C

Classi e oggetti in C In C si possono creare delle classi usando le struct Contengono le proprietà (dati), non i metodi Per ricreare i metodi usiamo normali funzioni Che come primo parametro ricevono un puntatore alla struct Proprietà e metodi non sono legati dal linguaggio, ma da una convenzione

Esempio ad oggetti in C struct ShoppingCart { Item items[100]; }; int main() { ShoppingCart cart1, cart2; shoppingcart_initialize(&cart1); shoppingcart_initialize(&cart2); Item kr = {"The C Programming Language", 53}; Item bs = {"The C++ Programming Language", 56}; Item bc = {"Understanding the Linux Kernel", 45}; shoppingcart_add(&cart1, &kr); shoppingcart_add(&cart1, &bs); shoppingcart_add(&cart2, &kr); shoppingcart_add(&cart2, &bc); cout << "Cart1 total: " << shoppingcart_get_total(&cart1) << endl; cout << "Cart2 total: " << shoppingcart_get_total(&cart2) << endl; }

Ereditarietà e polimorfismo

Da una classe base, se ne crea un altra (sottoclasse) che ne eredità proprietà e metodi e ne aggiunge di nuovi o modifica il comportamento di quelli esistenti Si crea una gerarchia di classi Ereditarietà Shape int x, y; draw(); Polygon Circle int radius Rectangle int width, height; diagonallength();

Polimorfismo Lo stesso metodo può agire su oggetti di classi diverse Ogni sottoclasse può aumentare o sostituire il metodo della classe base Esempio: Shape::draw() può essere chiamato su oggetti Rectangle o Circle

Il kernel di Linux

Il kernel È il nocciolo del sistema operativo Gestisce tutte le risorse hardware, i processi, la memoria e molto altro Scritto in C Fortemente strutturato ad oggetti Il device model: struttura dei device e dei device drivers Il Virtual Filesystem: gestione uniforme di diversi filesystem

Il device model Modello a oggetti di tutte le periferiche del computer Introdotto in Linux 26 (2003) Permette: Power management Visibilità all utente delle periferiche connesse sysfs lshw Hotplug Object lifecycle

Il device model class diagram struct kobject struct device struct input_dev struct device_driver struct usb_device struct hid_driver

struct kobject Classe base da cui derivano le altre Collegamenti tra oggetti Esempio: un device USB punta all hub USB cui è connesso Rappresentazione in sysfs Attributi del kobject diventano file in /sys Collegamenti (puntatori) tra kobject diventano link in /sys Generazione eventi hotplug Reference counting

Ereditarietà dei dati

Ereditarierà dei dati in C++ class Shape { private: float x, y; } class Circle : public Shape { public: float left() { return (x - radius); } float right() { return (x + radius); } private: float radius; }

Ereditarierà dei dati in C nel kernel Realizzata con diverse tecniche Embedded structures (il più utilizzato) Unions Void pointers

Embedded structures /1 struct kobject struct kobject { const char *name; struct kobject *parent; struct kernfs_node *sd; /* sysfs directory entry */ struct kref kref; /* */ }; Source: http://lxrfree-electronscom/source/include/linux/kobjecth?v=48#l63

Embedded structures /2 struct device eredita da struct kobject struct device { struct kobject kobj; struct dev_pm_info power; struct dev_pm_domain *pm_domain; dev_t devt; /* dev_t, creates the sysfs "dev" */ /* */ }; Source: http://lxrfree-electronscom/source/include/linux/deviceh?v=48#l780

Embedded structures /3 struct input_dev eredita da struct device struct input_dev { const char *name; unsigned long evbit[bits_to_longs(ev_cnt)]; unsigned long keybit[bits_to_longs(key_cnt)]; struct device dev; /* */ }; Source: http://lxrfree-electronscom/source/include/linux/inputh?v=48#l121

Accesso ai dati Dalla classe derivata alla classe base: my_input_devicedevpower my_input_devicedevkobjname Dalla classe base alla classe derivata: container_of()

La macro container_of() container_of(ptr, type, member) http://lxrfree-electronscom/source/include/linux/kernelh?v=48#l830 Esempio: to_input_dev() dato un puntatore a struct device restituisce un puntatore alla struct input_device che lo contiene struct input_dev { unsigned long evbit[bits_to_longs(ev_cnt)]; unsigned long keybit[bits_to_longs(key_cnt)]; struct device dev; /* */ }; #define to_input_dev(d) container_of(d, struct input_dev, dev) Source: http://lxrfree-electronscom/source/include/linux/inputh?v=48#l121

Ereditarietà dei metodi

vtable Virtual Method Table (o vtable) Un insieme di puntatori a funzione Ciascuno implementa un metodo della classe

vtable /1 struct device_driver: un generico driver HID (Human Interface Device) struct hid_driver { char *name; int (*event)(struct hid_device *hdev, struct hid_field *field, struct hid_usage *usage, s32 value); /* private: */ struct device_driver driver; /* */ }; Source: http://lxrfree-electronscom/source/include/linux/hidh?v=48#l679

vtable /2 struct mt_driver: un driver HID multitouch static int mt_event(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, s32 value) { /* */ } static struct hid_driver mt_driver = { name = "hid-multitouch", id_table = mt_devices, /* */ event = mt_event, /* */ }; Source: http://lxrfree-electronscom/source/drivers/hid/hid-multitouchc?v=48#l1520

vtable /3 hid-corec: implementazione della classe hid_driver static void hid_process_event(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, s32 value, int interrupt) { struct hid_driver *hdrv = hid->driver; /* */ if (hdrv && hdrv->event && hid_match_usage(hid, usage)) { ret = hdrv->event(hid, field, usage, value); if (ret!= 0) { if (ret < 0) hid_err(hid, "%s's event failed with %d\n", hdrv->name, ret); return; } } /* */ } Source: http://lxrfree-electronscom/source/drivers/hid/hid-corec?v=48#l1237

Conclusioni

Conclusioni La programmazione a oggetti si può fare con un linguaggio non ad oggetti Le tecniche usate in C sono spesso quelle che i compilatori C++ usano sotto il cofano Svantaggi Molto più faticosa Codice più prolisso e meno leggibile Vantaggi Più controllo su ciò che succede Si possono usare tecniche differenti in base alle necessità Ad esempio per ottimizzare le prestazioninei punti critici

Grazie per l attenzione! Domande? luca@lucaceresolinet http://lucaceresolinet Copyright 2016, Luca Ceresoli Materiale rilasciato sotto licenza Creative Commons Attribution - Share Alike 30 https://creativecommonsorg/licenses/by-sa/30/

Bibliografia Object-oriented design patterns in the kernel Part 1: https://lwnnet/articles/444910/ Part 2: https://lwnnet/articles/446317/ Object-oriented techniques in C http://dmitryfrankcom/articles/oop_in_c