佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

楼主: 詩魂

Linux 開機流程(x86版)

[复制链接]
发表于 22-5-2009 10:34 AM | 显示全部楼层
有人更好笑, 讲不过了, 就开始转话题。 我之前都有讲我和他讲的可能是两个不同的东西。
我这个人很怕死的, 既然作者讲是rom里面了, 虽然讲, 我不认为他讲的对, 虽然讲, 我这里也有可以读取ROM里面的资料, 我看到的东西, 和他看的不一样, 不过, 既然作者比较熟这一类的东西, 我马就静静不敢反驳他咯。
有人啊, 很聪明的,会算 absolute address喔。还会引用, 然后highlight来反驳别人喔。 也很厉害的, 会证明F000:FFF0 即 FFFF:0000。还有哦,还很厉害地用hexdump来查RAM里面的资料。也会引用xyz的网页, 虽然讲他没有注意到, 他引用的句子, 下面其实有一句IBM® named this address the "ower On Reset Vector "。
有人喔,宁愿去相信forum里面不知道什么人讲的话, 也不要去信一个在这行业从事的人。有人ho.。。。宁愿相信网页讲的话, 也不要去信由两个世界出名的处理器生产和制造商写出来的专利说明书。

给那些来看戏的, 我希望你们能看了这部戏后悔会开心。 也希望你们能学到一些东西啦
回复

使用道具 举报


ADVERTISEMENT

发表于 22-5-2009 10:50 AM | 显示全部楼层

回复 61# 糯米鸡 的帖子

话题重头到位都是围绕着 BIOS 的 位置, 只有你一个人在说reset vector。 清回去读读贴把。

知己也会说 reset vector 是第一个执行的 adddress。 IBM 那句冲没问题, 可有人却盈盈要说

BIOS 位置只能够是在 F000:FFF0, 而不能在 FFFF:0000

prove 给你看的是 F000:FFF0, 也相等于 FFFF:0000 现在又说IBM的对了, 刚才又说 BIOS 不能在 F000:FFF0.

ice-cream 在大马叫冰淇淋, 在中国叫 雪糕。 有人出生在中国。 说一全世界的人都要叫 ice-cream 为雪糕, 冰淇淋是错的???

居然有这样的道理。

IBM 说 reset vector 在 FFFF:0000, BIOS 也在 FFFF:0000
INTEL 说 reset vector 在 F000:FFF0, BIOS 也在 F000:FFF0.

你说, INTEL 说 reset vector 在 F000:FFF0, BIOS 只能在 F000:FFF0

我说, BIOS 可以在 F000:FFF0 或 FFFF:0000, FFFF:0000 == F000:FFF0

[ 本帖最后由 onlylonly 于 22-5-2009 11:05 AM 编辑 ]
回复

使用道具 举报

发表于 22-5-2009 10:55 AM | 显示全部楼层
先帮你简化你的论点把。

你说:

reset ector 的值是 F000:FFF0. BIOS 久一定要在 F000:FFF0, 不可以在 FFFF:0000, 即使是 FFFF:0000 == F000:FFF0

===================================================

我于诗魂兄说:

FFFF:0000 == F000:FFF0 , 说一BIOS 固然可以在 F000:FFF0, 但在 FFFF:0000 也是对的。

这里没人说过 intel 的 spec 是错的阿

只有你再说wiki错, IBM tech doc 错, FFFF:0000 == F000:FFF0 错, BIOS 在 FFFF:0000 错

[ 本帖最后由 onlylonly 于 22-5-2009 10:59 AM 编辑 ]
回复

使用道具 举报

发表于 22-5-2009 11:01 AM | 显示全部楼层
33 楼:

回复 32# 糯米鸡 的帖子
F000:FFF0 即 FFFF:0000

    F0000
+   FFF0
--------------------
  FFFF0

FFFF:0000


34 楼:
这是不一样的。处理器第一个跑的指令, 是在 0xFFFFFFF0,不是0xFFFF0。 你去找reset vector这个你就知道了。


看好了抹?
回复

使用道具 举报

发表于 22-5-2009 11:23 AM | 显示全部楼层
好啦。。。
鸡同鸭讲。。。。

不过。。。。 我确实是学了很多。。。。 但还有很多看不懂。
回复

使用道具 举报

发表于 22-5-2009 11:45 AM | 显示全部楼层
原帖由 onlylonly 于 22-5-2009 10:50 AM 发表 话题重头到位都是围绕着 BIOS 的 位置, 只有你一个人在说reset vector。 清回去读读贴把。知己也会说 reset vector 是第一个执行的 adddress。 IBM 那句冲没问题, 可有人却盈盈要说BIOS 位置只能够是在 F0 ...
麻烦你用你的眼睛来看好
1。 处理器在power up或reset时, 在第一个指令的地方, 就是reset vector, 也就是处理器的第一个cs:eip。在x86, 这个address会映射去bios, 也有人称为firmware。你如果知道这个地址, 就能看到bios的指令, 也就是处理器处理的第一个指令。
2。 我之前有讲过:在Intel的处理器, 肯定是FFFF:FFF0。 后来, 我也有提起:其实我讲错了, 应该是F000:FFF0才是。看好来, 我讲的是intel处理器, 也就是现在世界用户最多x86处理器。 也麻烦你去看我在上面讲的specification, 当处理器在第一个指令时, 所在的地方, 他的cs, eip,和address是什么。不是我讲只能在0xF000:FFF0 => 0xFFFFFFF0, 而是, 这是事实。 你如果用的是desktop,mobile, server, workstation,netbook,nettop,你处理器第一个会在的地方, 就肯定是0xFFFFFFF0。我也提起,在58#,对于embedded的处理器, 我不便讲, 是因为我在这一方面没有idea。我讲的是,关于普通用户所用的电脑平台。所以, 只要你讲的是intel的x86处理器, 只要是desktop,mobile, server, workstation,netbook,nettop, 你就没得选, CS肯定是0XF000,EIP肯定是0xFFF0,address也就是0xFFFFFFF0, 这就是specification所提起的, 也就是我现在debug了desktop,mobile, server, workstation,netbook,nettop,所看到的东西。我再讲一次, 你再看好来, 我讲的是desktop,mobile, server, workstation,netbook,nettop, x86处理器, intel的。这是全世界75% 以上x86用户用的处理器。如果加上amd的, 就是90%以上。 你还要怎么样? 
3。 你去看我在28#写的, 我恢复楼主,讲在Intel的处理器, 肯定是FFFF:FFF0, 然后后来更改为F000:FFF0, 我有讲楼主讲的话是错吗?我讲的很清楚, 是Intel的处理器。看好来, 是Intel的处理器。
4。FFFF:0000 == F000:FFF0 是对的, 但是, 不是在reset vector这个时候。为什么? 因为在这时候,the base address is loaded with FFFF0000H。看清楚, 他的base address是0xFFFF0000,如果你的eip是0, 那么你拿到的就absolude address是0xFFFF0000。
回复

使用道具 举报

Follow Us
发表于 22-5-2009 11:48 AM | 显示全部楼层
原帖由 atchek 于 22-5-2009 11:23 AM 发表 好啦。。。鸡同鸭讲。。。。不过。。。。 我确实是学了很多。。。。 但还有很多看不懂。
你不明白什么?讲出来。 我当年也是用了满久才搞清楚
回复

使用道具 举报

发表于 22-5-2009 11:58 AM | 显示全部楼层

回复 66# 糯米鸡 的帖子

狂晕, 又来 reset vector 。 这里没人说reset vector。

我们说的是 BIOS 的 位置。 位置。 ROM address。 不是 reset vector。

又来离题了。
回复

使用道具 举报


ADVERTISEMENT

发表于 22-5-2009 01:00 PM | 显示全部楼层

回复 68# onlylonly 的帖子

消气吧。。。 他也承认你的观点了。。 给个面子
回复

使用道具 举报

发表于 22-5-2009 01:02 PM | 显示全部楼层

回复 67# 糯米鸡 的帖子

其实我是蒙蒙懂懂, 有空才能深入了解, 才能够提问。
回复

使用道具 举报

发表于 22-5-2009 10:14 PM | 显示全部楼层
在我还没正式开第二轮的战之前, 我先在这里说明, 我从40#楼起, 出言冲犯了人, 尤其是诗魂和onlyonly, 我先在此向他们道歉万分。

1。 31#, 要如何证明, bios的却存在你所谓的地址, 而不是一个影子(shadow)?
2。 在34#我讲过, 处理器第一个跑的指令, 是在 0xFFFFFFF0,不是0xFFFF0。 35# 和 36#即有三个文章不赞成34#我讲的观点。 而我讲的观点, 是根据我个人所看到的, 和在 Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3A: System Programming Guide, Part 1, chapter 8.12所讲的一致。 你要如何否定, intel和amd所写的, 是错的?
3。 38# 要如何证明, 在0xFFFFFFF0会 truncated去? 如果这样子做, 那么在一开始就把base address 换去0xF0000不是更好? 把base address换去0xFFFF0000不是多此一举吗?
4。 44#所讲的,你说bios rom的address是在0xFFFF:00000,那么我想提的, 在legacy address range,0xF0000-0xFFFFF是留给bios code的shadow。0x100000,已经是属于ram的部分0xFFFF0到0x100000,只有16bytes的code?
5。 54#+68#说讲的,我在66#讲 :处理器在power up或reset时, 在第一个指令的地方, 就是reset vector, 也就是处理器的第一个cs:eip。在x86, 这个address会映射去bios
bios是存在flash/rom里面,
Intel® 4 Series Express Chipset Datasheet
http://www.intel.com/Assets/PDF/datasheet/319970.pdf
High BIOS Area
The top 2 MB (FFE0_0000h–FFFF_FFFFh) of the PCI memory address range is reserved for system BIOS (High BIOS), extended BIOS for PCI devices, and the A20 alias of the system BIOS. The processor begins execution from the High BIOS after reset. This region is mapped to the DMI so that the upper subset of this region aliases to the 16-MB–256-KB range. The actual address space required for the BIOS is less than 2 MB, but the minimum
要如何证明high bios area这不是bios的位置?
回复

使用道具 举报

发表于 22-5-2009 10:34 PM | 显示全部楼层
不想跟你争了, 就当我讲的错好了。

今天考的一科差点因为这个争论没读到。大考期间,我还是回去读书实际点
回复

使用道具 举报

 楼主| 发表于 22-5-2009 10:40 PM | 显示全部楼层

回复 72# onlylonly 的帖子

確實,課業比較重要,請保重。
跟人筆戰是一時的,一口氣的,
但成績單的成績卻是跟著你一輩子的。

祝你考試順利
回复

使用道具 举报

 楼主| 发表于 22-5-2009 10:50 PM | 显示全部楼层

回复 71# 糯米鸡 的帖子

在我还没正式开第二轮的战之前, 我先在这里说明

抱歉糯米兄,先跟您申明一下,弟對筆戰一點興趣也沒有,所以我就不加入了。
您也可以視為是我自知理虧之類的,但我不會在意
我實在挪不出較多的時間在這上面。不過我建議,在要求別人證明之前,
不如自己先證明自已的正確性,以及證明的方法,例如證明ROM BIOS絕對不在那個位置,
而且這方法是大家可複製的。

您也認為我的專業應該是嵌入式,我也答應各位,不再寫跟X86架構有關的文章。
但我誠心邀請您,可否請您發表一些有關於X86的文章,
我相信根據您的專業,您的分享必定讓Linux版的網友們(包括我)獲益良多,
先謝謝您了
回复

使用道具 举报

发表于 22-5-2009 11:57 PM | 显示全部楼层
原帖由 詩魂 于 22-5-2009 10:50 PM 发表

抱歉糯米兄,先跟您申明一下,弟對筆戰一點興趣也沒有,所以我就不加入了。
您也可以視為是我自知理虧之類的,但我不會在意
我實在挪不出較多的時間在這上面。不過我建議,在要求別人證明之前,
不如自己先證 ...

就像我之前所讲的, 我看到我所做到的, 我听到我senior所教到的。我也引用了intel在两个specification所写的。 如果有人要否认specification的话, 那无所谓。我没在embedded的经验, 但是我至少也有参考到pentium embedded的processor。就连chipset也查到440BX,就是查不到能证明0xFFFF0就是bios的address。我也曾经想去embedded的世界打混, 你既然embedded有经验, 有分享x86的开机流程, 那何不分享你看过和知道的?

我开始已经讲过了, 处理器第一个跑的指令, 是在 0xFFFFFFF0。文不对题的讨论, 不应该讨论。有人不认同这个观点而找出几个网页来驳回。我也针对这个要点来反驳, 也在后来又提到,0xFFFFFFF0是指去bios这个地方。 或许, 我得承认, 你们讲的话题, 我实在不明白。。。

我曾经学了很多电脑知识, 也曾经轻狂过, 但是一进入电脑界, 就发觉到自己的无知。 这就是为什么, 你讲的话, 我虽不认同, 但是还是期待你能指点。

我承认, 我讲话轻狂LS,虽然我自认为是自信。
我也承认, 你写的这个分享很不错, 能用比较轻松的语法来带动读者进入话题。
回复

使用道具 举报

发表于 23-5-2009 02:37 AM | 显示全部楼层
据我所了解真的是0xffff0开始。。这次上OS课做lab的时候有接触到。。

但是既然糯米鸡兄这么肯定,加上平时潜水看糯米鸡兄写的东西也看得出他的只是还是很渊博一下的,所以我决定去查一查资料,看看到底是怎样的。
(顺便一提:为什么我的intel manual里面没有chapter 8.12的??)

Intel Manual中
table 8.1: IA-32 Processor States Following Power-up, Reset, or INIT 里面
EIP:
0000FFF0H

CS:
Selector = F000H
Base = FFFF0000H
Limit = FFFFH
AR = Present, R/W,
Accessed

真的是这么写的哦。。
CS=F000H
EIP=0000FFF0H
所以就是0xffff0?

但是,话虽如此,intel manual里面又有讲
8.1.4 First Instruction Executed
The first instruction that is fetched and executed following a hardware reset is located at physical address FFFFFFF0H. This address is 16 bytes below the processor’s uppermost physical address. The EPROM containing the software-
initialization code must be located at this address.
The address FFFFFFF0H is beyond the 1-MByte addressable range of the processor while in real-address mode. The processor is initialized to this starting address as follows. The CS register has two parts: the visible segment selector part and the hidden base address part. In real-address mode, the base address is normally formed by shifting the 16-bit segment selector value 4 bits to the left to produce a 20-bit base address. However, during a hardware reset, the segment selector in the CS register is loaded with F000H and the base address is loaded with FFFF0000H. The starting address is thus formed by adding the base address to the value in the EIP register (that is, FFFF0000 + FFF0H = FFFFFFF0H).
The first time the CS register is loaded with a new value after a hardware reset, the processor will follow the normal rule for address translation in real-address mode (that is, [CS base address = CS segment selector * 16]). To insure that the base address in the CS register remains unchanged until the EPROM based software-initialization code is completed, the code must not contain a far jump or far call or allow an interrupt to occur (which would cause the CS selector value to be changed).

这里又写到明明白白真的是从FFFFFFF0H开始,而且也有给出说明为什么和之前的冲突了。。
这下疑团终于解开了。。糯米鸡大哥所说的,是对的。

顺便推荐以下,如果对cpu里面的设计有什么疑惑,去看intel manual是不错的选择。。不然如果有空的话去研究研究intel manual也是可以学到很多东西的
link在下面,省大家google的时间
http://www.intel.com/products/processor/manuals/
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 23-5-2009 10:29 AM | 显示全部楼层

回复 78# chingjun 的帖子

chingjun兄您好,
我們從沒否認過CPU第一個指令是從那裡開始,
本文由始並非討論這個,但我一直不明白為何至終大家把重點放在這。
或許大家比較希望看到的是有關Intel CPU reset過程,
然而這並非弟的專長,或許我們可以呼吁糯米兄另開新帖,
抽空為大家分享一下,也算是我成功拋磚引玉的功德。
回复

使用道具 举报

发表于 23-5-2009 11:03 AM | 显示全部楼层
我看如此的回复下去的确没什么意义, 起了争论心里又不愉快了。

诗魂兄, 小弟到时对你的嵌入式的Linux核心很有兴趣。kernel 这么大, 你们将之改成可在嵌入式ARM运行的, 到底是如何更改的?

以前在编译核心的时候, menuconfig 那里的东西, 至少有一半看不明白的。 对你们这些能够得心应手将kernel编译的能够置入一个小小的ARM里面, 小弟真的很佩服。
回复

使用道具 举报

 楼主| 发表于 23-5-2009 11:05 AM | 显示全部楼层
你既然embedded有经验, 有分享x86的开机流程, 那何不分享你看过和知道的?

OK,我向各位道歉。我澄清一下當初撰寫本文的動機和目的。
動機是當初跟atchek兄在某篇文提到把Linux kernel放在BIOS裡的問題。
而後我也稍微回了一篇有關Linux開機的流程。但因為篇幅的關係加上我的表達能力不佳,
所以很多人看了還是不知所云。所以我決定找個時間寫一篇比較詳細的"Linux開機流程"。

由於弟在幾年前還在學校時無聊(學生就是時間多,除了把美眉,其他時間主要都在研究)有
Trace過Linux kernel啟動的部份(但那時是2.4.x),所以算是心得分享吧,
但我也知道這裡Linux高手如雲,也希望本文能拋磚引玉,激發更多人開帖發表文章,
對於許多偉大的“開源社”們貢獻的自由軟體,我撰文推廣Linux只是微不足道的事。
然而不因事小而不為,所以我也努力地撰文,從最淺的
“ Windows用戶的Linux無痛使用新體驗”
乃至於一些比較深入一點的文章,都是有計劃性地完成。
那為什麼我是寫x86篇而不是Embedded Linux篇呢?這也是有原因的:
1. 就是前面講的動機。
2. Embedded Linux本來就在我的計劃中。此外,除了最前面的幾個程序,
其實x86和Embedded Linux的差異不大,所以我希望讀者先對此有一個大概的了解。
3. Embedded System的Booting並沒有BIOS的參予,但Bootloader需包含部份BIOS要做的事。
所以先了解x86的Linux開機程序,有助於思考Embedded Linux的開機程序。

“Windows用戶的Linux無痛使用新體驗”這篇算是比較成功地拋磚引玉
雖然在此之前我沒用過Ubuntu,但我自行體驗後做成圖,把圖再貼成圖文
(雖然也有一部份的圖是別人的),這種方式比較吸引初學者。
但我從沒想到,在這裡寫文章要是該領域的專家才行。到目前為止,我仍
自認自己是Ubuntu的新手,對於無心寫下這篇文章,敬請大家見諒。
但我自認我當初的動機是出自善意的。

文不对题的讨论, 不应该讨论

不是不應該討論,而是,我建議另開新帖繼續您的討論。
這樣有另一個好處,就是未來有讀者在搜尋相關文章時,比較容易找到,
版主也會肯定您的分享,何樂不為?

[ 本帖最后由 詩魂 于 23-5-2009 11:15 AM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 23-5-2009 11:16 AM | 显示全部楼层

回复 81# onlylonly 的帖子

only兄,
我也不想參予了。

其實那是許許多多Kernel Hacker (這樣稱呼不知對不對)努力的成果。
大家都知道當初Linus先生撰寫Linux kernel的動機和原因,
經過這些年,靠著網路的力量,還有許許多多hacker們的努力,
今天的Linux不但可以如此地適用於個人電腦,也是許多大企業
做為伺服器(server)的主力,更是Embedded System的主力之一。

如何build成ARM based的Linux kernel,已經不再是很麻煩的事了。
將來只要我有時間,我會抽空試撰於此相關的文章,
也謝謝支持和肯定我的網友,您的支持是我撰文的動力

[ 本帖最后由 詩魂 于 23-5-2009 11:52 AM 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 19-4-2024 06:56 PM , Processed in 0.077143 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表