guolisen 发表于 2004-1-13 10:48:58

linux内核引导问题

最近看linux代码的分析有许多不明白的地方请指教。
在引导的时候,比如内核装入0x10000,Setup.S装入9000:0200等,这些内存地址是人为随便规定的还是操作系统必须装在这里?有什末规律?bootsect.S为什末一开始时要将自己般致0x90000处运行般到那不都是512k吗,刚接触linux原码还没有入门请多指教

guolisen 发表于 2004-1-13 10:56:44

现在多数的书都是告诉你“是什末“,但从来不说“为什末“。哎~~~郁闷~~~。估计他们也不明白

hyla 发表于 2004-1-13 12:04:29

這些應該是Linus Torvalds當時寫Linux自己定義的,只有引導程序bootsect最初放在0x7c000,因為是由bios調用,所以是確定的,不能更改。至於將自己搬到0x90000是因為Linus Torvalds設想Linux內核大小上限為512K,由於system一開始被加載到0x10000處,自然的想法是把原來在0x7c00處的bootsec搬到0x90000了(0x90000-0x10000=0x80000=512K),當然,你搬到別處是完全可以的,只要你跳轉時知道地址,別跳錯地方就好:)至於0x90200的來歷,bootsect佔用磁盤上的一個扇區(引導扇區),一個扇區的大小為512字節,換算成16進制就是200,那麼setup自然從0x90200開始了 :wink:

PS:我也是昨天才開始讀0.11版的內核的(為什麼讀0.11?因為0.11小啊,而功能又相對比較完整了,對於理解內核是個很好的版本喔),理解有誤的地方請大家指教。

我的書是<Linux 内核0.11 详细注释>作者:赵炯,感覺很不錯 :lol:

hyla 发表于 2004-1-13 12:07:53

下面是Linus Torvalds在0.11版對bootsect.s的注釋

bootsect.s is loaded at 0x7c00 by the bios-startup routines, and moves
iself out of the way to address 0x90000, and jumps there.
It then loads 'setup' directly after itself (0x90200), and the system
at 0x10000, using BIOS interrupts.

currently system is at most 8*65536 bytes long. This should be no
problem, even in the future. I want to keep it simple. This 512 kB
kernel size should be enough, especially as this doesn't contain the
buffer cache as in minix

The loader has been made as simple as possible, and continuos
read errors will result in a unbreakable loop. Reboot by hand. It
loads pretty fast by getting whole sectors at a time whenever possible.

guolisen 发表于 2004-1-13 12:54:53

非常感谢!hyla请问网上有没有下载?<Linux 内核0.11 详细注释>

hyla 发表于 2004-1-13 13:49:51

我就是網上下的,不過地址不記得了,一下子也找不到。你要的話我發給你好了。PDF檔,2.49M,你看是mail給你還是找個FTP吧

hyla 发表于 2004-1-13 16:23:50

剛剛發現這裡有一篇相關的帖子,但是他給的下載地址我打不開,你試試吧

http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=39889

guolisen 发表于 2004-1-13 19:57:26

谢了!下完了
页: [1]
查看完整版本: linux内核引导问题