/
lecture-10-2.srt
1816 lines (1358 loc) · 31.9 KB
/
lecture-10-2.srt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
0
00:00:00,000 --> 00:00:07,120
1
00:00:07,320 --> 00:00:10,640
好 那我们首先再回顾一下历史
2
00:00:10,680 --> 00:00:12,800
就是Lab1完成了什么事情
3
00:00:12,840 --> 00:00:15,400
我们lab1其实一开始的时候
4
00:00:15,440 --> 00:00:16,200
它有个很重要的功能
5
00:00:16,240 --> 00:00:18,120
就是printf能够输出
6
00:00:18,160 --> 00:00:19,720
能够输出字符串
7
00:00:19,760 --> 00:00:21,200
那别小看printf
8
00:00:21,240 --> 00:00:22,720
那么printf这个输出呢
9
00:00:22,760 --> 00:00:25,480
能够有效地帮助我们来知道
10
00:00:25,520 --> 00:00:26,680
我们当前执行在什么地方了
11
00:00:26,720 --> 00:00:28,560
可以通过输出一些有意义的一些
12
00:00:28,600 --> 00:00:31,040
字符或者数字来帮助你理解
13
00:00:31,080 --> 00:00:33,280
你程序的一个执行行为
14
00:00:33,400 --> 00:00:34,880
再接下来我们是完成了
15
00:00:34,920 --> 00:00:36,480
保护模式和段机制的建立
16
00:00:36,520 --> 00:00:38,240
那这个建立在我们80386
17
00:00:38,280 --> 00:00:40,640
这个硬件基础之上的
18
00:00:40,680 --> 00:00:42,560
那有了这个保护模式和段机制呢
19
00:00:42,600 --> 00:00:44,560
为我们后续的页机制的建立
20
00:00:44,600 --> 00:00:45,680
打下了一个基础
21
00:00:45,720 --> 00:00:47,840
且有了段机制和保护模式之后
22
00:00:47,880 --> 00:00:49,520
我们可以使用32位的地址空间
23
00:00:49,560 --> 00:00:50,600
这是一个很重要的一个
24
00:00:50,640 --> 00:00:52,960
就是在lab1要完成的事情
25
00:00:53,000 --> 00:00:56,440
然后我们还完成了中断的机制
26
00:00:56,480 --> 00:00:57,440
这一点很重要
27
00:00:57,480 --> 00:01:00,000
因为中断我们前面在原理课讲到
28
00:01:00,040 --> 00:01:01,080
中断是干什么呢
29
00:01:01,120 --> 00:01:04,880
中断可以来响应外设的请求
30
00:01:04,920 --> 00:01:06,840
第二个呢我们应用程序呢
31
00:01:06,880 --> 00:01:08,800
也可以通过中断这种机制
32
00:01:08,840 --> 00:01:10,640
来得到操作系统的服务
33
00:01:10,680 --> 00:01:12,400
甚至说我们应用程序写错了
34
00:01:12,440 --> 00:01:14,560
这所谓的异常 产生异常之后呢
35
00:01:14,600 --> 00:01:16,640
我们操作系统也可以有效地去处理
36
00:01:16,680 --> 00:01:18,960
那这里面呢 建立好中断机制之后呢
37
00:01:19,000 --> 00:01:22,040
为我们这次实验这个缺页异常
38
00:01:22,080 --> 00:01:23,680
缺页异常或者访问页异常
39
00:01:23,720 --> 00:01:25,920
这种情况的处理打下很好的基础
40
00:01:25,960 --> 00:01:29,000
那有了这三个的工作之后呢
41
00:01:29,040 --> 00:01:31,160
那我们在完成lab3的时候
42
00:01:31,200 --> 00:01:34,960
就可以做到有的放矢
43
00:01:35,000 --> 00:01:36,400
那我们再看一下
44
00:01:36,440 --> 00:01:38,440
这个中断机制怎么建立的
45
00:01:38,480 --> 00:01:41,200
大家还回顾一下有没有印象
46
00:01:41,240 --> 00:01:43,960
首先这里面有一个中断的一个
47
00:01:44,000 --> 00:01:45,440
中断描述符表一个寄存器
48
00:01:45,480 --> 00:01:48,920
它记录了中断描述符表的起始地址
49
00:01:48,960 --> 00:01:51,240
那中断描述符表是干什么的呢
50
00:01:51,280 --> 00:01:53,720
它其实是存了很多的中断门
51
00:01:53,760 --> 00:01:54,880
一项一项的中断门
52
00:01:54,920 --> 00:01:56,400
这个中断门指出了
53
00:01:56,440 --> 00:01:58,160
当产生一个中断之后
54
00:01:58,200 --> 00:02:00,760
它对应的中断服务例程
55
00:02:00,800 --> 00:02:02,040
应该位于什么地方
56
00:02:02,080 --> 00:02:03,200
就是干这个事情的
57
00:02:03,240 --> 00:02:04,280
那么这相当于存了一个
58
00:02:04,320 --> 00:02:06,920
相关的所有中断或者异常的
59
00:02:06,960 --> 00:02:10,160
一个记录它地址的一个地方
60
00:02:10,200 --> 00:02:11,680
这是IDT 那么我们在lab1里面
61
00:02:11,720 --> 00:02:13,440
需要把这个IDT给建立好
62
00:02:13,480 --> 00:02:14,080
还要完成一系列
63
00:02:14,120 --> 00:02:15,520
中断初始化工作之后呢
64
00:02:15,560 --> 00:02:20,240
我们中断整个机制就可以建好了
65
00:02:20,280 --> 00:02:21,840
那建好中断处理机制之后
66
00:02:21,880 --> 00:02:24,920
我们可以看到一旦产生了一个中断
67
00:02:24,960 --> 00:02:26,800
那么中断都是有个中断号
68
00:02:26,840 --> 00:02:27,680
那么这里面我说的中断
69
00:02:27,720 --> 00:02:30,200
其实也包含了异常
70
00:02:30,240 --> 00:02:31,840
中断 异常产生之后呢
71
00:02:31,880 --> 00:02:33,520
会根据它的编号
72
00:02:33,560 --> 00:02:36,160
硬件 我们CPU会找这个IDT
73
00:02:36,200 --> 00:02:38,600
我们lab1我们ucore建好这个IDT
74
00:02:38,640 --> 00:02:40,040
找到你对应的中断号
75
00:02:40,080 --> 00:02:43,400
所对应的那个我们说叫中断
76
00:02:43,440 --> 00:02:46,200
或者陷井这个gate 门 这个门
77
00:02:46,240 --> 00:02:47,280
在这个门里面呢
78
00:02:47,320 --> 00:02:48,640
很重要一点它有offset
79
00:02:48,680 --> 00:02:49,680
就是它有一个偏移
80
00:02:49,720 --> 00:02:51,000
这里面记的偏移
81
00:02:51,040 --> 00:02:53,000
同时还记录一个信息
82
00:02:53,040 --> 00:02:54,320
就是它那个selector
83
00:02:54,360 --> 00:02:56,080
我们称之为选择子
84
00:02:56,120 --> 00:02:58,600
这些概念其实在lab1里面都碰到过
85
00:02:58,640 --> 00:02:59,840
这选择子实际上
86
00:02:59,880 --> 00:03:01,200
跟我们段机制又结合起来了
87
00:03:01,240 --> 00:03:03,680
这个选择子作为Index作为一个索引
88
00:03:03,720 --> 00:03:06,520
来查找我们另外一个 另外一个表
89
00:03:06,560 --> 00:03:07,600
我们称之为GDT
90
00:03:07,640 --> 00:03:08,720
就是全局描述符表
91
00:03:08,760 --> 00:03:10,840
或者简单说就是段表
92
00:03:10,880 --> 00:03:12,280
有了段表之后呢
93
00:03:12,320 --> 00:03:13,880
根据它(选择子)的Index可以查找
94
00:03:13,920 --> 00:03:15,960
你到底它(选择子)属于哪一个段
95
00:03:16,000 --> 00:03:19,960
然后从而可以知道这个段的
96
00:03:20,000 --> 00:03:21,480
Base Address 就是基址
97
00:03:21,520 --> 00:03:25,320
这个基址加上offset形成了最终的这个
98
00:03:25,360 --> 00:03:29,160
中断服务例程的入口地址
99
00:03:29,200 --> 00:03:31,120
所以说你可以看到我们的硬件
100
00:03:31,160 --> 00:03:33,280
一旦识别产生了一个中断之后呢
101
00:03:33,320 --> 00:03:35,120
根据它的中断号或者异常号
102
00:03:35,160 --> 00:03:38,000
来再进一步查找IDT和GDT
103
00:03:38,040 --> 00:03:40,720
从而可以跳到我们说
104
00:03:40,760 --> 00:03:43,480
中断服务例程的起始地址去执行
105
00:03:43,520 --> 00:03:46,120
这是说中断机制建立完之后呢
106
00:03:46,160 --> 00:03:49,200
我们硬件可以干的事情
107
00:03:49,240 --> 00:03:50,760
那我们操作系统从哪开始工作呢
108
00:03:50,800 --> 00:03:51,920
就从这儿开始工作
109
00:03:51,960 --> 00:03:54,920
一旦我们这个EIP说
110
00:03:54,960 --> 00:03:56,720
我们程序计数器跳这个地方
111
00:03:56,760 --> 00:03:58,360
我们CPU跳出来执行之后呢
112
00:03:58,400 --> 00:04:00,280
接下来的工作就是中断服务例程
113
00:04:00,320 --> 00:04:02,360
整个处理过程也是我们ucore
114
00:04:02,400 --> 00:04:04,320
里面的lab1来完成的
115
00:04:04,360 --> 00:04:07,280
它完成了怎么去响应和进一步去
116
00:04:07,320 --> 00:04:09,760
处理这个中断或者异常这个情况
117
00:04:09,800 --> 00:04:11,760
那也意味着如果说我们在lab3里面
118
00:04:11,800 --> 00:04:13,560
产生了一个页异常的一个中断
119
00:04:13,600 --> 00:04:14,680
那我们相应应该有一个
120
00:04:14,720 --> 00:04:16,880
页异常的一个中断服务例程
121
00:04:16,920 --> 00:04:18,280
来应对这种事情
122
00:04:18,320 --> 00:04:20,360
这需要我们去在lab3中
123
00:04:20,400 --> 00:04:22,120
去完成这个练习的
124
00:04:22,160 --> 00:04:26,840
125
00:04:26,880 --> 00:04:28,040
那我们再看看lab2
126
00:04:28,080 --> 00:04:29,400
lab1做了一个简单回顾
127
00:04:29,440 --> 00:04:31,520
我们再看lab2 那lab2是干什么呢
128
00:04:31,560 --> 00:04:34,360
lab2主要是完成对物理内存的管理
129
00:04:34,400 --> 00:04:36,360
主要完成这个页表机制建立
130
00:04:36,400 --> 00:04:37,280
所以说你可以看到
131
00:04:37,320 --> 00:04:39,320
它首先要去查找当前我们内存中
132
00:04:39,360 --> 00:04:40,520
有多少物理空间
133
00:04:40,560 --> 00:04:42,360
可以去使用 建立好一个
134
00:04:42,400 --> 00:04:44,600
就是对空闲物理空间的管理
135
00:04:44,640 --> 00:04:45,960
那这里面需要注意的是
136
00:04:46,000 --> 00:04:47,920
这个物理空间呢是连续的地址
137
00:04:47,960 --> 00:04:49,640
我们管理的是一块连续地址空间
138
00:04:49,680 --> 00:04:52,120
那和我们原理课里面讲的这个
139
00:04:52,160 --> 00:04:54,200
说连续地址空间内存分配呢
140
00:04:54,240 --> 00:04:55,880
是有紧密对应关系的
141
00:04:55,920 --> 00:04:58,080
第二个我们建立一个
142
00:04:58,120 --> 00:05:00,880
很简单的一个内存分配算法
143
00:05:00,920 --> 00:05:02,800
基于连续地址空间的内存分配算法
144
00:05:02,840 --> 00:05:04,960
这个算法其实在我们
145
00:05:05,000 --> 00:05:08,360
数据结构课里面也都会涉及到
146
00:05:08,400 --> 00:05:11,320
再最后就是要建立页机制
147
00:05:11,360 --> 00:05:12,920
它从而可以实现离散地址空间的
148
00:05:12,960 --> 00:05:14,160
一个有效的管理
149
00:05:14,200 --> 00:05:16,000
可以把一个所谓的虚地址
150
00:05:16,040 --> 00:05:17,360
映射到一块物理地址
151
00:05:17,400 --> 00:05:19,280
那么这是有页表机制在这里面
152
00:05:19,320 --> 00:05:22,080
完成了所谓的地址映射工作
153
00:05:22,120 --> 00:05:23,280
怎么去建立页表机制呢
154
00:05:23,320 --> 00:05:26,960
应该说是lab2里一个重要的实验内容
155
00:05:27,000 --> 00:05:32,080
好 页表机制涉及到什么呢
156
00:05:32,120 --> 00:05:34,360
涉及到我们说页表里面
157
00:05:34,400 --> 00:05:35,760
每一项一些功能
158
00:05:35,800 --> 00:05:37,320
那里面其实关注几个
159
00:05:37,360 --> 00:05:40,520
第一个页表呢它有一个起始地址
160
00:05:40,560 --> 00:05:41,600
这个起始地址是放在
161
00:05:41,640 --> 00:05:44,440
我们的CR3寄存器里面存着的
162
00:05:44,480 --> 00:05:45,520
它CR3寄存器这是
163
00:05:45,560 --> 00:05:47,080
我们一个特殊的控制寄存器
164
00:05:47,120 --> 00:05:48,840
它存着我们建立页表的
165
00:05:48,880 --> 00:05:50,400
起始地址在什么地方
166
00:05:50,440 --> 00:05:53,280
然后页表其实也是一个大数组
167
00:05:53,320 --> 00:05:55,280
里面每一项我们称之为页目录项
168
00:05:55,320 --> 00:05:56,160
或者是页表项
169
00:05:56,200 --> 00:05:58,440
如果是对于80386 32位机器而言
170
00:05:58,480 --> 00:06:01,160
它是一个二级的一个分层的页表
171
00:06:01,200 --> 00:06:03,640
所以呢它这里面会有所谓这个
172
00:06:03,680 --> 00:06:06,440
页目录项和页表项
173
00:06:06,480 --> 00:06:07,520
这两者是不一样的
174
00:06:07,560 --> 00:06:09,520
那么是二层的一个页表结构
175
00:06:09,560 --> 00:06:10,840
对于页目录项而言
176
00:06:10,880 --> 00:06:12,480
它里面的每一项存放着什么呢
177
00:06:12,520 --> 00:06:15,560
是存放着页表的基地址就是这一块
178
00:06:15,600 --> 00:06:18,760
这是一个项 那么这一项呢是32位
179
00:06:18,800 --> 00:06:22,840
那对于页目录项来说
180
00:06:22,880 --> 00:06:24,240
它很重要的一个信息就是这个
181
00:06:24,280 --> 00:06:25,600
page table address
182
00:06:25,640 --> 00:06:29,000
就是它所指向的对应页表的起始地址
183
00:06:29,040 --> 00:06:30,720
而对于页表项来说呢
184
00:06:30,760 --> 00:06:31,800
那它存的是什么呢
185
00:06:31,840 --> 00:06:33,320
存的是对应那个物理页
186
00:06:33,360 --> 00:06:35,680
页帧的起始地址
187
00:06:35,720 --> 00:06:37,160
那有了这个起始地址
188
00:06:37,200 --> 00:06:38,600
再加上我们说那个
189
00:06:38,640 --> 00:06:40,560
EIP所表示的offset
190
00:06:40,600 --> 00:06:42,000
就是页内的偏移
191
00:06:42,040 --> 00:06:43,520
我们就会形成最终的物理地址
192
00:06:43,560 --> 00:06:46,560
那这是整个说CR3
193
00:06:46,600 --> 00:06:50,240
然后这个是页目录项还有页表项
194
00:06:50,280 --> 00:06:51,840
这三者结合在一起呢
195
00:06:51,880 --> 00:06:54,280
就可以构成一个映射机制
196
00:06:54,320 --> 00:06:56,760
那这是我们lab2里面来完成的工作
197
00:06:56,800 --> 00:07:00,040
相信大家在完成lab1 lab2之后呢
198
00:07:00,080 --> 00:07:01,920
对我刚才提到中断处理机制
199
00:07:01,960 --> 00:07:04,040
页表机制有更深刻的理解
200
00:07:04,080 --> 00:07:05,320
那么有了这个基础
201
00:07:05,360 --> 00:07:06,480
等于是有了这个机制之后呢
202
00:07:06,520 --> 00:07:10,280
我们就可以来完成虚存管理了
203
00:07:10,320 --> 00:07:13,080
那我们虚存管理要干什么事情
204
00:07:13,120 --> 00:07:15,280
首先要充分利用lab1和lab2
205
00:07:15,320 --> 00:07:16,680
已经实现好的框架
206
00:07:16,720 --> 00:07:18,160
我们已经实现好的中断处理框架
207
00:07:18,200 --> 00:07:19,400
我们实现好了页表这个
208
00:07:19,440 --> 00:07:22,080
映射机制的框架 这个我们要重用
209
00:07:22,120 --> 00:07:24,120
在基础之上我们要去设计一个
210
00:07:24,160 --> 00:07:27,120
虚存的管理总体框架 从而可以达到
211
00:07:27,160 --> 00:07:30,080
我们刚才说的那个实验目标
212
00:07:30,120 --> 00:07:31,800
在实验总体框架之后呢
213
00:07:31,840 --> 00:07:33,920
我们要去针对总体框架关键部分
214
00:07:33,960 --> 00:07:35,000
来进行处理
215
00:07:35,040 --> 00:07:38,240
比如说怎么去有效处理这个页的
216
00:07:38,280 --> 00:07:41,480
缺页错之后这个中断处理例程
217
00:07:41,520 --> 00:07:43,760
中断服务例程这一块是要去完成的
218
00:07:43,800 --> 00:07:45,440
怎么去处理针对硬盘
219
00:07:45,480 --> 00:07:47,120
因为你要把页换入换出
220
00:07:47,160 --> 00:07:49,800
换入到内存里面 从硬盘换入到内存
221
00:07:49,840 --> 00:07:52,600
或者从内存导出到我们的硬盘
222
00:07:52,640 --> 00:07:54,400
那这个swap机制
223
00:07:54,440 --> 00:07:56,320
我们称之为swap机制你要去实现
224
00:07:56,360 --> 00:07:57,960
你需要涉及到硬盘的读写
225
00:07:58,000 --> 00:08:00,160
而这一块其实在我们的原理课里面
226
00:08:00,200 --> 00:08:01,440
讲的比较少一点
227
00:08:01,480 --> 00:08:03,880
因为它很具体的和我们这个
228
00:08:03,920 --> 00:08:05,920
外设disk有打交道
229
00:08:05,960 --> 00:08:08,480
而这个其实是分散的
230
00:08:08,520 --> 00:08:11,280
那再后面就是完成页替换算法
231
00:08:11,320 --> 00:08:12,400
这是我们专门的
232
00:08:12,440 --> 00:08:14,400
就是原理课很重要的部分
233
00:08:14,440 --> 00:08:16,480
就是讲各种各样的页替换算法
234
00:08:16,520 --> 00:08:18,200
那我们需要建立好
235
00:08:18,240 --> 00:08:19,240
前面这些机制之后呢
236
00:08:19,280 --> 00:08:20,360
就可以实现页替换算法
237
00:08:20,400 --> 00:08:22,400
从而可以最终的完成
238
00:08:22,440 --> 00:08:23,400
让这个页替换算法能够
239
00:08:23,440 --> 00:08:25,400
在我们这个系统中能够正常的工作
240
00:08:25,440 --> 00:08:27,640
来实现它所表达的功能
241
00:08:27,680 --> 00:08:29,560
就是换入换出的功能
242
00:08:29,600 --> 00:08:32,920
那这是说我们是整个虚存管理
243
00:08:32,960 --> 00:08:36,080
这个lab3的总体的一个框架
244
00:08:36,120 --> 00:08:38,600
那可以看出来它和我们原理课
245
00:08:38,640 --> 00:08:39,960
有很紧密的联系
246
00:08:40,000 --> 00:08:41,320
这里面涉及到很多的知识点
247
00:08:41,360 --> 00:08:43,480
在我们原理课里面都涉及到了
248
00:08:43,520 --> 00:08:46,920
那它和原理课之间的区别在什么地方
249
00:08:46,960 --> 00:08:49,800
区别在于实验是把原理课