
DSDT的入门知识.docx
23页1. DSDT:DSDT 是主板BIOS 用来描述主板上硬件设备的代码集合,通过代码告诉操作系统自己的主板上插有什么样的设备,以及对设备具体的描述想使用 DSDT 驱动显卡的前提是,你必须使用第三方 KEXT 驱动了你的显卡,然后获得了一些关于你显卡的具体技术数据完美驱动还是不完美驱动并不重要,我们需要的是得到NVCAP 的值2. 退一步,如果你找不到 KEXT 来驱动你的显卡,你需要做的就是用相似的显卡 NVCAP 的值加入DSDT,运气好的话也能驱动善用论坛搜索3. DSDT 的作用仅仅是描述你硬件(包括硬件位置,ID,型号,一些必须的值比如 NVCAP),告诉 MAC 系统你有显卡这么个东西,MAC 系统然后检查下自己的驱动库里有这么个硬件的驱动没,如果有的话就驱动了,没有的话,你DSDT 写的再好,MAC 也会告诉你,对不起,我不认识你的东西当然,MAC 系统也可能认错,比如你的显卡是 256M NV 9200M GS, 放入 Natit.kext,驱动之后系统概述里显示的是 8400GT,显存只有 128,这并不影响你使用, 这个时候你就要在DSDT 里加入代码告诉他你是 9200 的不是 8400,它读到之后就正确显示了。
后面会告诉你如何获得NACAP 的值4. NACAP 的值并不是每个显卡都不同,相似显卡的NACAP 的值是一样的,多尝试尝试下面开始修改显卡的DSDT 部分我是Insyde 的 BIOS,所以我会以这个BIOS 为例子其他主板修改方法类似修改之前要明白几个 DSDT 的架构,想详细了解的可以参考论坛紫米的帖子,我通俗的描述下我的思路1 显卡在 MAC 里通常描述成 PEGP,有些新手可能会发现,自己的 DSDT 中根本找不到PEGP,咋办呢~好办方法 1,启动MAC 系统,用 IORegistryExplorer 查看你显卡的位置,一般情况下都是 PCI0 的分支下,同样,它肯定也是在你 DSDT 中的DEVICE (PCI0)分支下具体的名字每个主板可能都不一样了,比如我的DSDT 中叫PVGA也有可能叫POP2,名字不重要方法 2,intel 的芯片组一般是Name (_ADR, 0x00010000)搜索这个关键字就可以找到显卡位置在这个显卡项目下有可能出现 GFX0、LCD、VGA、TV、PXS1 这些东西,不过既然是 PC,一般 GFX0 是没有的,这个需要我们加入的,暂且理解为显卡,我不清楚这个,模仿就是了。
2 DSDT 代码程序语言,我不知道怎么编写的,我不太懂编程不过要想修改要有几个原则(我自己的理解,不知道对不对,重要的是结果)1,修改一处就编译一次,直接O 错误,警告可以不理会它,不影响DSDT 的使用2,你想使用一个你 DSDT 中没有的 mothed(XX,XX,X)或者你引用了一个未定义的Device(***),比如,你发现你DSDT 中没PEGP,想手动加入,一旦你加上去了,编译肯定出错,因为编译器不知道你这个玩意PEGP 从哪冒出来的,所以你要先定义它在哪定义在后面说3,注意加入新代码的时候括号要对应,不要让代码这部分漏出来,不然编译器又不知道你想表述什么意思了,出头鸟吗?4,注意两个代码之间加一个空行,还有 DEVICE (PEGP)别顶在开头,用 TAB 键往后撤撤5,如果你遵循第 1 条原则编译之后出现的错误个数很多,那肯定是你新加入的代码有问题,不用看错误描述,按照2,3,4 原则检查你的新加入代码除非你网上复制的代码本身就有错误下面分两种方法加入代码方法 1: 不管位置在哪个地方,只要确定是INTEL 芯片组,显卡肯定在 PCI0 设备的目录下,所以搜索DEVICE (PCI0)(注意是数字 0 不是字母o.)你会看到如果代码(各个BIOS 可能不一样) Device (PCI0){Name (_HID, EisaId ("PNP0A08")) Name (_CID, EisaId ("PNP0A03"))Name (_ADR, Zero)。
把下面显卡的代码加入到Name (_HID, EisaId ("PNP0A08")) 上面一样,也就是PCI0 第一个括号下面Device (PEGP){Name (_ADR, 0x00010000)Device (GFX0){Name (_ADR, Zero) Name (_SUN, One)Method (_DSM, 4, NotSerialized){Store (Package (0x16){"@0,compatible", Buffer (0x0B){"NVDA,NVMac"},"@0,device_type", Buffer (0x08){"display"},"@0,name", Buffer (0x0F){"NVDA,Display-A"},"@1,compatible", Buffer (0x0B){"NVDA,NVMac"},"@1,device_type", Buffer (0x08){"display"},"@1,name", Buffer (0x0F){"NVDA,Display-B"},"NVCAP",Buffer (0x18){/* 0000 */ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00,/* 0008 */ 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,/* 0010 */ 0x00, 0x00, 0x00, 0x00},"VRAM,totalsize", Buffer (0x04){0x00, 0x00, 0x00, 0x10},"device_type", Buffer (0x0D){"NVDA,GeForce"},"model", Buffer (0x18){"Nvidia GeForce 9200M GS"},"rom-revision", Buffer (0x1F){"Nvidia GeForce 9200M GS 256 MB"}}, Local0)DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)) Return (Local0)}}注意数下括号,是偶数一般没问题。
奇数要肯定有问题注意回车留个空行这个时候参考前面的几条原则,发现 PEGP 这玩意没注册呢,编译不认识它,所以我们搜素Method (_L0D, 0, NotSerialized) ,( 一般在比较靠前的位置) 在下面加入 Notify (\_SB.PCI0.PEGP, 0x02) ,把PEGP 给注册了可以参考下我的,注册了好几个呢,因为我修改的多Method (_L0D, 0, NotSerialized){Notify (\_SB.PCI0.EHC1, 0x02) Notify (\_SB.PCI0.EHC2, 0x02) Notify (\_SB.PCI0.PEGP, 0x02) Notify (\_SB.PCI0.HDEF, 0x02)注册代码的意思就是说在PCI0 下面有个 PEGP 设备,各单位注意,不要说见到了PEGP 不认识它编译器自然就认识了这个时候还没有结束,我们是新加入的DEVICE (PEGP)设备,而且Name (_ADR, 0x00010000)这个代码你自己本身 DSDT 的显卡描述中肯定有,所以我们要搜索 Name (_ADR, 0x00010000),然后把它删掉,注意别删除了你刚加入显卡代码的这行,一个DSDT 中保留一个Name (_ADR, 0x00010000)就行了。
这种加入方法,编译不太容易出错,因为不破坏你本身 DSDT 的结构不会出乱七八糟的错误方法 2:搜索 Name (_ADR, 0x00010000),这个就是你显卡的位置,或者你自己查看MAC系统中,你的显卡在什么位置加入上面的代码,注意从DEVICE (GFX0)开始加入以防万一,去上面那个位置注册下你的 DEVICE 名字,比如我的是加入PCI0.PVGA,0X02.不加入不知道会不会编译出错,我没去试我只是这么一说,我也不懂编程之后的东西,所以可能描述的不是很正确勿拍砖)注意括号要对应,自己慢慢数吧下面是NVCAP 的值的获得和显卡代码中各个项的含义及其修改1NVCAP 串值在显卡驱动的情况下,打开终端(一个跟黑电视差不多的东西,在应用程序里),输入 ioreg-l -w0 | grep NVCAP得到一串数字,比如这样04000000000003000c0000000000000700000000,然后2 个两一组, 一行 8 个,放入代码中”NVCAP“的位置如果你用KEXT 没能驱动显卡,给你下面几组值测试下04000000000003001c0000000000000a000000000400000000000f0000000000000000070000000005000000000003000c0000000000000b00000000这些值是从威廉第三的帖子中找的,这里感谢下威廉,希望不要介意我拿过来用用。
2,NV 的显卡上面的代码行几乎不要动,"model", 的数值修改下,本来是"Nvidia GeForce9200M GS",你可以改成你自己的显卡型号,接着修改 Buffer (0x18),这个是用来描述"Nvidia GeForce 9200M GS"这串字符占用的地址空间的这里面的 0X18 是如何获得呢?我们一起来计算以下,从N 开始 字母+空格一共是 23 个字符,在加 1 就是 24,转换成 16 进制就是 0X18,其他的 buffer 一样,公式就是 字母+空格+1 转换成 16 进制输入就行了"VRAM,totalsize", 0x00, 0x00, 0x00, 0x10 代表 256M 显存, 0x00, 0x00, 0x00, 0x20 就是 512 了,0x00, 0x00, 0x00, 0x05 就是 128根据自己的显存修改吧 其他型号的显卡自己看着改吧上面工作全做完了还不够,因为我们还有一个最重要的东西没有定义,DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0)),这个 DTGP 方法编译器找不到,我们要添加进去,很多地方修改DSDT 都需要引用这个DTGP,所以我们加在开头的位置,搜索DefinitionBlock ("dsdt.aml", "DSDT", 1, "HPQOEM", "SLIC-MPC", 0x00000001)在第一个括号下面加入DTGP,代码如下:Method (DTGP, 5, NotSerialized){If (LEqual (Arg0, Buffer (0x10){/* 0000 */ 0xC6, 0xB7, 0xB5, 0xA0, 0x18, 0x13, 0x1C, 0x44,/* 0008 */ 0xB0, 0xC9, 0xFE, 0x69, 0x5E, 0xAF, 0x94, 0x9B})){If (LEqual (Arg1, One)){If (L。
