歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux環境Thinkpad X61 4G內存Mtrr表錯誤

Linux環境Thinkpad X61 4G內存Mtrr表錯誤

日期:2017/2/28 16:58:03   编辑:Linux教程

Thinkpad X61 加到4G內存之後, Linux下面發現顯卡速度比較慢, 性能明顯下降. 最明顯的是用wine運行星際爭霸或者魔獸爭霸的時候, 鼠標反應非常慢.

用dmesg命令可以看到

mtrr: type mismatch for e0000000,10000000
old: write-back new: write-combining

在/var/log/Xorg.0.log中也看到有同樣的字樣.

查看一下/proc/mtrr

reg00: base=0xc0000000 (3072MB), size=1024MB: uncachable, count=1
reg01: base=0x13c000000 (5056MB), size= 64MB: uncachable, count=1
reg02: base=0x00000000 ( 0MB), size=4096MB: write-back, count=1
reg03: base=0x100000000 (4096MB), size=1024MB: write-back, count=1
reg04: base=0xbf700000 (3063MB), size= 1MB: uncachable, count=1
reg05: base=0xbf800000 (3064MB), size= 8MB: uncachable, count=1

其中在運行X的時候, 顯卡需要在mtrr表中注冊e0000000,10000000(256M大小)這段地址為write-combining, 這種模式會提升顯卡速度2.5倍.但是這段地址已經被注冊為write-back模式, 所以造成這個問題.

關於這個bug, 見: https://bugs.launchpad.net/linux/+bug/210780

這個頁面提供了一個腳本(http://launchpadlibrarian.net/13330029/fix-mtrrs.sh), 解決這個問題.

我把腳本改了一下, 符合我的機器的設置, 但是還有一個問題, Mtrr表最多支持8個記錄, 我只好刪掉一個overlap的項(不知道是否有更好的辦法, 反正還沒有出現別的問題), 來支持這段內存地址為write-combining模式. 運行fix腳本之後的mtrr:

reg00: base=0xc0000000 (3072MB), size= 512MB: uncachable, count=1
reg01: base=0x13c000000 (5056MB), size= 64MB: uncachable, count=1
reg02: base=0x00000000 ( 0MB), size=2048MB: write-back, count=1
reg03: base=0x100000000 (4096MB), size=1024MB: write-back, count=1
reg04: base=0xf0000000 (3840MB), size= 256MB: uncachable, count=1
reg05: base=0xbf800000 (3064MB), size= 8MB: uncachable, count=1
reg06: base=0x80000000 (2048MB), size=1024MB: write-back, count=1
reg07: base=0xe0000000 (3584MB), size= 256MB: write-combining, count=1

修改後的腳本rc.mtrr(放在/etc/rc.d目錄下, 在rc.local裡面執行)如下:

#!/bin/bash

MTRR=/proc/mtrr

echo "disable=2" > $MTRR
echo "base=0x00000000 size=0x80000000 type=write-back" > $MTRR
echo "base=0x80000000 size=0x40000000 type=write-back" > $MTRR

echo "disable=0" > $MTRR
echo "disable=4" > $MTRR
echo "base=0xc0000000 size=0x20000000 type=uncachable" > $MTRR
#echo "base=0xe0000000 size=0x10000000 type=write-combining" > $MTRR
echo "base=0xf0000000 size=0x10000000 type=uncachable" > $MTRR

其中最後注釋的一行就是顯卡需要的一段地址, 因為X啟動的時候會自動注冊, 所以只要留出來這段就行了, 這行代碼可以注釋掉.

Copyright © Linux教程網 All Rights Reserved