-
Notifications
You must be signed in to change notification settings - Fork 154
/
Copy path3.1.html
962 lines (446 loc) · 47.7 KB
/
3.1.html
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
<!DOCTYPE HTML>
<html lang="" >
<head>
<meta charset="UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>最简单的操作系统 · GitBook</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="description" content="">
<meta name="generator" content="GitBook 3.2.3">
<link rel="stylesheet" href="gitbook/style.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-intopic-toc/style.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-page-footer-ex/style/plugin.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-callouts/plugin.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-highlight/website.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-theme-comscore/test.css">
<link rel="stylesheet" href="styles.css">
<meta name="HandheldFriendly" content="true"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png">
<link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon">
<link rel="next" href="3.2.html" />
<link rel="prev" href="PA3.html" />
</head>
<body>
<div class="book">
<div class="book-summary">
<div id="book-search-input" role="search">
<input type="text" placeholder="Type to search" />
</div>
<nav role="navigation">
<ul class="summary">
<li class="chapter " data-level="1.1" data-path="index.html">
<a href="index.html">
Introduction
</a>
</li>
<li class="chapter " data-level="1.2" data-path="PA0.html">
<a href="PA0.html">
PA0 - 世界诞生的前夜: 开发环境配置
</a>
<ul class="articles">
<li class="chapter " data-level="1.2.1" data-path="0.1.html">
<a href="0.1.html">
Installing GNU/Linux
</a>
</li>
<li class="chapter " data-level="1.2.2" data-path="0.2.html">
<a href="0.2.html">
First Exploration with GNU/Linux
</a>
</li>
<li class="chapter " data-level="1.2.3" data-path="0.3.html">
<a href="0.3.html">
Installing Tools
</a>
</li>
<li class="chapter " data-level="1.2.4" data-path="0.4.html">
<a href="0.4.html">
Configuring vim
</a>
</li>
<li class="chapter " data-level="1.2.5" data-path="0.5.html">
<a href="0.5.html">
More Exploration
</a>
</li>
<li class="chapter " data-level="1.2.6" data-path="0.6.html">
<a href="0.6.html">
Getting Source Code for PAs
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="1.3" data-path="PA1.html">
<a href="PA1.html">
PA1 - 开天辟地的篇章: 最简单的计算机
</a>
<ul class="articles">
<li class="chapter " data-level="1.3.1" data-path="1.1.html">
<a href="1.1.html">
在开始愉快的PA之旅之前
</a>
</li>
<li class="chapter " data-level="1.3.2" data-path="1.2.html">
<a href="1.2.html">
开天辟地的篇章
</a>
</li>
<li class="chapter " data-level="1.3.3" data-path="1.3.html">
<a href="1.3.html">
RTFSC
</a>
</li>
<li class="chapter " data-level="1.3.4" data-path="1.4.html">
<a href="1.4.html">
基础设施
</a>
</li>
<li class="chapter " data-level="1.3.5" data-path="1.5.html">
<a href="1.5.html">
表达式求值
</a>
</li>
<li class="chapter " data-level="1.3.6" data-path="1.6.html">
<a href="1.6.html">
监视点
</a>
</li>
<li class="chapter " data-level="1.3.7" data-path="1.7.html">
<a href="1.7.html">
如何阅读手册
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="1.4" data-path="PA2.html">
<a href="PA2.html">
PA2 - 简单复杂的机器: 冯诺依曼计算机系统
</a>
<ul class="articles">
<li class="chapter " data-level="1.4.1" data-path="2.1.html">
<a href="2.1.html">
不停计算的机器
</a>
</li>
<li class="chapter " data-level="1.4.2" data-path="2.2.html">
<a href="2.2.html">
RTFSC(2)
</a>
</li>
<li class="chapter " data-level="1.4.3" data-path="2.3.html">
<a href="2.3.html">
程序, 运行时环境与AM
</a>
</li>
<li class="chapter " data-level="1.4.4" data-path="2.4.html">
<a href="2.4.html">
基础设施(2)
</a>
</li>
<li class="chapter " data-level="1.4.5" data-path="2.5.html">
<a href="2.5.html">
输入输出
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="1.5" data-path="PA3.html">
<a href="PA3.html">
PA3 - 穿越时空的旅程: 批处理系统
</a>
<ul class="articles">
<li class="chapter active" data-level="1.5.1" data-path="3.1.html">
<a href="3.1.html">
最简单的操作系统
</a>
</li>
<li class="chapter " data-level="1.5.2" data-path="3.2.html">
<a href="3.2.html">
穿越时空的旅程
</a>
</li>
<li class="chapter " data-level="1.5.3" data-path="3.3.html">
<a href="3.3.html">
用户程序和系统调用
</a>
</li>
<li class="chapter " data-level="1.5.4" data-path="3.4.html">
<a href="3.4.html">
文件系统
</a>
</li>
<li class="chapter " data-level="1.5.5" data-path="3.5.html">
<a href="3.5.html">
精彩纷呈的应用程序
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="1.6" data-path="PA4.html">
<a href="PA4.html">
PA4 - 虚实交错的魔法: 分时多任务
</a>
<ul class="articles">
<li class="chapter " data-level="1.6.1" data-path="4.1.html">
<a href="4.1.html">
多道程序
</a>
</li>
<li class="chapter " data-level="1.6.2" data-path="4.2.html">
<a href="4.2.html">
虚实交错的魔法
</a>
</li>
<li class="chapter " data-level="1.6.3" data-path="4.3.html">
<a href="4.3.html">
超越容量的界限
</a>
</li>
<li class="chapter " data-level="1.6.4" data-path="4.4.html">
<a href="4.4.html">
来自外部的声音
</a>
</li>
<li class="chapter " data-level="1.6.5" data-path="4.5.html">
<a href="4.5.html">
编写不朽的传奇
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="1.7" data-path="blank.html">
<a href="blank.html">
杂项
</a>
<ul class="articles">
<li class="chapter " data-level="1.7.1" data-path="FAQ.html">
<a href="FAQ.html">
常见问题(FAQ)
</a>
</li>
<li class="chapter " data-level="1.7.2" data-path="why.html">
<a href="why.html">
为什么要学习计算机系统基础
</a>
</li>
<li class="chapter " data-level="1.7.3" data-path="linux.html">
<a href="linux.html">
Linux入门教程
</a>
</li>
<li class="chapter " data-level="1.7.4" data-path="man.html">
<a href="man.html">
man入门教程
</a>
</li>
<li class="chapter " data-level="1.7.5" data-path="git.html">
<a href="git.html">
git入门教程
</a>
</li>
<li class="chapter " data-level="1.7.6" data-path="nemu-isa-api.html">
<a href="nemu-isa-api.html">
NEMU ISA相关API说明文档
</a>
</li>
<li class="chapter " data-level="1.7.7" data-path="changelog.html">
<a href="changelog.html">
更新日志
</a>
</li>
<li class="chapter " data-level="1.7.8" data-path="i386-intro.html">
<a href="i386-intro.html">
i386手册指令集阅读指南
</a>
</li>
<li class="chapter " data-level="1.7.9" data-path="exec.html">
<a href="exec.html">
指令执行例子
</a>
</li>
</ul>
</li>
<li class="divider"></li>
<li>
<a href="https://www.gitbook.com" target="blank" class="gitbook-link">
Published with GitBook
</a>
</li>
</ul>
</nav>
</div>
<div class="book-body">
<div class="body-inner">
<div class="book-header" role="navigation">
<!-- Title -->
<h1>
<i class="fa fa-circle-o-notch fa-spin"></i>
<a href="." >最简单的操作系统</a>
</h1>
</div>
<div class="page-wrapper" tabindex="-1" role="main">
<div class="page-inner">
<div id="book-search-results">
<div class="search-noresults">
<section class="normal markdown-section">
<div class="panel panel-danger"><div class="panel-heading"><h5 class="panel-title" id="没有调不出的bug-只有不理解的系统"><i class="fa fa-bullhorn"></i> 没有调不出的bug, 只有不理解的系统</h5></div><div class="panel-body"><p>PA3是整个PA的分水岭, 从PA3开始, 系统的复杂度开始逐渐上升,
越来越多的抽象层将会加入进来, 系统也开始逐渐完善, 应用也将更加真实.</p><p>这意味着, bug的传播链条会变得更复杂, 调试也越来越考验你对系统行为的理解.
如果你之前调bug都是抱大腿, 并没有在调试过程中去理解系统的细节,
你会发现在PA3中自己和大腿的差距正在迅速扩大:
大腿对整个系统的掌握越来越熟练, 而你则是越往前就越觉得寸步难行,
例如讲义和代码越来越看不懂, bug越来越神秘.</p><p>亡羊补牢的方法只有一个: 真的不能再偷懒了.</p></div></div>
<h2 id="批处理系统">批处理系统</h2>
<p>我们在PA2中已经实现了一个冯诺依曼计算机系统, 并且已经在AM上把打字游戏和FCEUX运行起来了.
有了IOE, 就几乎能把各种小游戏移植到AM上来运行了.
这些小游戏在计算机上的运行模式有一个特点, 它们会独占整个计算机系统:
我们可以在NEMU上一直玩打字游戏, 不想玩的时候,
我们就会退出NEMU, 然后重新运行FCEUX来玩.</p>
<p>事实上, 早期的计算机就是这样工作的:
系统管理员给计算机加载一个特定的程序(其实是上古时期的打孔卡片),
计算机就会一直执行这个程序, 直到程序结束或者是管理员手动终止,
然后再由管理员来手动加载下一个程序.
当年的程序也远远不如你玩的超级玛丽这么酷炫,
大多都是一些科学计算和物理建模的任务(比如弹道轨迹计算).</p>
<p>后来人们就想, 每次都要管理员来手动加载新的程序, 这太麻烦了.
回想起冯诺依曼计算机的工作方式, 它的其中一个特点就是:
当计算机执行完一条指令的时候, 就自动执行下一条指令.
类似的, 我们能不能让管理员事先准备好一组程序,
让计算机执行完一个程序之后, 就自动执行下一个程序呢?</p>
<p>这就是<a href="https://en.wikipedia.org/wiki/Batch_processing" target="_blank">批处理</a>系统的思想, 有了批处理系统之后,
就可以解放管理员的双手了. 而批处理系统的关键, 就是要有一个后台程序,
当一个前台程序执行结束的时候, 后台程序就会自动加载一个新的前台程序来执行.</p>
<p>这样的一个后台程序, 其实就是操作系统.
对, 你没有听错, 这个听上去好像什么都没做的后台程序, 真的是操作系统!
说起操作系统, 也许你会马上想到安装包都有几个GB的Windows.
但实际上, 历史上最早投入使用的操作系统<a href="https://en.wikipedia.org/wiki/GM-NAA_I/O" target="_blank">GM-NAA I/O</a>在1956年就诞生了,
而它的一个主要任务, 就是上文提到的"自动加载新程序", 具体又需要实现以下两点功能:</p>
<ul>
<li>用户程序执行结束之后, 可以跳转到操作系统的代码继续执行</li>
<li>操作系统可以加载一个新的用户程序来执行</li>
</ul>
<div class="panel panel-info"><div class="panel-heading"><h5 class="panel-title" id="什么是操作系统-建议二周目思考"><i class="fa fa-question-circle"></i> 什么是操作系统? (建议二周目思考)</h5></div><div class="panel-body"><p>这可是个大问题, 我们也鼓励你学习完操作系统课程之后再回来重新审视它.</p></div></div>
<h3 id="来自操作系统的新需求">来自操作系统的新需求</h3>
<p>仔细思考, 我们就会发现, 上述两点功能中其实蕴含着一个新的需求: 程序之间的执行流切换.
我们知道函数调用一般是在一个程序内部发生的(动态链接库除外),
属于程序内部的执行流切换, 使用call/jal指令即可实现.
而上述两点需求需要在操作系统和用户程序之间进行执行流的切换.
不过, 执行流切换的本质, 也只是把PC从一个值修改成另一个值而已(黑客眼中就是这么理解的).
那么, 我们能否也使用call/jal指令来实现程序之间的执行流切换呢?</p>
<p>也许在GM-NAA I/O诞生的那个年代, 大家说不定还真是这样做的:
操作系统就是一个库函数, 用户程序退出的时候,
调用一下这个特殊的库函数就可以了, 就像我们在AM的程序中调用<code>halt()</code>一样.
不过, 后来人们逐渐认识到, 操作系统和其它用户程序还是不太一样的:
一个用户程序出错了, 操作系统可以运行下一个用户程序;
但如果操作系统崩溃了, 整个计算机系统都将无法工作.
所以, 人们还是希望能把操作系统保护起来, 尽量保证它可以正确工作.</p>
<p>在这个需求面前, 用call/jal指令来进行操作系统和用户进程之间的切换就显得太随意了.
操作系统的本质也是一个程序, 也是由函数构成的, 但无论用户程序是无意还是有心,
我们都不希望它可以把执行流切换到操作系统中的任意函数.
我们所希望的, 是一种可以限制入口的执行流切换方式,
显然, 这种方式是无法通过程序代码来实现的.</p>
<h3 id="等级森严的制度">等级森严的制度</h3>
<p>为了阻止程序将执行流切换到操作系统的任意位置, 硬件中逐渐出现保护机制相关的功能,
比如i386中引入了保护模式(protected mode)和特权级(privilege level)的概念,
而mips32处理器可以运行在内核模式和用户模式,
riscv32则有机器模式(M-mode), 监控者模式(S-mode)和用户模式(U-mode).
这些概念的思想都是类似的: 简单地说,
只有高特权级的程序才能去执行一些系统级别的操作,
如果一个特权级低的程序尝试执行它没有权限执行的操作,
CPU将会抛出一个异常信号, 来阻止这一非法行为的发生.
一般来说, 最适合担任系统管理员的角色就是操作系统了, 它拥有最高的特权级, 可以执行所有操作;
而除非经过允许, 运行在操作系统上的用户程序一般都处于最低的特权级,
如果它试图破坏社会的和谐, 它将会被判"死刑".</p>
<p>以支持现代操作系统的RISC-V处理器为例, 它们存在M, S, U三个特权模式,
分别代表机器模式, 监管者模式和用户模式.
M模式特权级最高, U模式特权级最低, 低特权级能访问的资源, 高特权级也能访问.
那CPU是怎么判断一个进程是否执行了无权限操作呢?
答案很简单, 只要在硬件上维护一个用于标识当前特权模式的寄存器(属于计算机状态的一部分),
然后在访问那些高特权级才能访问的资源时, 对当前特权模式进行检查.
例如RISC-V中有一条特权指令<code>sfence.vma</code>, 手册要求只有当处理器当前的特权模式不低于S模式才能执行,
因此我们可以在硬件上添加一些简单的逻辑来实现特权模式的检查:</p>
<pre><code>is_sfence_vma_ok = (priv_mode == M_MODE) || (priv_mode == S_MODE);
</code></pre><p>可以看到, 特权模式的检查只不过是一些门电路而已.
如果检查不通过, 此次操作将会被判定为非法操作,
CPU将会抛出异常信号, 并跳转到一个和操作系统约定好的内存位置, 交由操作系统进行后续处理.</p>
<p>通常来说, 操作系统运行在S模式, 因此有权限访问所有的代码和数据;
而一般的程序运行在U模式, 这就决定了它只能访问U模式的代码和数据.
这样, 只要操作系统将其私有代码和数据放S模式中, 恶意程序就永远没有办法访问到它们.</p>
<p>类似地, x86的操作系统运行在ring 0, 用户进程运行在ring 3;
mips32的操作系统运行在内核模式, 用户进程运行在用户模式.
这些保护相关的概念和检查过程都是通过硬件实现的,
只要软件运行在硬件上面, 都无法逃出这一天网.
硬件保护机制使得恶意程序永远无法全身而退, 为构建计算机和谐社会作出了巨大的贡献.</p>
<p>这是多美妙的功能! 遗憾的是, 上面提到的很多概念其实只是一带而过,
真正的保护机制也还需要考虑更多的细节.
ISA手册中一般都会专门有一章来描述保护机制, 这就已经看出来保护机制并不是简单说说而已.
根据KISS法则, 我们并不打算在NEMU中加入保护机制.
我们让所有用户进程都运行在最高特权级, 虽然所有用户进程都有权限执行所有指令,
不过由于PA中的用户程序都是我们自己编写的, 一切还是在我们的控制范围之内.
毕竟, 我们也已经从上面的故事中体会到保护机制的本质了:
在硬件中加入一些与特权级检查相关的门电路(例如比较器电路), 如果发现了非法操作,
就会抛出一个异常信号, 让CPU跳转到一个约定好的目标位置, 并进行后续处理.</p>
<div class="panel panel-info"><div class="panel-heading"><h5 class="panel-title" id="分崩离析的秩序"><i class="fa fa-comment-o"></i> 分崩离析的秩序</h5></div><div class="panel-body"><p>特权级保护是现代计算机系统的一个核心机制, 但并不是有了这一等级森严的制度就高枕无忧了,
黑客们总是会绞尽脑汁去试探这一制度的边界.
最近席卷计算机领域的, 就要数2018年1月爆出的<a href="https://meltdownattack.com/" target="_blank">Meltdown和Spectre</a>这两个大名鼎鼎的硬件漏洞了.
这两个史诗级别的漏洞之所以震惊全世界, 是因为它们打破了特权级的边界:
恶意程序在特定的条件下可以以极高的速率窃取操作系统的信息.
Intel的芯片被指出均存在Meltdown漏洞, 而Spectre漏洞则是危害着所有架构的芯片,
无一幸免, 可谓目前为止体系结构历史上影响最大的两个漏洞了.
如果你执行<code>cat /proc/cpuinfo</code>, 你可能会在<code>bugs</code>信息中看到这两个漏洞的影子.</p><p>Meltdown和Spectre给过去那些一味追求性能的芯片设计师敲响了警钟:
没有安全, 芯片跑得再快, 也是徒然.
有趣的是, 直接为这场闹剧买单的, 竟然是各大云计算平台的工程师们:
漏洞被爆出的那一周时间, 阿里云和微软Azure的工程师连续通宵加班,
想尽办法给云平台打上安全补丁, 以避免客户的数据被恶意窃取.</p><p>不过作为教学实验, 安全这个话题离PA还是太遥远了, 甚至性能也不是PA的主要目标.
这个例子想说的是, 真实的计算机系统非常复杂, 远远没到完美的程度.
这些漏洞的出现从某种程度上也说明了, 人们已经没法一下子完全想明白每个模块之间的相互影响了;
但计算机背后的原理都是一脉相承的, 在一个小而精的教学系统中理解这些原理,
然后去理解, 去改进真实的系统, 这也是做PA的一种宝贵的收获.</p></div></div>
<footer class="page-footer-ex"> <span class="page-footer-ex-copyright"> By <a href="https://sashimi-yzh.github.io/" target="_blank">Zihao Yu</a>, 采用<a href="http://creativecommons.org/licenses/by-nc-sa/3.0/cn/" target="_blank">知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议</a>发布 </span>            <span class="page-footer-ex-footer-update"> 此页面修订于: 2023-10-02 16:32:48 </span> </footer>
</section>
</div>
<div class="search-results">
<div class="has-results">
<h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
<ul class="search-results-list"></ul>
</div>
<div class="no-results">
<h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
</div>
</div>
</div>
</div>
</div>
</div>
<a href="PA3.html" class="navigation navigation-prev " aria-label="Previous page: PA3 - 穿越时空的旅程: 批处理系统">
<i class="fa fa-angle-left"></i>
</a>
<a href="3.2.html" class="navigation navigation-next " aria-label="Next page: 穿越时空的旅程">
<i class="fa fa-angle-right"></i>
</a>
</div>
<script>
var gitbook = gitbook || [];
gitbook.push(function() {
gitbook.page.hasChanged({"page":{"title":"最简单的操作系统","level":"1.5.1","depth":2,"next":{"title":"穿越时空的旅程","level":"1.5.2","depth":2,"path":"3.2.md","ref":"3.2.md","articles":[]},"previous":{"title":"PA3 - 穿越时空的旅程: 批处理系统","level":"1.5","depth":1,"path":"PA3.md","ref":"PA3.md","articles":[{"title":"最简单的操作系统","level":"1.5.1","depth":2,"path":"3.1.md","ref":"3.1.md","articles":[]},{"title":"穿越时空的旅程","level":"1.5.2","depth":2,"path":"3.2.md","ref":"3.2.md","articles":[]},{"title":"用户程序和系统调用","level":"1.5.3","depth":2,"path":"3.3.md","ref":"3.3.md","articles":[]},{"title":"文件系统","level":"1.5.4","depth":2,"path":"3.4.md","ref":"3.4.md","articles":[]},{"title":"精彩纷呈的应用程序","level":"1.5.5","depth":2,"path":"3.5.md","ref":"3.5.md","articles":[]}]},"dir":"ltr"},"config":{"gitbook":"3.x.x","theme":"default","variables":{},"plugins":["theme-comscore","intopic-toc","localized-footer","page-footer-ex","callouts"],"pluginsConfig":{"callouts":{"option":{"alert":"info","picto":"fa-edit"},"flag":{"alert":"success","picto":"fa-flag"},"question":{"alert":"info","picto":"fa-question-circle"},"info":{"alert":"info","picto":"fa-info-circle"},"todo":{"alert":"warning","picto":"fa-edit"},"caution":{"alert":"danger","picto":"fa-bullhorn"},"danger":{"alert":"danger","picto":"fa-exclamation"},"showTypeInHeader":false},"intopic-toc":{"isCollapsed":false,"isScrollspyActive":true,"label":"导航","maxDepth":6,"mode":"nested","selector":".markdown-section h2, .markdown-section h3, .markdown-section h4","visible":true},"page-footer-ex":{"copyright":"By [Zihao Yu](https://sashimi-yzh.github.io/), 采用[知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议](http://creativecommons.org/licenses/by-nc-sa/3.0/cn/)发布","markdown":true,"update_format":"YYYY-MM-DD HH:mm:ss","update_label":"此页面修订于: "},"search":{},"localized-footer":{"filename":"FOOTER.md","hline":"true"},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"fontsettings":{"theme":"white","family":"sans","size":2},"highlight":{},"theme-comscore":{},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"styles":{"website":"styles.css","pdf":"styles.css"}},"file":{"path":"3.1.md","mtime":"2023-10-02T08:32:48.512Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2025-01-03T02:26:44.310Z"},"basePath":".","book":{"language":""}});
});
</script>
</div>
<script src="gitbook/gitbook.js"></script>
<script src="gitbook/theme.js"></script>
<script src="gitbook/gitbook-plugin-intopic-toc/anchor.min.js"></script>
<script src="gitbook/gitbook-plugin-intopic-toc/gumshoe.polyfills.min.js"></script>
<script src="gitbook/gitbook-plugin-intopic-toc/plugin.js"></script>
<script src="gitbook/gitbook-plugin-search/search-engine.js"></script>
<script src="gitbook/gitbook-plugin-search/search.js"></script>
<script src="gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
<script src="gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
<script src="gitbook/gitbook-plugin-sharing/buttons.js"></script>
<script src="gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
<script src="gitbook/gitbook-plugin-theme-comscore/test.js"></script>
</body>
</html>