Linux 2.4.0 内核bootsect.S文件完全注释.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
说明一下,这里省略了一些print信息,目的是为了使代码短一些,而且print信息的代码都很简单,大家有兴趣可以自己读一下。 #include linux/config.h /* for CONFIG_ROOT_RDONLY */ #include asm/boot.h // 我把这些宏的定义都列在下面了。 SETUPSECS =4 /* default nr ofsetup-sectors */ BOOTSEG =0x07C0 /* original address ofboot-sector */ INITSEG =0x9000 /* we move boot here - out of theway */ SETUPSEG =0x9020 /* setup starts here */ SYSSEG =0x10000 /* system loadedat 0x10000 (65536) */ SYSSIZE =0x7F00 /* system size: # of16-byte clicks */ /* to be loaded */ ROOT_DEV =0 /* ROOT_DEV is nowwritten by build */ SWAP_DEV =0 /* SWAP_DEV is nowwritten by build */ #ifndef SVGA_MODE #define SVGA_MODE ASK_VGA #endif #ifndef RAMDISK #define RAMDISK 0 #endif #ifndef CONFIG_ROOT_RDONLY #define CONFIG_ROOT_RDONLY 1 #endif // 在此这上的部分,是不会出现在编译运行的二进制中的,这一部分内容只是汇编器所需要的信息 //下面是真正运行的代码了 .code16 // 表示下面的代码运行在16位模式下 .text .global _start //global标签的意思是让链接器可以看到_start符号。 _start: /* section 1的内容很简单,开机上电bios会把启动设备的一个扇区,加载到0x0:0x7c00 * 即BOOTSEG,并跳转到这里执行,然后程序会把自己搬运到0x:0x9000,如何搬?下面的* 代码很简单,不说了!为什么搬?最好的解释是,这块内存后面会挪作他用。 */ *****************section1****************** movw $BOOTSEG, %ax movw %ax, %ds movw $INITSEG, %ax movw %ax, %es movw $256, %cx subw %si, %si subw %di, %di cld rep movsw ****************section 1******************* // 所谓的长跳转,后面跟段基址:段内偏移。别忘了这里是16位实模式 ljmp $INITSEG, $go // 上面的ljmp的作用,就是在搬运完之后从go这里开始继续执行 go: movw $0x4000-12, %di // 用来设置栈底 // 注意在上面的搬运过程中ax被置为0x9000,即INITSEG movw %ax, %ds // 接下来这两句,将stack设置在0x9000:(0x4000 -12) movw %ax, %ss movw %di, %sp

文档评论(0)

hong333666 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档