Δημοσιεύτηκε: 22 Απρ 2011, 14:22
από simosx
Έχουμε ένα φορητό υπολογιστή και παρατηρούμε ότι με Linux δε λειτουργεί τόσο καλά.
Συγκεκριμένα, η εξοικονόμηση ενέργειες (power saving ή ACPI) φαίνεται να είναι προβληματική.
Και όταν χρησιμοποιούμε τον υπολογιστή με μπαταρία, η μπαταρία διαρκεί πολύ λίγο.

Ποια είναι η πηγή του προβλήματος;

Η πιο πιθανή πηγή του προβλήματος είναι το προβληματικό BIOS του υπολογιστή.
Στο BIOS υπάρχει περιγραφή του υλικού του υπολογιστή μας και οδηγίες για το πως να γίνει η εξοικονόμηση ενέργειες.
Και πολλές φορές το BIOS δεν έχει ελεγχθεί από τον κατασκευαστή αν δουλεύει με Linux.

Μπορούμε να δούμε το αρχείο καταγραφής dmesg (τρέχουμε dmesg από το τερματικό) για να διαπιστώσουμε
αν υπάρχουν μηνύματα όπου ο πυρήνας εντόπισε προβλήματα ACPI στο BIOS. Ρωτήστε παρακάτω για περισσότερα.

Ο άλλος τρόπος μελέτης του προβλήματος είναι με,

1. Η περιγραφή του υλικού του υπολογιστή μας και το πως το BIOS λέει να γίνεται η εξ. ενέργειας,
βρίσκεται σε αυτό που λέμε πίνακες DSDT (DSDT Tables).

2. Εγκαθιστούμε το μεταγλωττιστή DSDT με
Κώδικας: Επιλογή όλων
sudo apt-get install iasl


3. Εξάγουμε τους πίνακες DSDT με
Κώδικας: Επιλογή όλων
sudo cat /sys/firmware/acpi/tables/DSDT > /tmp/dsdt.dat

Το αρχείο /tmp/dsdt.dat έχει το κομμάτι του BIOS του υπολογιστή που είναι οι πίνακες DSDT, και είναι σε μορφή μεταγλωττισμένη (δυαδική - binary)

4. Κάνουμε την αντίστροφη μεταγλώττιση (decompiling) του dsdt.dat ώστε να παραχθεί ο πηγαίος κώδικας των πινάκων DSDT.
Κώδικας: Επιλογή όλων
cd /tmp
iasl -d /tmp/dsdt.dat


Το νέο αρχείο, dsdt.dsl, είναι ο πηγαίος κώδικας των πινάκων DSDT, και περιγράφει πως πρέπει να εξοικονομεί ενέργεια ο υπολογιστής μας.

5. Τώρα μεταγλωττίζουμε ξανά το dsdt.dsl για να διαπιστώσουμε αν μεταγλωττίζεται σωστά.
Κώδικας: Επιλογή όλων
cd /tmp
iasl -tc /tmp/dsdt.dsl

Εδώ βλέπουμε για σφάλματα. Αν έχετε προβλήματα με εξ. ενέργειες, και βλέπετε σφάλματα, μπορεί να σχετίζονται.

Παράδειγμα σφάλματος
Κώδικας: Επιλογή όλων
dsdt.dsl  1349:                     0x00000000,         // Length
Error    4122 -                              ^ Invalid combination of Length and Min/Max fixed flags

dsdt.dsl  1363:                     0x00000000,         // Length
Error    4122 -                              ^ Invalid combination of Length and Min/Max fixed flags

dsdt.dsl  3474:                                         Or (TMOR, TMPV)
Warning  1106 -     Result is not used, operator has no effect ^

ASL Input:  dsdt.dsl - 7536 lines, 235421 bytes, 2976 keywords
Compilation complete. 2 Errors, 1 Warnings, 0 Remarks, 17 Optimizations



Παράδειγμα κώδικα DSL (πηγαίος κώδικας του DSDT)
Κώδικας: Επιλογή όλων
...
                If (_OSI ("Linux"))
                {
                    Store (0x03E8, OSYS)
                }

                If (_OSI ("Windows 2006"))
                {
                    Store (0x07D6, OSYS)
                }

                If (_OSI ("Windows 2009"))
                {
                    Store (0x07D9, OSYS)
                }
...

Αυτό σημαίνει ότι εκτός από γενικά σφάλματα, υπάρχει και το ζήτημα να δίνονται τιμές στο BIOS για Linux που να μην έχουν δοκιμαστεί σωστά.

Υπάρχει μια περίπλοκη διαδικασία επίλυσης του προβλήματος, όπου ζητάμε να μάς φτιάξουν το DSDT
και μεταγλωττίζουμε τον πυρήνα Linux οι ίδιοι, και με ειδικό τρόπο φορτώνουμε το διορθωμένο DSDT κατά την εκκίνηση του υπολογιστή.
Δηλαδή, αντί το Linux να διαβάζει τους πίνακες DSDT από το BIOS, μπορούμε να επιλέξουμε να τους διαβάζει από αρχείο, το διορθωμένο DSDT.

Ως φόρουμ, με τον οδηγό αυτό, μπορείτε να δοκιμάσετε τις παραπάνω εντολές για να δείτε την κατάσταση που είναι το BIOS σας,
και να συζητήσουμε πόσο κρίσιμο είναι το πρόβλημα.
Για περισσότερα δείτε HOWTO Fix A Buggy DSDT File.
Αν δεν είστε σίγουροι για κάτι, ρωτήστε εδώ. Μερικές από τις ενέργειες (που δεν περιγράφουμε εδώ) μπορεί να δημιουργήσουν πρόβλημα στον υπολογιστή σας.