[FZH] 谢谢 coreboot, 我懂得了内存是如何被 BIOS 识别的
by microcai
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
首先必须明确的一点是, BIOS 运行初期,CPU 其实是不能访问内存的。
BIOS 所在的 FLASH 是那种可以被 CPU 直接寻址的 FLASH 芯片。被都固定在
0x4FFFF (记不清具体地址了) 地址上了。类似 ARM 使用的 NOR FLASH。 uboot
就在 NOR FLASH上。
然后,BIOS 初始化代码开始通过寄存器和北桥芯片沟通。
因为 BIOS 就是版卡厂商制作的,这不成问题。使用固化的 IO 地址就可以了。
成功和北桥联系上后, BIOS 继续前进,利用北桥提供的寄存器操控SMBUS, SMBUS
是一种 I2C 总线,每个 SMBUS 设备都有一个固定的地址。SDRAM 的 EEPROM 就可
以通过 SMBUS 访问! 而 SDRAM 通常在 0x50 ~ 0x53 这4个地址上,对于主板上
的4个内存插槽。不过,主板厂商也可以改变这些地址。反正 BIOS 是自己出的,
可以固化这些地址,无所谓。
读取 SDRAM eeprom 里超过 17 个参数后。 BIOS 就可以使用这些参数设置好北桥
的寄存器了。而在这之前, BIOS 严重依赖 CPU 的寄存器做这些操作,不能使用
任何内存! 北桥用来控制内存的寄存器地址,又是一个每个版卡都不一样的地方
了。无所谓, BIOS 自己出,爱怎么用就怎么用。
搞定内存之后, BIOS 终于可以使用内存啦! BIOS 将内存的前 4k 作为临时
stack 开始进入了第二步初始化,这个使用有了内存,就可以使用函数了。
前面,因为无法使用内存,无法进行复杂的运算,要小心编写汇编指令,全部使用
寄存器进行操作,所以没法进行复杂的运算。现在有 RAM 可以用了,自然就有内
存了。
BIOS 通过检查可用的内存值,将自己使用的临时 stack 移步到 > 640K 的地
方。 开始继续下面的工作。
下面, BIOS 该开始检测 CPU 了。主要的工作是比较 CPU 的微代码版本是否和
BIOS 里带的对应CPU的代码一致。否则更新 CPU 的微代码。所以刷新 BIOS 支持
新 CPU 的道理就在这里! ;)
再然后?那要看你是不是打开了 BIOS shadow 就会选择是不是做这一步了。
注意,这个时候 BIOS 是在一片能被 CPU 直接寻址的 FLASH 里运行的。但是
FLASH毕竟比 SDRAM 慢.
所以, BIOS 会通过北桥重新映射 BIOS FLASH 的地址到内存空间的顶端,原有的
映射没有断开!这个时候由于 A20 gate 没有打开,高 12 位被忽略,导致 CPU
寻址仍然在 640k ~ 1M,也就是 BIOS 现在在的地址,所以 BIOS 继续运行。
这个时候 BIOS 切换到 32 位寻址,注意,是 32位寻址,但是还是 16 位 模式。
想知道详细情况的,可以自己网上 google . 因为先前已经映射好了 BIOS 到高位
内存,所以 BIOS 继续运行。 然后 BIOS 将原先自己所在的 6040k~1M 地址区间
通过操作北桥,断开映射!是的,没错,断开了! 这个时候,这个区间其实就是
RAM 而不再是 BIOS ROM 了,这个很重要!接着打开 A20。
接下来就是很平常的 memcpy 了,将自己从高位内存拷贝回 640k ~1M 区间的地
位内存。 然后关闭 A20. 关闭 A20 后, CPU 寻址重新回到低位内存。 BIOS 完
成了将自己拷贝到同一个地址的工作. 但是 BIOS 将运行在 SDRAM 中,而不是
FLASH 里。
然后干嘛呢? 自然是继续检测基本硬件啦。基本硬件一般都已经固定使用某个 IO
端口了。 BIOS 就是发送一个无害的请求看是否有返回就可以知道硬件在不在。
对于显卡和网卡这类设备, BIOS 并不包括这些设备的初始化代码, BIOS 通过调
用这些设备的 BIOS 来实现。
对于任何找到的 PCI 设备,BIOS 都是直接调用对应 BIOS 设备的 BIOS 来初始化
它的 。 这也是硬盘还原卡截获 init 13 中断的道理。
而这些设备的 BIOS,自然初始化工作就是配置设备的寄存器地址了。
BIOS 搞定的 PCI 设备,会形成一个表格,叫 PCI CONFIG ,保存到 PCI 控制器
里 。可以通过 IO 端口 0xCFC-0xCFF 访问。
对于集成设备,这些设备的 BIOS 其实都被包含在 system BIOS 里,但是逻辑上
并不是一个整体。如果用一些 BIOS 工具,还是可以分离各个设备的 BIOS 的。
没用 BIOS 将设备配置好,并写入 PCI config , Linux 内核就会当这个设备不
存在 ... 囧。
还有,各个 PCI 设备除了几个基本寄存器,别的都是通过 MMIO 映射到内存地址
里进行的,而不是使用 IO 端口地址。BIOS 要负责分配好,使他们不会重叠。
PCI 设备的地址从 0xFFFFFFFF- sizeof (BIOS) 开始向下分配,SDRAM 的地址从
0x00000000 开始向上分配。这些都是通过操作北桥的寄存器实现的。
自然,他们会在中间形成一个洞。不过,那是在你 SDRAM 内存比较少的情况下 .....
如果你的 SDRAM 内存比较多,恭喜你,你又遇到问题了,你的内存将被吞掉一部
分 .... 被 PCI 设备覆盖掉了一部分高位内存... 对 CPU 而言,整个内存地址都
充满了设备咯,没有空洞。
其实 Linux 认为的 640k~1MB 空洞也是不存在的。如果后续不使用 BIOS , 可
以放心的当 SDRAM 来用,因为就是 SDRAM . 自然,如果你没有开启 BIOS shadow
就另当别论了。
我之所以接触 Linux , 也是我本来计划自己写系统,我很讨厌 640K~1M 的内存
空洞,想知道怎么解决,就去看别的 OS 是怎么实现的,结果就发现了 Linux ,
然后开始看 ....
不过后来比较囧的是, Linux 确实没有利用这个区间的 RAM ... 真 TMD 有点浪
费啊! 现代的 BIOS 都默认 shadow 了,甚至没有地方给你配置了。 如果 Linux
不使用 BIOS , 不知道留这个洞在这里干嘛. 诶。
其实我 google 了 lkml , 是有人这么提出过这个问题。不过那个 Grek H 什么
的,就是貌似的Linux二号or三号人物,回的邮件里说,虽然多数系统可以回收这
个空洞,不过在个别系统上报告问题了。所以就默认不回收了。
如果你要回收,这里有 patch ... use at your own risk ....
呵呵。
扯远了。洗洗睡吧。明天估计开机会看到一堆回复了。
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.17 (GNU/Linux)
iQEcBAEBAgAGBQJNxZl/AAoJEKT4Uz7oTANZ5+QIAJpS1e7UsjRe4aUWCu5HW+iV
XSWIky9ztErSNiF30XbZ1g9TQiCYXUp3ggiLl7vvyNbLOETZ2soX8cmFN2fUn2tF
KwHHiOW6CK+vwOYxJETmITsCSdyy07rDUQ+0MZyLPss6vuqbmpax+LO0PhVC2UQM
mmfQWBRxXIswV7xmYnLmLNB/MnJe5yEsDv5a7kQFmqbk36QORYkWEarwKikqbwOQ
fK1LtLSIW+7QgOaKmpBGiaOnxMujyL+Abjt2orNItYsCvhCLg71eCrpHO0zOZU+9
paruZiYaV14G1Y38nm6Soes+ZTsPDSnTouK2xHKU+TunkfpoOhxdtc2f0aAr9ow=
=J4sJ
-----END PGP SIGNATURE-----
12 years, 7 months
[FZH] 不明白,为什么站点上这个翻译错误这么长时间无法修补
by Mike Manilone
fix这个词用惯了,所以主题写的是修补。。
http://fedoraproject.org/zh_CN/features/
!00% 自由&开源 <-- 应该是100%吧,那个人翻译的多按了个shift?
Fedora 是 100% 免费并且只包含自由和开源软件。
顺便广告一下emacs,我的邮件都是从emacs的mew里面发的哦,erc我上irc,emacs-jabber我能上gtalk,最牛B的是elim,不过我没折腾好。(一直在找机会广告emacs……免引发圣战,大家心里骂几句就好了啊,我知道你们只会用vi(m))
--------------------
Mike is here.
My OS: Fedora x64
My blog: www.ekd123.org [Powered by Chito]
My favorite editor: Emacs 23.2
My E-mail client: Mew 6.3 on Emacs 23.2.
--------------------
12 years, 7 months
[FZH] linux下的多媒体库
by ajax he
想请大家推荐下LINUX下的多媒体的库,C实现的,支持音频,视频采集,编码,解码功能即可
我到一个pymedia,是Python实现的,不过在fedora下没有安装成功,想问问列表里面有没有大牛配置好PyMeida的~
谢谢~
12 years, 7 months
[FZH] C/C++ 请教控制鼠标的库/头文件等
by Guannan Ma
hi everyone
最近有这么个想法 只是不知道应该去用什么实现.
我的nokia手机可以使用putty for symbian链接我的linux, 我可以在床上的时候控制我的mplayer放音乐.
问题是putty是command line,没法进行鼠标控制, 我想设计一个小成熟 接受手机putty发送的 移动按钮的事件 来控
制我的鼠标移动和鼠标左右键的点击. 这样也可以在presentation的时候用手机控制了
请知道的朋友告知下 我应该去找寻哪些库文件 哪些函数
或者给一些例子和网站链接, 中英文都可以
我觉得应该是X11 里面的库文件什么的吧?
Life_is_a_gift@gnma# uname -a
Linux seamless-laptop 2.6.38-9-generic x86_64
12 years, 7 months
Re: [FZH] openfetion 打包问题
by Liang Suilong
那我叫 Tommy He 帮你改名,改不到的话只能不好意思删评论了。。。
On May 7, 2011 11:35 PM, "microcai" <microcai(a)fedoraproject.org> wrote:
12 years, 7 months
[FZH] 第五弹,加速系统启动的 coreboot
by microcai
听听,听听, 你的 BIOS 在加载 GRUB 前都做了什么?!
第一,嘟的一声,所谓的 POST 就过去了。
其实做的事情还蛮多的。这里你会发现,BIOS 用了很长的时间来做这个事情。Oh
dear. 其实我只希望 BIOS 检查一下 RAM 和 HDD 能工作就可以了。当是 BIOS 偏
偏不这么干。他把所有的硬件都检查了一遍。难怪 BIOS 要那么大了!4M 的
flash chip 都放不下! 而且这么慢! What the fuck, 你初始化好硬件后,又
初始化了硬件驱动! yep, for DOS 的驱动。 WTF, 我没有 DOS, 拜托你不要为不
存在的 OS 写/初始化 驱动了好不好!
第二,开始枚举引导设备。
其实事情只有一个, 加载 MBR. WTF, 你加载 MBR 就算了,为何要为了可能存在
的磁盘,去查找并初始化任何可能的引导设备?? 万一我真的不从 HDD 启动,我
会第一时间告诉你的呀! 反正你找到了N个引导设备之后还是没用,乖乖的从 HDD
读取 MBR。
最后,启动加载的引导设备。
做了那么多事情,就是为了运行 512byte 的 MBR.
现在假设你 MBR 里是 GRUB.
GRUB 启动了,又开始加载 GRUB stage2,说白了就是个 mini linux vfs layer.
用来支持访问 Linux 的文件系统的。 这里,初始化了一次 VFS .....
GRUB 又去启动 Linux 了
Linux 启动,检查初始化设备和设备驱动程序 ..... (等等,这听起来怎么这么
耳熟????什么? 又在重复着 BIOS 做过的事情!!) 初始化文件系统 ...
(等等,貌似又在哪里听过? GRUB ?? GRUB 不也做了一样的事情么?)
呜呼,难怪系统启动这么慢了,相同的事情做了2次!
等等,貌似 Linux 做的那一次只需要 1-2s ... 而 BIOS 和 GRUB 却做了 ....
> 10s
搞错没有啊!!!
没搞错!是的,就是这样, Linux 并行初始化了 .....
好吧,如果在把 Linux 内核烧录到 BIOS ROM 里,当然,定制一下,前面稍微加
点初始化代码呢? 2s 启动好 Linux 不是问题!
即便 ROM 里的 Linux 有点老,你一样可以通过 kexec 直接启动新的内核!
等等,貌似 GRUB 这玩意没用了? 是的!!是的!!
恩,理想的 Linux 启动过程是这样的.
RESET/POWEROFF -> 高度定制的 Linux 内核 -> linux 内核能使用的一切方法获
得真正的 linux 内核, 包括 NFS 网络启动, HDD 本地启动, USB 启动, CDROM
启动, PXE 启动,COM 口直接传送内核 , 从加密的 HDD 访问 linux 内核 , 使
用智能卡解密 HDD 启动 Linux ...... -> kexec
到这次 kexec ,我打赌如果是 HDD 引导 ,不会超过 4s ! 而如果是传统的 BIOS
是多少? > 10s
而且,你可以随时改用别的启动方法!可以使用传统 BIOS 压根不能支持的启动方法!
而且,就算你不选择 kexec 启动Linux内核,其实你也已经在 Linux 环境下了!
只不过比较精简罢了!但是起码也有 busybox 提供的一整套装备! 是的 , 意味
着还没启动系统,你就能做维护了!而且就是开机加电,到你的显示器能反应过来
的时候, shell 已经出现在你面前了!
如果你总是编译了新内核,然后就烧写到 BIOS ROM 里,恭喜你, 你总是可以在
开机后,就发现屏幕显示的内容已经是
Starting XXX [OK]
了。 呵呵, Linux 启动的比你的显示器还快!
当然,如果你不打算启动 Linux 呢?但是却想享受 coreboot 带来的快速和便捷呢?
呵呵,自然,kexec 可不止能启动 Linux 内核,只要符合 multi-boot 规范都能
启动,aka , 只要 grub 能启动的 , kexec 就能启动。所以,如果一个软件实现
了 PC BIOS 的功能,并这个软件可以通过 kexec 启动 .... 呵呵,自己想就知道
了,启动非 Linux 不是问题。 自然这样的事情也有人做。 OpenBIOS 就是这样做
的。不过是把 coreboot + kexec 一个 BIOS 结合到一个项目中去了。
PS:
BIOS 在 POST 之前,CPU 是不能访问 SDRAM 的。PC BIOS 通过北桥透过南桥,再
到 superio 芯片,通过 SMBUS/I2C 总线协议去给 SDRAM 进行编程,然后北桥才得
以访问 SDRAM, CPU 才有内存可用。所以 BIOS 虽然是在 16bit 模式,确可以直
接识别出 XXXGB 内存。哈哈,人家可是直接通过读写 SDRAM 芯片来进行识别的嘛!
而这个工作却是 coreboot 的死角!!!因为每个主板的方法都不一样!而且没有
SDRAM , 后续的代码都不能运行,也就别谈 DEBUG 了 ......
这个需要靠各个板卡和芯片厂商释出对应的硬件手册才行 ...... 悲剧的
是,coreboot 会直接让 AMI 和 phonex 倒闭! 他们会同意么?
NVIDIA 的芯片目前就 MCP55 (早几百年过时了) 可以,诶,反正我的电脑是用不
了这么先进的 BIOS 咯。
希望 coreboot 能做的更好. move on !
12 years, 7 months
[FZH] (无主题)
by Mike Manilone
呃,在Google Groups上cn.bbs.comp.linux被Ubuntu和openSuSE占领了……
水一下………………(突然发现Google Groups很像百度贴吧)
--------------------
Mike is here.
My OS: Fedora x64
My blog: www.ekd123.org [Powered by Chito]
My favorite editor: Emacs 23.2
My E-mail client: Mew 6.3 on Emacs 23.2.
--------------------
12 years, 7 months