最近我在看linux 01的源代碼,因爲2.6.11和更高版本的bootsect.S是無用的,因此它是開始學習linux代碼的好地方,因此我選擇跟蹤Linux的第一個版本。 :P關於linux v0.01 bootsect.S
我在bootsect.S中有一些問題。以下是bootsect.S linux v 0.01中的一些代碼。
P.S第一個版本的彙編代碼使用的是intel語法,而不是在& t。
mov ax,#0x0001 | protected mode (PE) bit
lmsw ax | This is it!
jmpi 0,8 | jmp offset 0 of segment 8 (cs) which is the second entry of the gdt.
GDT:
.word 0,0,0,0 | dummy
.word 0x07FF | 8Mb - limit=2047 (2048*4096=8Mb)
.word 0x0000 | base address=0
.word 0x9A00 | code read/exec
.word 0x00C0 | granularity=4096, 386
.word 0x07FF | 8Mb - limit=2047 (2048*4096=8Mb)
.word 0x0000 | base address=0
.word 0x9200 | data read/write
.word 0x00C0 | granularity=4096, 386
引導過程似乎是這樣的:
移動的引導程序從0x7c00到0×9000
代碼跳轉到0×9000
設置段寄存器。
負載系統代碼爲0x10000 (系統代碼包含啓動/ head.S中和init/main.c中根據生成文件)
負載臨時GDT和IDT與LGDT和LIDT
使A20能夠訪問16MB物理內存。
組CR0的PE位去保護模式
跳轉到0x000000處
下面是Makefile文件系統:
tools/system:
boot/head.o init/main.o \
$(ARCHIVES) $(LIBS)
$(LD) $(LDFLAGS) boot/head.o init/main.o \
$(ARCHIVES) \
$(LIBS) \
-o tools/system > System.map
好像頭部.S和main.c作爲bootsect加載到內存中的系統二進制文件鏈接在一起。
我的問題是如果系統代碼(哪個條目是head.S/startup_32)加載在0x10000比爲什麼不跳轉到0x10000而是跳轉到0x000000? 跳到0x0是不是很奇怪,因爲裏面沒有加載代碼?
一個鏈接到源將本來不錯:) – sehe
我添加一個下載鏈接到帖子。 tks的回覆:) – mike820324