关于Linux启动代码bootsect.S setup.S head.S 的问题。
时间:2006-06-16
来源:互联网
1、在bootsect.S中将setup从磁盘拷贝到内存0x90200处,拷贝的扇区数是4,也就是拷贝2048字节,如果setup大于2048字节怎么办呢?我的系统上就是7千多字节,我看了代码似懂非懂的似乎在setup.S里有处理。
2、在三个.S执行过程中,bootsect setup system的位置是怎样移动的,我是这样理解(地址均为绝对地址):加电自检后,如果从软盘引导系统(我看的2.6.16不再支持,必须要用boot loader),BIOS读入bootsect到0x7c00,bootsect将自己移动到0x90000(512字节),bootsect将setup从磁盘读入到0x90200,紧挨着bootsect。bootsect将system(head.S+misc.o+kernel)从磁盘读入到0x10000,然后setup把通过BIOS获得的系统信息拷贝到0x90000开始的区域给保护模式代码所用,bootsect被覆盖。然后下面就不怎么看得懂了。
问题:
(1)setup如何搬system的?
(2)setup怎么跳到head.S去执行的?
以上似乎根据-D__BIG_KERNEL__有不同的分支,请高人指点。
----------------------------------
再贴一些看不懂的代码片段,请高手帮忙注释
---------------1-----------------
......
start_of_setup:
# Bootlin depends on this being done early
movw $0x01500, %ax
movb $0x81, %dl
int $0x13
......
---------------2-----------------
......
movw $1, %ax # protected mode (PE) bit
lmsw %ax # This is it!
jmp flush_instr
flush_instr:
xorw %bx, %bx # Flag to indicate a boot
xorl %esi, %esi # Pointer to real-mode code
movw %cs, %si
subw $DELTA_INITSEG, %si
shll $4, %esi # Convert to 32-bit pointer
# jump to startup_32 in arch/i386/boot/compressed/head.S
#
# NOTE: For high loaded big kernels we need a
# jmpi 0x100000,__BOOT_CS
上面的一段似乎会跳去head.S,可是jmpi 0x100000,__BOOT_CS就不理解了,此时kernel还没有decompress,怎么会从setup直接跳到0x100000呢?
----------------------------------
2、在三个.S执行过程中,bootsect setup system的位置是怎样移动的,我是这样理解(地址均为绝对地址):加电自检后,如果从软盘引导系统(我看的2.6.16不再支持,必须要用boot loader),BIOS读入bootsect到0x7c00,bootsect将自己移动到0x90000(512字节),bootsect将setup从磁盘读入到0x90200,紧挨着bootsect。bootsect将system(head.S+misc.o+kernel)从磁盘读入到0x10000,然后setup把通过BIOS获得的系统信息拷贝到0x90000开始的区域给保护模式代码所用,bootsect被覆盖。然后下面就不怎么看得懂了。
问题:
(1)setup如何搬system的?
(2)setup怎么跳到head.S去执行的?
以上似乎根据-D__BIG_KERNEL__有不同的分支,请高人指点。
----------------------------------
再贴一些看不懂的代码片段,请高手帮忙注释
---------------1-----------------
......
start_of_setup:
# Bootlin depends on this being done early
movw $0x01500, %ax
movb $0x81, %dl
int $0x13
......
---------------2-----------------
......
movw $1, %ax # protected mode (PE) bit
lmsw %ax # This is it!
jmp flush_instr
flush_instr:
xorw %bx, %bx # Flag to indicate a boot
xorl %esi, %esi # Pointer to real-mode code
movw %cs, %si
subw $DELTA_INITSEG, %si
shll $4, %esi # Convert to 32-bit pointer
# jump to startup_32 in arch/i386/boot/compressed/head.S
#
# NOTE: For high loaded big kernels we need a
# jmpi 0x100000,__BOOT_CS
上面的一段似乎会跳去head.S,可是jmpi 0x100000,__BOOT_CS就不理解了,此时kernel还没有decompress,怎么会从setup直接跳到0x100000呢?
----------------------------------
作者: firstbyte 发布时间: 2006-06-16
偶先吃饭去了,但愿回来的时候....嘿嘿
作者: firstbyte 发布时间: 2006-06-16
可以参考赵炯的《linux内核剖析》,里面有详细的描述
作者: 雪夜流星 发布时间: 2006-06-16
参看《linux1.0核心游记》,有详细的描述!从系统被bios加载到解压缩,有详细的图片流程图!呵呵!
作者: gotop2004 发布时间: 2006-06-18
没人记得么?
作者: chengaxj8 发布时间: 2006-06-20
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28