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

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wypwjy.html