我使用东芝 Satellite L655 笔记本电脑,最近安装了 Ubuntu 10.10。在 gnome-power-manager 中没有“使用电池”选项。当我运行命令时:dmesg | grep batt
它返回:
[ 0.752856] ACPI: Battery Slot [BAT1] (battery absent)
请任何人帮忙解决这个问题!
thuci@ubuntu:~$ cat /sys/firmware/acpi/tables/DSDT > DSDT.dat
cat: /sys/firmware/acpi/tables/DSDT: Permission denied
答案1
这位博主描述了一个建议的修复方法这里。
我在这里重现了该文章以完成对该问题的回答。
重要提示:建议的修复方法非常复杂,需要您重新编译自己的内核。因此,请做好几个小时工作的准备。我强烈建议您先备份系统 - 例如使用 clonezilla。
我还建议您先阅读博客中的评论,看看是否有任何报告的问题与您有关。由于您使用的是 10.10 - 有一条关于构建 2.6.35 内核的评论可能适用于您。
“问题的原因在于东芝包含了两组启动数据,这些数据会告诉操作系统机器中存在哪些硬件。Windows 读取正确的数据,而 Linux 则不会。我们需要构建自己的内核来实现这一点。我们需要从机器中提取 DSDT(区分系统描述表),修改 ASL,然后编译新的 AML DSDT。以下部分显示了如何告诉 Linux 使用这个修改后的 DSDT,而不是 BIOS 附带的版本。
获取机器的原始 DSDL:
sudo su
cat /sys/firmware/acpi/tables/DSDT > DSDT.dat
拆解
iasl -d DSDT.dat
进行更改:
vi DSDT.dsl
搜索行:OperationRegion (EMEM, SystemMemory, 0xFF808001, 0xFF) 并将其替换为:OperationRegion (EMEM, EmbeddedControl, 0×00, 0xFF) 保存文件。
构建:
iasl -tc DSDT.dsl
这将创建一个文件 DSDT.hex(此文件用于内核重新编译)
我在编译过程中收到以下两个错误
注意:- 您实际上可以忽略这些错误,即使这些错误未修复,这种方法也能奏效。但如果有兴趣,您可以想办法修复这些问题。否则,请直接转到“内核重新编译”部分。
DSDT.dsl 2656: 0x00000000, // Length
Error 4122 - ^ Invalid combination of Length and Min/Max fixed flags
DSDT.dsl 2663: 0x00000000, // Length
Error 4122 - ^ Invalid combination of Length and Min/Max fixed flags
修复:(如果您没有收到任何错误,请跳过此部分)
打开 DSDT.dsl 文件并转到 iasl 指出错误的行。 在我的情况下,我转到第 2656 行和第 2663 行。
iasl 抱怨“长度”行“0×00000000”。这是错误的。查看“范围最小值”和“范围最大值”。打开 Kcalc 或 Gnome 用户使用的任何程序,并将其更改为数字系统模式。确保选择了 HEX,现在我们从最大范围中减去最小范围,然后加 1。由于最小范围是 0(并且您不能减去 0),我将输入 FEAFFFFF,然后加 1,得到 FEB00000(不要混淆,我只是省略了“0x”,计算器不需要这个)。我根据长度将 0×00000000 更改为 0xFEB00000。所以现在它看起来像这样:
0×00000000, // Granularity
0×00000000, // Range Minimum
0xFEAFFFFF, // Range Maximum
0×00000000, // Translation Offset
0xFEB00000, // Length
第 2663 行更改为
0×00000000, // Granularity
0xFED40000, // Range Minimum
0xFED44FFF, // Range Maximum
0×00000000, // Translation Offset
0×00005000, // Length
再次编译。
内核重新编译:
安装必要的软件包:
apt-get install fakeroot kernel-wedge build-essential makedumpfile kernel-package libncurses5 libncurses5-dev
apt-get build-dep --no-install-recommends linux-image-$(uname -r)
mkdir /root/source
cd /root/source
apt-get source linux-image-$(uname -r)
注意:我的 uname -r 是 2.6.38.2-generic
cd linux-2.6.38
(将其替换为您的内核版本)
从当前内核复制内核配置文件:
cp -vi /boot/config-`uname -r` .config
现在将 DSDT.hex 文件复制到内核源内的包含文件夹中
cp DSDT.hex /root/source/linux-2.6.38/include
打开我们刚刚复制的 .config 文件
vi /root/source/linux-2.6.38/.config
进行以下更改
CONFIG_STANDALONE=n
CONFIG_ACPI_CUSTOM_DSDT=y
CONFIG_ACPI_CUSTOM_DSDT_FILE="DSDT.hex"
保存并退出。
我的密码:/root/source/linux-2.6.38
开始编译内核:
make menuconfig
加载.config文件,保存菜单文件并退出。
我们即将开始编译过程。您可以使用一个小技巧来设置 CONCURRENCY_LEVEL 变量来加快内核的编译速度。该数字应该是您拥有的处理器数量加一。所以在我的情况下,我有一个双核处理器,所以我将加一,也就是三。
export CONCURRENCY_LEVEL=3
开始构建:
这里我将我的自定义内核命名为 tuxsage,请将其替换为您期望的内核。
make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-tuxsage kernel-image kernel-headers
(这需要一些时间)
一旦完成,你将在当前目录的上一级目录中找到构建的内核
cd /root/source
dpkg -i linux-image-2.6.38.(This part will be whatever name you gave it).deb
dpkg -i linux-headers-2.6.38.(This part will be whatever name you gave it).deb
制作 initramfs:
update-initramfs -c -k 2.6.38+tuxsage (replace tuxsage with correct name)
更新Grub:
update-grub
重新启动到新内核”