ÕâÊDZ¾ÎĵõÚÈý²¿·Ö,ÔÚÇ°Á½²¿·ÖÖÐ,ÎÒÒѾ½²ÊöÁËLinux²Ù×÷ϵͳÊÇÈçºÎ±»»úÆ÷bootµ½,²¢ÇÒloadµ½Öƶ¨µÄÄÚ´æµØÖ·µÄ.ÎÒÃǽ«¼ÌÐøµÚ¶þ²¿·ÖµÄÄÚ
ÈÝ,¿´¿´²Ù×÷ϵͳÔÚÍê³ÉÁËbootsect.sºÍsetup.sµÄÔËÐкó,ÔÚhead.sÖÐ×öÁËЩʲô.
ÈÃÎÒÃÇ»ØÒäÒ»ÏÂ,ÔÚsetup.sÖÐ,ÎÒÃÇ°ÑÕû¸ösystemÄ£¿é´ÓµØÖ·0x10000³öÍùÏÂÒƶ¯ÁË0x10000µÄ¾àÀë,Ò²¾ÍÊÇ˵,ÏÖÔÚsystemÄ£¿éÒѾλÓÚ0x0000µØ
Ö·ÉÏÁË.¶øÇÒ,ÓÉÓÚhead.s»á±»±àÒëµ½systemÄ£¿éµÄ×îÇ°´¦,ËùÒÔÔÚhead.s¿ªÊ¼ÔËÐÐÊÇ,³ÌÐò¼ÆÊýÆ÷Ö¸ÏòµÄλÖÃÆäʵÊÇ0x0000´¦.
´ÓÕâ¶Î³ÌÐò¿ªÊ¼,LinuxÓ¦¸ÃËãÒѾ±»ÕýʽloadÍê³ÉÁË,²¢ÇÒҲ˳Àû½øÈëÁ˱£»¤Ä£Ê½.½ÓÏÂÀ´µÄ¹¤×÷,¾ÍÏëËùÓоßÓÐÒ»¶¨¹æÄ£µÄϵͳһÑù,ÐèÒª¿ªÊ¼
³õʼ»¯ÁË.ÎÒ¸ù¾Ý±à³ÌÓï»áÓжÔϵͳµÄ½øÒ»²½³õʼ»¯ÑÔµÄÇø±ð,½«LinuxµÄ³õʼ»¯¹ý³Ì·ÖΪÁ½²¿·Ö.µÚÒ»²¿·ÖΪhead.sÖеijõʼ»¯¹¤×÷,¿ÉÒÔ³Æ֮Ϊ
asm³õʼ»¯.¶ø½ÓÏÂÀ´ÏµÍ³½«»á½øÈëµÄmain()º¯ÊýÖÐ,,¿ÉÒÔ³Æ֮Ϊc³õʼ»¯.ÈÃÎÒÃÇÏÈÀ´¿´Ò»¿´asm³õʼ»¯µÄ¹ý³Ì:
.text
.globl idt,gdt,pg_dir,tmp_floppy_area
pg_dir:
.globl startup_32
startup_32:
movl $0x10,%eax
mov %ax,%ds
mov %ax,%es
mov %ax,%fs
mov %ax,%gs
Ê×ÏȳöÏÖµÄÕâÒ»¶Î×÷ÓÃÊÇ°Ñds,es,fs,gs¶Î¼Ä´æÆ÷µÄÄÚÈÝÈ«²¿Ö¸ÏòÔÚsetup.sÖÐÉèÖõÄGDTµÄÊý¾Ý¶Î.ÊÇ·ñ»¹¼ÇµÃ,ÔÚGDTÖÐÎÒÃǶ¨ÒåÁËÈý¸ö¶ÎÃèÊö
·û,µÚÒ»¸öΪȫÁã,ÆäʵÊÇÆúÖ®²»ÓõÄ,µÚ¶þ¸öÓëµÚÈý¸ö¶¼Ö¸ÏòÁ˵ØÖ·0x0000´¦,·Ö±ðΪ´úÂë¶ÎºÍÊý¾Ý¶Î. ÐèҪעÒâµÄÊÇ,ÎÒÃÇÒѾ½øÈëÁ˱£»¤Ä£Ê½
,Ò²¾ÍÊÇ˵ÏÖÔڶμĴæÆ÷Öдæ·ÅµÄÒѾ²»Ó¦¸ÃÊǶεÄÆðʼµØÖ·ÁË,¶øÊÇÓ¦¸ÃΪ¶ÎÑ¡Ôñ·û. ÔÚmovl $0x10,%eaxÖÐ,Ö±½ÓÊý0x10Õ¹¿ª³É¶þ½øÖƼÈ
ÊÇ:0000000000010000. ¶ÔÓÚintel 80x86ϵÁеÄCPUÀ´Ëµ,Ñ¡Ôñ·ûµÄ0λºÍ1λ±íʾÌØȨ¼¶±ð, 2λÊÇTI(table indicator),ËüΪ0ʱ±íʾʹÓÃGDT,
Ϊ1ʱ±íʾʹÓÃLDT.¶ø´Ó3λµ½15λ²ÅÊÇÐèҪѡÔñµÄÃèÊö·ûµÄindex.Èçͼ:
+--------------------------------------------+
+ INDEX | TI | RPL |
ÔÚ±¾ÎĵĵÚһƪÖÐ,ÎÒÖ÷Òª¶Ôbootsect.s½øÐÐÁ˽²Êö. ÔÚµÚ¶þ²¿·ÖÖÐ,ÎÒ½«¶Ôsetup.s½øÐÐÃèÊö,ÎÒ½«ÆäÊÓΪÊÇLinuxÆô¶¯µÄµÚ¶þ²½Öè.
²Ù×÷ϵͳµÄÆô¶¯¹ý³ÌÊÇÒ»¸öÂþ³¤¶øÓÐÐòµÄ¹ý³Ì,¸÷¸ö½×¶Î¶¼ÓÐÆ䲻ͬµÄ×÷ÓÃ. boot;setup;initËäÈ»¿´Ëƺܽӽü,µ«ÊÇÈ´ÊÇÍêÈ«²»Í¬µÄ¹ý³Ì.ËûÃǸ÷˾ÆäÖ°,°´²¿¾Í°à.boot±È½Ï׼ȷµÄ·ÒëÓ¦¸ÃÊÇÒýµ¼,¶øsetupµÄ·Òë ......