|
发表于 2009-9-29 15:23:30
|
显示全部楼层
我的几个疑问
我选的是grub0.93,假设启动盘是默认的硬盘启动,且支持lba寻址,
问题一:
读stage1时,有这么一句
lba_mode:
/* save the total number of sectors */
movl 0x10(%si), %ecx
则ecx=?,the total numbers of sectors 作何解?,有何用处?是bios先在0x10(%si)设置好的吗?
问题二:
stage1把控制权交给了stage2中的start.s后,假设设置了stage1_5,继续往下读,此时start.s已被加载到0x8000处,由此开始执行#ifdef STAGE1_5
# define ABS(x) (x-_start+0x2000)
#else
# define ABS(x) (x-_start+0x8000)
#endif /* STAGE1_5 */
#define MSG(x) movw $ABS(x), %si; call message
这段等效为define ABS(x) (x-_start+0x2000)
执行到MSG(notification_string),问题出来了,movw$ABS(notification_string),%si;call message;
等效为movw$(notification_string-_start+0x2000),%si;call message;
我们知道此时notification的绝对地址应当是notification_srting-_start+0x8000才对啊?
问题三:读asm.s
发现访问符号地址是并未对其进行绝对地址转换的过程,例如:ifndef SUPPORT_DISKLESS
/* save boot drive reference */
ADDR32 movb %dl, EXT_C(boot_drive)
/* reset disk system (%ah = 0) */
int $0x13
#endif
像这里的boot_drive 为什么呢?这样不需要绝对地址的吗?
问题四:DATA32 ADDR32 lgdt gdtdesc 这条指令的两个前缀是什么意思啊 |
|