说明一下,这里省略了一些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,如何搬?下面的* 代码很简单,不说了!为什么搬?最好的解释是,这块内存后面会挪作他用。