ubuntu heading for proriertary binary drivers installation by default

Giorgos Keramidas keramida at ceid.upatras.gr
Mon Nov 20 15:41:06 EET 2006


On 2006-11-20 10:17, Nick Demou <ndemou at gmail.com> wrote:
>
>   The developers are well aware of the problems with using
>   these drivers. For example, there are the ___simple___
>   technical problems that support for the drivers is completely
>   dependent on the hardware vendor. And, then, when the vendor
>   does make a bug fix, that "improvement" will require careful
>   testing, since the developers won't know what was changed in
>   the update. Of course, on top of that, there are the
>   ___philosophical___ objections to using binary drivers in
>   Linux.
> 
> Ισώς βέβαια να μην καταλαβαίνω καλά το θέμα και να υπερβάλω. Προς
> τούτο:
>
> <> Έχει κανείς κανένα link που να διαπραγματεύται το θέμα σε βάθος και
> με references?
>
> <> Έχει κανείς links που να ξεκαθαρίζουν τι είναι το ABI και τι είναι
> το API[1]?

Σε θέματα που έχουν σχέση με ανάπτυξη λογισμικού και υπολογιστές, οι
συντομογραφίες `API' και `ABI' αναφέρονται στα εξής πράγματα:

    http://en.wikipedia.org/wiki/Application_Programming_Interface
    http://en.wikipedia.org/wiki/Application_Binary_Interface

Η διαφορά ενός `API' από ένα `ABI' δε φαίνεται, αρχικά, να είναι σημαντική.
Ειδικά αν κανείς στηριχτεί στην περιγραφή του API της Wikipedia, που λέει:

    One of the secondary purposes of an API is to describe how
    computer applications and software developers may access a
    set of (usually third party) functions (for example, within a
    library) without requiring access to the source code of the
    functions or library, or requiring a detailed understanding
    of the functions' internal workings.

Διαβάζοντας αυτό το κείμενο, μπορεί να σκεφτεί κανείς:

    ``Εντάξει, αφού δεν έχεις τον πηγαίο κώδικα, ποιά είναι η σημαντική
    διαφορά από ένα ABI;''

Η σημαντική διαφορά φαίνεται ελάχιστα στην σελίδα της Wikipedia σχετικά με
τα ABIs, όταν λέει:

    An ABI differs from an application programming interface
    (API) in that an API defines the interface between source
    code and libraries, so that the same source code will compile
    on any system supporting that API, whereas an ABI allows
    compiled object code to function without changes on any
    system using a compatible ABI.

> [1]: νομίζω ότι καταλαβαίνω αλλά επειδή δεν έχω εντρυφήσει στα εσωτερικά
> της ανάπτυξης του kernel και πέρασαν και μερικά χρόνια από τότε που έκανα
> compile/link τελευταία φορά μπορεί και να κανω κάποιο σοβαρό λάθος. Για
> την ακρίβεια πιστευώ ότι το API είναι το interface specification το οποίο
> αξιοποιεί ο προγραμματιστής σε επιπεδο source για να καλέσει ρουτίνες του
> kernel (π.χ. στο API θα δεις το όνομα της function ) ενώ ABI είναι το
> ίδιο πράγμα αλλά σε επίπεδο κώδικα μηχανής (π.χ. στο ABI θα δεις την
> διευθηνση της function).

Είσαι κοντά.  Ένα `ABI' μπορεί να είναι η συμβατότητα ακόμα και σε επίπεδο
δομής των δεδομένων, όπως αυτά αποθηκεύονται στη μνήμη.  Ένα παράδειγμα
είναι η δομή ενός `sockaddr_in' structure (internet socket address, σε BSD
sockets API).  Ο ορισμός του sockaddr_in σε επίπεδο `API' μπορεί να είναι
κάτι τόσο απλό όσο ένα C header file που λέει:

        /* Socket address, internet style. */
        struct sockaddr_in {
                uint8_t         sin_len;
                sa_family_t     sin_family;
                in_port_t       sin_port;
                struct in_addr  sin_addr;
        };

Αυτό είναι αρκετό για να μπορέσει ένα πρόγραμμα να κάνει 'link' με την
βιβλιοθήκη `libsocket.so' και να περάσει arguments με τον σωστό τύπο στη
συνάρτηση connect().  Δεν είναι όμως αρκετό για να ξέρει κανείς την
*ακριβή* αναπαράσταση ενός `struct sockadd_in' στη μνήμη.  Για παράδειγμα,
το C standard λέει ότι ο compiler μπορεί να χρησιμοποιήσει `padding' μεταξύ
των members ενός struct (επειδή π.χ. ο compiler ξέρει πως έτσι θα κοστίζει
λιγότερους κύκλους μηχανής η προσπέλαση ενός από τα members).

Αυτό μπορεί να σημαίνει πως στο μηχάνημα Α, ένα `struct sockaddr_in' έχει
την εξής μορφή στη μνήμη:

    08 02 00 19 7f 00 00 01
    ||                      --> sizeof(struct sockadd_in)
       ||                   --> AF_INET
          |-----|           --> 0x0019     (25/smtp σε network byte-order)
                |---------| --> 0x7F000001 (127.0.0.1 σε network byte-order)

Η ακριβής θέση αυτών των bytes είναι αυτό που καθορίζει το `ABI'.  Αν
αλλάξει η `binary αναπαράσταση ενός sockadd_in' (π.χ. επειδή κάποιος
πρόσθεσε ένα παραπάνω πεδίο μεταξύ sin_len και sin_family, ή επειδή δεν
έκανε compile με τις σωστές παραμέτρους), τότε έχει αλλάξει και το `ABI'.

Προσοχή πως μπορεί το `API' (ο ορισμός των πεδίων της δομής στο header
file) να παραμείνει το ίδιο, αλλά το `ABI' (η ακριβής αναπαράσταση των
πεδίων, σε binary μορφή στη μνήμη) να αλλάξει.  Αυτό γίνεται συνήθως επειδή
κάποιος χρησιμοποίησε λάθος επιλογές στον compiler, ας πούμε.

Μετά από όλα αυτά, είναι προφανής πιστεύω η σημασία που έχει ένα σταθερό
`API' είναι προφανής για κάποιον που έχει πρόσβαση στον πηγαίο κώδικα.
Όταν αναφερόμαστε όμως σε binary-only, thirdparty drivers, και ειδικά σε
πράγματα που αφορούν ένα τόσο κρίσιμο κομμάτι όσο ο πυρήνας του
λειτουργικού, έχει εξίσου μεγάλη σημασία και η σταθερότητα του `ABI'.

Μια εταιρεία που βγάζει binary drivers για Linux, δε μπορεί να κάνει
rebuild ειδικό version για κάθε χρήστη Gentoo που τη βρίσκει να κάνει
compile τον πυρήνα του με extreme GCC options `επειδή είναι cool'.

Η ίδια εταιρεία δε μπορεί να συντηρεί σε binary-μορφή 800 διαφορετικές
εκδόσεις του driver της, επειδή ανά δύο minor-minor versions ο πυρήνας
αλλάζει δομή στις εσωτερικές του δομές.

Οπότε, για αυτό ασχολείται ο κόσμος *και* με το ABI του πυρήνα όταν
αναφέρεται το θέμα των binary-only drivers.

<Ελαφρώς off-topic & ξεδιάντροπη "διαφήμιση">

Προσωπικά, με ενοχλούν οι binary-only drivers και πιστεύω ότι δεν είναι
σχεδόν ποτέ καλή ιδέα.  Κατανοώ όμως *γιατί* κάποια εταιρεία θα προτιμούσε
ένα πιο σταθερό `kernel ABI' για το Linux (και οποιοδήποτε άλλο λειτουργικό
σύστημα, φυσικά).

Ακριβώς αυτοί οι λόγοι που αναφέρονται παραπάνω, και η σημασία ενός
σταθερού kernel ABI, είναι από τα πιο ελκυστικά χαρακτηριστικά του FreeBSD
για μένα.  Η εγγύηση ότι ένα πρόγραμμα, κι ένας kernel driver, που παίζουν
για την έκδοση 6.0 θα παίζουν με τον ίδιο τρόπο και για την έκδοση 6.1, και
για την έκδοση 6.2, και (μετά από 3-4 χρόνια) για την έκδοση 6.15, είναι
πιστεύω ιδιαίτερα ελκυστική :)

</Ελαφρώς off-topic & ξεδιάντροπη "διαφήμιση">




More information about the Linux-greek-users mailing list