0 00:00:00,000 --> 00:00:07,360 1 00:00:07,560 --> 00:00:10,680 那我们看接下来看练习三 2 00:00:10,800 --> 00:00:12,600 练习三呢 我们要看 3 00:00:12,640 --> 00:00:15,640 看Bootloader到底干什么事情 4 00:00:15,680 --> 00:00:17,600 那Bootloader它实际上 5 00:00:17,640 --> 00:00:20,560 就是完成了最基本一些功能 6 00:00:20,600 --> 00:00:25,000 比如说它能够把80386的保护模式给开启 7 00:00:25,040 --> 00:00:27,760 使得现在的软件进入了 8 00:00:27,800 --> 00:00:30,240 一个32位的寻址空间 9 00:00:30,280 --> 00:00:33,480 就是我们的寻址方式发生了改变 10 00:00:33,520 --> 00:00:35,400 为了能够做好这一步 11 00:00:35,440 --> 00:00:37,640 它还需要干如下几件事情 12 00:00:37,680 --> 00:00:38,720 开启A20 13 00:00:38,760 --> 00:00:41,120 初始化全局描述符表 14 00:00:41,160 --> 00:00:44,400 最后 要使能和进入保护模式 15 00:00:44,440 --> 00:00:46,680 这三步是它干的事情 16 00:00:46,720 --> 00:00:49,040 那这三步看起来好像有点复杂 17 00:00:49,080 --> 00:00:51,080 但实际情况怎么样呢 18 00:00:51,120 --> 00:00:52,600 我们可以拿个小的程序来看 19 00:00:52,640 --> 00:00:53,960 我们现在不用lab1 20 00:00:54,000 --> 00:00:59,200 我们知道 其实之前讲很多这些代码 21 00:00:59,240 --> 00:01:01,640 也是由一个一个小的Project 22 00:01:01,680 --> 00:01:03,480 一步步形成了这个lab 23 00:01:03,520 --> 00:01:05,040 就是每个lab呢 实际上 24 00:01:05,080 --> 00:01:07,120 由一系列小的Project来构成的 25 00:01:07,160 --> 00:01:09,960 当然我们这里面已经是直接给大家提供lab 26 00:01:10,000 --> 00:01:13,200 其实我们可以看一下 lab1是什么构成的 27 00:01:13,240 --> 00:01:15,880 我们第一个lab的构成 28 00:01:15,920 --> 00:01:17,800 是由一系列的Project构成的 29 00:01:17,840 --> 00:01:20,080 那么如果我们只关注Bootloader的话 30 00:01:20,120 --> 00:01:21,800 我们会发现其实Bootloader很小 31 00:01:21,840 --> 00:01:22,880 这个代码量很小 32 00:01:22,920 --> 00:01:24,760 因为它确实只有512个字节 33 00:01:24,800 --> 00:01:27,040 所以说你可以看到我们的Project1 34 00:01:27,080 --> 00:01:29,640 当时开发的Project1 35 00:01:29,680 --> 00:01:33,080 就是一个lab1最早的一个版本 36 00:01:33,120 --> 00:01:34,080 那么这个版本干什么呢 37 00:01:34,120 --> 00:01:35,440 就是完成一个Bootloader 38 00:01:35,480 --> 00:01:39,400 它能够显示一个字符串 39 00:01:39,440 --> 00:01:43,840 这是一段很小的代码 40 00:01:43,880 --> 00:01:45,160 那么这个汇编代码 41 00:01:45,200 --> 00:01:47,880 这是Bootloader很重要一段代码 42 00:01:47,920 --> 00:01:49,520 这段代码虽然是汇编 43 00:01:49,560 --> 00:01:50,680 但是它完成的功能 44 00:01:50,720 --> 00:01:52,600 我们刚才说到的三个功能 45 00:01:52,640 --> 00:01:56,520 打开A20 建立全局描述符表 46 00:01:56,560 --> 00:02:00,480 然后使能 进入保护模式 32位的保护模式 47 00:02:00,520 --> 00:02:02,760 都是在这个汇编里面完成的 48 00:02:02,800 --> 00:02:04,680 所以说我们会给大家做个简单介绍 49 00:02:04,720 --> 00:02:07,440 这个代码其实量挺小的 50 00:02:07,480 --> 00:02:09,360 也就大约几百行代码 51 00:02:09,400 --> 00:02:12,360 两三百行代码就完成了这个功能 52 00:02:12,400 --> 00:02:13,880 那有的同学可能感兴趣 53 00:02:13,920 --> 00:02:15,960 执行出来什么效果呢 54 00:02:16,000 --> 00:02:31,760 我们可以看看 55 00:02:31,800 --> 00:02:34,360 好 它其实又编译了这么几个文件 56 00:02:34,400 --> 00:02:35,880 一个.S 一个.C 57 00:02:35,920 --> 00:02:37,640 那么这个sign.c呢 58 00:02:37,680 --> 00:02:38,760 它是一个工具 59 00:02:38,800 --> 00:02:40,520 它不是Bootloader组成部分 60 00:02:40,560 --> 00:02:44,680 而是生成主引导扇区的一个辅助工具 61 00:02:44,720 --> 00:02:49,600 通过它 生成了一个合格的Bootloader主引导扇区 62 00:02:49,640 --> 00:02:52,760 然后这个bootblock 63 00:02:52,800 --> 00:02:57,040 就是我们需要去用到一个 64 00:02:57,080 --> 00:02:59,280 需要用到一个主引导扇区 65 00:02:59,320 --> 00:03:03,120 运行一下可以看到 66 00:03:03,160 --> 00:03:05,920 它大概干什么事情 67 00:03:05,960 --> 00:03:07,360 这里面很多细节看不出来 68 00:03:07,400 --> 00:03:12,400 我们只看到显示了一个字符串 69 00:03:12,440 --> 00:03:14,280 显示一个字符串 Hello world!! 70 00:03:14,320 --> 00:03:15,200 这是Bootloader完成了一个 71 00:03:15,240 --> 00:03:16,440 Hello World的一个事情 72 00:03:16,480 --> 00:03:20,400 但在打印Hello World到屏幕上之前呢 73 00:03:20,440 --> 00:03:22,640 它其实干了很多事情 74 00:03:22,680 --> 00:03:25,160 我们刚才说的进入保护模式的 75 00:03:25,200 --> 00:03:26,760 那几件事情都完成了 76 00:03:26,800 --> 00:03:28,720 然后最后才是显示了Hello World 77 00:03:28,760 --> 00:03:31,600 而且Hello World还通过几种方式 78 00:03:31,640 --> 00:03:34,520 并口 串口和CGA 79 00:03:34,560 --> 00:03:36,320 我们说的Monitor 显示器 80 00:03:36,360 --> 00:03:38,760 这三种外设来显示 81 00:03:38,800 --> 00:03:53,320 当然这里面 我们只看到两种 82 00:03:53,360 --> 00:03:55,720 怎么开启A20的 83 00:03:55,760 --> 00:03:57,200 如何初始化GDB 84 00:03:57,240 --> 00:03:59,240 如何使能并进入保护模式 85 00:03:59,280 --> 00:04:18,720 需要大家仔细阅读这个文件的第16行到第56行 86 00:04:18,760 --> 00:04:23,560 当执行完第56行代码的时候 ljmp 87 00:04:23,600 --> 00:04:25,760 这个ljmp指令之后 88 00:04:25,800 --> 00:04:29,720 整个CPU 计算机系统会进入32位保护模式 89 00:04:29,760 --> 00:04:33,040 大家需要去了解 它怎么来进入的 90 00:04:33,080 --> 00:04:36,240 那么这里面需要去读一下它相关的代码 91 00:04:36,280 --> 00:04:40,480 以及全局表述符表的信息 92 00:04:40,520 --> 00:04:45,080 这个需要大家去稍微理解一下 93 00:04:45,120 --> 00:04:47,040 这是练习三 94 00:04:47,080 --> 00:04:47,120