-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
874 lines (516 loc) · 30.9 KB
/
index.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
<!DOCTYPE html>
<html theme="dark" showBanner="true" hasBanner="true" >
<link href="https://cdn.staticfile.org/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet">
<link href="https://cdn.staticfile.org/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet">
<link href="https://cdn.staticfile.org/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet">
<script src="/js/color.global.min.js" ></script>
<script src="/js/load-settings.js" ></script>
<head>
<meta charset="utf-8">
<title>Catizard's blog</title>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="preload" href="/css/fonts/Roboto-Regular.ttf" as="font" type="font/ttf" crossorigin="anonymous">
<link rel="preload" href="/css/fonts/Roboto-Bold.ttf" as="font" type="font/ttf" crossorigin="anonymous">
<meta property="og:type" content="website">
<meta property="og:title" content="Catizard's blog">
<meta property="og:url" content="https://catizard.github.io/index.html">
<meta property="og:site_name" content="Catizard's blog">
<meta property="og:locale" content="zh_CN">
<meta property="article:author" content="Catizard">
<meta name="twitter:card" content="summary">
<link rel="alternate" href="/atom.xml" title="Catizard's blog" type="application/atom+xml">
<link rel="icon" media="(prefers-color-scheme: light)" href="/images/favicon-light-32.png" sizes="32x32">
<link rel="icon" media="(prefers-color-scheme: light)" href="/images/favicon-light-128.png" sizes="128x128">
<link rel="icon" media="(prefers-color-scheme: light)" href="/images/favicon-light-180.png" sizes="180x180">
<link rel="icon" media="(prefers-color-scheme: light)" href="/images/favicon-light-192.png" sizes="192x192">
<link rel="icon" media="(prefers-color-scheme: dark)" href="/images/favicon-dark-32.png" sizes="32x32">
<link rel="icon" media="(prefers-color-scheme: dark)" href="/images/favicon-dark-128.png" sizes="128x128">
<link rel="icon" media="(prefers-color-scheme: dark)" href="/images/favicon-dark-180.png" sizes="180x180">
<link rel="icon" media="(prefers-color-scheme: dark)" href="/images/favicon-dark-192.png" sizes="192x192">
<link rel="stylesheet" href="/css/style.css">
<meta name="generator" content="Hexo 7.1.1"></head>
<body>
<div id="banner" class=" is_home ">
<img src="/banner.jpg" itemprop="image">
<div id="banner-dim"></div>
</div>
<div id="main-grid" class=" ">
<div id="nav" class=" is_home " >
<navbar id="navbar">
<nav id="title-nav">
<a href="/">
<div id="vivia-logo">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
<div>Catizard's blog </div>
</a>
</nav>
<nav id="main-nav">
<a class="main-nav-link" href="/">Home</a>
<a class="main-nav-link" href="/archives">Archives</a>
<a class="main-nav-link" href="/about">About</a>
</nav>
<nav id="sub-nav">
<a id="theme-btn" class="nav-icon">
<span class="light-mode-icon"><svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="M438.5-829.913v-48q0-17.452 11.963-29.476 11.964-12.024 29.326-12.024 17.363 0 29.537 12.024t12.174 29.476v48q0 17.452-11.963 29.476-11.964 12.024-29.326 12.024-17.363 0-29.537-12.024T438.5-829.913Zm0 747.826v-48q0-17.452 11.963-29.476 11.964-12.024 29.326-12.024 17.363 0 29.537 12.024t12.174 29.476v48q0 17.452-11.963 29.476-11.964 12.024-29.326 12.024-17.363 0-29.537-12.024T438.5-82.087ZM877.913-438.5h-48q-17.452 0-29.476-11.963-12.024-11.964-12.024-29.326 0-17.363 12.024-29.537t29.476-12.174h48q17.452 0 29.476 11.963 12.024 11.964 12.024 29.326 0 17.363-12.024 29.537T877.913-438.5Zm-747.826 0h-48q-17.452 0-29.476-11.963-12.024-11.964-12.024-29.326 0-17.363 12.024-29.537T82.087-521.5h48q17.452 0 29.476 11.963 12.024 11.964 12.024 29.326 0 17.363-12.024 29.537T130.087-438.5Zm660.174-290.87-34.239 32q-12.913 12.674-29.565 12.174-16.653-.5-29.327-13.174-12.674-12.673-12.554-28.826.12-16.152 12.794-28.826l33-35q12.913-12.674 30.454-12.674t30.163 12.847q12.709 12.846 12.328 30.826-.38 17.98-13.054 30.653ZM262.63-203.978l-32 34q-12.913 12.674-30.454 12.674t-30.163-12.847q-12.709-12.846-12.328-30.826.38-17.98 13.054-30.653l33.239-31q12.913-12.674 29.565-12.174 16.653.5 29.327 13.174 12.674 12.673 12.554 28.826-.12 16.152-12.794 28.826Zm466.74 33.239-32-33.239q-12.674-12.913-12.174-29.565.5-16.653 13.174-29.327 12.673-12.674 28.826-13.054 16.152-.38 28.826 12.294l35 33q12.674 12.913 12.674 30.454t-12.847 30.163q-12.846 12.709-30.826 12.328-17.98-.38-30.653-13.054ZM203.978-697.37l-34-33q-12.674-12.913-13.174-29.945-.5-17.033 12.174-29.707t31.326-13.293q18.653-.62 31.326 13.054l32 34.239q11.674 12.913 11.174 29.565-.5 16.653-13.174 29.327-12.673 12.674-28.826 12.554-16.152-.12-28.826-12.794ZM480-240q-100 0-170-70t-70-170q0-100 70-170t170-70q100 0 170 70t70 170q0 100-70 170t-170 70Zm-.247-82q65.703 0 111.475-46.272Q637-414.544 637-480.247t-45.525-111.228Q545.95-637 480.247-637t-111.475 45.525Q323-545.95 323-480.247t45.525 111.975Q414.05-322 479.753-322ZM481-481Z"/></svg></span>
<span class="dark-mode-icon"><svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="M480.239-116.413q-152.63 0-258.228-105.478Q116.413-327.37 116.413-480q0-130.935 77.739-227.435t206.304-125.043q43.022-9.631 63.87 10.869t3.478 62.805q-8.891 22.043-14.315 44.463-5.424 22.42-5.424 46.689 0 91.694 64.326 155.879 64.325 64.186 156.218 64.186 24.369 0 46.978-4.946 22.609-4.945 44.413-14.076 42.826-17.369 62.967 1.142 20.142 18.511 10.511 61.054Q807.174-280 712.63-198.206q-94.543 81.793-232.391 81.793Zm0-95q79.783 0 143.337-40.217 63.554-40.218 95.793-108.283-15.608 4.044-31.097 5.326-15.49 1.283-31.859.805-123.706-4.066-210.777-90.539-87.071-86.473-91.614-212.092-.24-16.369.923-31.978 1.164-15.609 5.446-30.978-67.826 32.478-108.282 96.152Q211.652-559.543 211.652-480q0 111.929 78.329 190.258 78.329 78.329 190.258 78.329ZM466.13-465.891Z"/></svg></span>
</a>
<a id="nav-rss-link" class="nav-icon mobile-hide" href="/atom.xml" title="RSS 订阅">
<svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="M198-120q-25.846 0-44.23-18.384-18.384-18.385-18.384-44.23 0-25.846 18.384-44.23 18.384-18.385 44.23-18.385 25.846 0 44.23 18.385 18.384 18.384 18.384 44.23 0 25.845-18.384 44.23Q223.846-120 198-120Zm538.385 0q-18.846 0-32.923-13.769-14.076-13.769-15.922-33.23-8.692-100.616-51.077-188.654-42.385-88.039-109.885-155.539-67.5-67.501-155.539-109.885Q283-663.462 182.385-672.154q-19.461-1.846-33.23-16.23-13.769-14.385-13.769-33.846t14.076-32.922q14.077-13.461 32.923-12.23 120.076 8.692 226.038 58.768 105.961 50.077 185.73 129.846 79.769 79.769 129.846 185.731 50.077 105.961 58.769 226.038 1.231 18.846-12.538 32.922Q756.461-120 736.385-120Zm-252 0q-18.231 0-32.423-13.461t-18.653-33.538Q418.155-264.23 348.886-333.5q-69.27-69.27-166.501-84.423-20.077-4.462-33.538-18.961-13.461-14.5-13.461-33.346 0-19.076 13.884-33.23 13.884-14.153 33.115-10.922 136.769 15.384 234.384 112.999 97.615 97.615 112.999 234.384 3.231 19.23-10.538 33.115Q505.461-120 484.385-120Z"/></svg>
</a>
<div id="nav-menu-btn" class="nav-icon">
<svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="M177.37-252.282q-17.453 0-29.477-11.964-12.024-11.963-12.024-29.326t12.024-29.537q12.024-12.174 29.477-12.174h605.26q17.453 0 29.477 11.964 12.024 11.963 12.024 29.326t-12.024 29.537q-12.024 12.174-29.477 12.174H177.37Zm0-186.218q-17.453 0-29.477-11.963-12.024-11.964-12.024-29.326 0-17.363 12.024-29.537T177.37-521.5h605.26q17.453 0 29.477 11.963 12.024 11.964 12.024 29.326 0 17.363-12.024 29.537T782.63-438.5H177.37Zm0-186.217q-17.453 0-29.477-11.964-12.024-11.963-12.024-29.326t12.024-29.537q12.024-12.174 29.477-12.174h605.26q17.453 0 29.477 11.964 12.024 11.963 12.024 29.326t-12.024 29.537q-12.024 12.174-29.477 12.174H177.37Z"/></svg>
</div>
</nav>
</navbar>
<div id="nav-dropdown" class="hidden">
<div id="dropdown-link-list">
<a class="nav-dropdown-link" href="/">Home</a>
<a class="nav-dropdown-link" href="/archives">Archives</a>
<a class="nav-dropdown-link" href="/about">About</a>
<a class="nav-dropdown-link" href="/atom.xml" title="RSS 订阅">RSS</a>
</div>
</div>
<script>
let dropdownBtn = document.getElementById("nav-menu-btn");
let dropdownEle = document.getElementById("nav-dropdown");
dropdownBtn.onclick = function() {
dropdownEle.classList.toggle("hidden");
}
</script>
</div>
<div id="sidebar-wrapper">
<sidebar id="sidebar">
<div class="widget-wrap">
<div class="info-card">
<div class="avatar">
<div class="img-dim"></div>
</div>
<div class="info">
<div class="username">Catizard </div>
<div class="dot"></div>
<div class="subtitle"> </div>
<div class="link-list">
<a class="link-btn" target="_blank" rel="noopener" href="https://github.com/Catizard" title="GitHub"><i class="fa-brands fa-github"></i></a>
</div>
</div>
</div>
</div>
<div class="sticky">
<div class="widget-wrap">
<div class="widget">
<h3 class="widget-title">标签</h3>
<ul class="widget-tag-list" itemprop="keywords"><li class="widget-tag-list-item"><a class="widget-tag-list-link" href="/tags/NJU-PA/" rel="tag">NJU PA</a></li><li class="widget-tag-list-item"><a class="widget-tag-list-link" href="/tags/mit6-s081/" rel="tag">mit6.s081</a></li></ul>
</div>
</div>
</div>
</sidebar>
</div>
<div id="content-body">
<article id="post-mit6-s081-chapter4" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-inner">
<div class="article-main">
<header class="article-header">
<div class="main-title-bar">
<div class="main-title-dot"></div>
<h1 itemprop="name">
<a class="p-name article-title" href="/2024/05/04/mit6-s081-chapter4/">mit6.s081 chapter4</a>
</h1>
</div>
<div class='meta-info-bar'>
<div class="meta-info">
<time class="dt-published" datetime="2024-05-04T09:56:15.000Z" itemprop="datePublished">2024-05-04</time>
</div>
<div class="need-seperator meta-info">
<div class="meta-cate-flex">
未分类
</div>
</div>
<div class="wordcount need-seperator meta-info">
1.7k 词
</div>
</div>
<ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/mit6-s081/" rel="tag">mit6.s081</a></li></ul>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<div class="truncate-text">
Lab: Copy-on-Write Fork for xv62021的lab没有了lazy lab作为COW的前置,虽然实验内容里提到了lazy lab。而且提示里少了一两条非常关键的信息,似乎默认了做过前面的lab。
在做这个lab之前先读一下fork的流程:
分配一个新进程np = allocproc()
把整个内存空间复制给新进程uvncopy(p->pagetable, np->pagetable, p->sz)
复制寄存器,设置函数返回值*(np->trapframe) = *(p->trapframe); np->trapframe->a0=0
所有进程已经打开的文件,链接数+1
设置基础数据,名称状态父级等
这里要优化的就是第二步:复制整个内存空间的操作太大。改为懒惰机制:只在有必要的时候复制物理内存。
改写uvmcopyuvmcopy目前的实现是直接分配一个物理内存mem=kalloc(),然后将其映射在新进程的内存空间里。现在,不直接分配一个物理内存而是将手上的物理内存pa映射给新进程。
两个进程前后走到的物理页的...
</div>
</div>
</div>
<a class="right-panel non-pic "
href="/2024/05/04/mit6-s081-chapter4/"
>
<i class="fa-solid fa-angle-right non-pic"></i>
</a>
</div>
</article>
<article id="post-mit6-s081-chapter3" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-inner">
<div class="article-main">
<header class="article-header">
<div class="main-title-bar">
<div class="main-title-dot"></div>
<h1 itemprop="name">
<a class="p-name article-title" href="/2024/04/05/mit6-s081-chapter3/">mit6.s081 chapter3</a>
</h1>
</div>
<div class='meta-info-bar'>
<div class="meta-info">
<time class="dt-published" datetime="2024-04-05T10:55:09.000Z" itemprop="datePublished">2024-04-05</time>
</div>
<div class="need-seperator meta-info">
<div class="meta-cate-flex">
未分类
</div>
</div>
<div class="wordcount need-seperator meta-info">
3.6k 词
</div>
</div>
<ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/mit6-s081/" rel="tag">mit6.s081</a></li></ul>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<div class="truncate-text">
问题
为什么需要虚拟内存?
早期在操作系统只能同时运行一个程序,操作系统只是一组库函数,在物理内存里存在,例如占据[0,64KB)的位置,然后运行的程序可以直接操作从64KB开始的物理内存。如果需要切换运行的用户程序,只需要将用户程序加载到64KB开始的位置,然后执行指令即可。
但是随着同时运行多个用户程序的需求产生,直接操作物理内存的弊端就露出来了:在之前只有一个用户程序的时候,损坏了操作系统部分的内存坏了就坏了,重启可以解决。如果有多个程序,错误地读(甚至写)操作系统或者其他用户程序的内存部分,就是一个很麻烦的事情了。
所以我们希望有隔离性:用户程序与用户程序之间(当然操作系统本身也是)不能互相覆盖。但是过强的隔离性也不行,用户程序之间应该有交流的方式。
其次就是易用性:虚拟内存空间是给用户程序单独所见的,所以他的排布方式可以是固定的,并且可以确定从0开始到一个最大值。虚拟内存空间不需要在物理内存里保持连续。
为什么需要有三级页表?
首先给虚拟内存空间机制下一个定义,他可以看作是一个函数:f(va)=pa,将一个虚拟地址转换为一个物理地址。
所以最简单的实现方式就是:记...
</div>
</div>
</div>
<a class="right-panel non-pic "
href="/2024/04/05/mit6-s081-chapter3/"
>
<i class="fa-solid fa-angle-right non-pic"></i>
</a>
</div>
</article>
<article id="post-NJU-PA4" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-inner">
<div class="article-main">
<header class="article-header">
<div class="main-title-bar">
<div class="main-title-dot"></div>
<h1 itemprop="name">
<a class="p-name article-title" href="/2024/04/04/NJU-PA4/">NJU PA4</a>
</h1>
</div>
<div class='meta-info-bar'>
<div class="meta-info">
<time class="dt-published" datetime="2024-04-03T19:30:41.000Z" itemprop="datePublished">2024-04-03</time>
</div>
<div class="need-seperator meta-info">
<div class="meta-cate-flex">
未分类
</div>
</div>
<div class="wordcount need-seperator meta-info">
3k 词
</div>
</div>
<ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/NJU-PA/" rel="tag">NJU PA</a></li></ul>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<div class="truncate-text">
多道程序批处理系统目前的缺陷是同一时刻只能执行一个程序。在一些场景下cpu会浪费,比如等待硬件的数据读取的时间里cpu要一直空转等待。所以很自然的一个新的需求就是:在操作系统上期望能“同时”运行多个程序。
接下来需要实现两个目标:
在内存中可以同时存在多个进程
在满足某些条件的情况下, 可以让执行流在这些进程之间切换
前者是之前在加载阶段做过的,程序就是一截指令序列,通过上下文赋予其意义。既然要运行多个自然就要有能加载多个的能力。
为什么需要使用不同的栈空间?思考一下目前阶段程序所使用的栈空间,是在am的链接脚本中定义的,他直接划分了硬件提供的内存空间:将前面一部分分配为栈区,后面全部为堆区。这个堆栈是am这个运行环境提供给在上面运行的nanos-lite使用的,而目前nanos-lite加载应用程序是直接的内存拷贝,运行应用程序是简单的函数调用,让pc指针走到内存中特定的位置然后加载指令
上下文切换之前在CTE里是通过栈指针恢复数据的:将当前的数据保存到栈上,恢复时让函数参数的寄存器指向这里,就能获取到当时保存的数据了。
对于多个进程的切换,在这里可以偷梁换柱:A进程的...
</div>
</div>
</div>
<a class="right-panel non-pic "
href="/2024/04/04/NJU-PA4/"
>
<i class="fa-solid fa-angle-right non-pic"></i>
</a>
</div>
</article>
<article id="post-NJU-PA3" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-inner">
<div class="article-main">
<header class="article-header">
<div class="main-title-bar">
<div class="main-title-dot"></div>
<h1 itemprop="name">
<a class="p-name article-title" href="/2024/04/04/NJU-PA3/">NJU PA3</a>
</h1>
</div>
<div class='meta-info-bar'>
<div class="meta-info">
<time class="dt-published" datetime="2024-04-03T19:27:42.000Z" itemprop="datePublished">2024-04-03</time>
</div>
<div class="need-seperator meta-info">
<div class="meta-cate-flex">
未分类
</div>
</div>
<div class="wordcount need-seperator meta-info">
7.4k 词
</div>
</div>
<ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/NJU-PA/" rel="tag">NJU PA</a></li></ul>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<div class="truncate-text">
最简单的操作系统批处理系统最简单的操作系统:一个后台程序,每次加载一个前台程序运行,结束了之后换另外一个。
目标:
用户程序结束执行之后,回到操作系统处继续运行
操作系统能加载在某些位置的用户程序执行
对于前者,需要有一个执行流切换机制,但是如果直接使用jal指令跳转的话就显得太随意了,在硬件上有对应的限制:如果执行了非当前权限的代码就会导致陷入操作系统内核然后交由操作系统执行。
穿越时空的旅程除了被动地进入操作系统之外,还需要主动地陷入操作系统:有的操作不应由用户程序执行,必须请求操作系统。当用户程序执行了一条自陷指令之后,跳转到操作系统预先设定好的位置执行特定的代码。大部分ISA不区分异常和自陷。
对于riscv32:
将当前pc写入mepc寄存器
在mcause寄存器中设置异常号
从mtvec寄存器中取出异常入口地址
跳转到异常入口地址
这部分由硬件完成。
特殊的原因? (建议二周目思考)如果由软件保存,用户程序可能可以写入特定的值来让操作系统执行特定的操作来破坏操作系统。
硬件提供的在操作系统和用户程序之间切换操作流的过程也是上下文切换。为了抽象上下文管理,操...
</div>
</div>
</div>
<a class="right-panel non-pic "
href="/2024/04/04/NJU-PA3/"
>
<i class="fa-solid fa-angle-right non-pic"></i>
</a>
</div>
</article>
<article id="post-NJU-PA2" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-inner">
<div class="article-main">
<header class="article-header">
<div class="main-title-bar">
<div class="main-title-dot"></div>
<h1 itemprop="name">
<a class="p-name article-title" href="/2024/04/04/NJU-PA2/">NJU PA2</a>
</h1>
</div>
<div class='meta-info-bar'>
<div class="meta-info">
<time class="dt-published" datetime="2024-04-03T19:27:38.000Z" itemprop="datePublished">2024-04-03</time>
</div>
<div class="need-seperator meta-info">
<div class="meta-cate-flex">
未分类
</div>
</div>
<div class="wordcount need-seperator meta-info">
7.9k 词
</div>
</div>
<ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/NJU-PA/" rel="tag">NJU PA</a></li></ul>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<div class="truncate-text">
不停计算的机器最简单的计算机TRM的运行方式:
12345while (1) { 从PC指示的存储器位置取出指令; 执行指令; 更新PC;}
具体地,cpu执行指令的方式是:
取指:从内存空间中读取出一条指令,具体位置由pc寄存器给出。
译码:读取出来的是一个字长的01串,cpu会查表翻译指令。
执行:根据译码的结果来执行具体的行为。
更新pc,指向下一条指令
回顾一下,用户程序是运行在模拟的硬件之上的,所以这里的任务是模拟一个cpu的执行,来支撑用户程序的执行。
:question: cpu一次只能执行一条指令吗
在这个模型里,如果细化到下去,在一个时刻cpu应该只能同时执行一条指令,这是一个重要的假设,当然这个假设不是谁规定的,他实际上从一开始编程就成了一种习惯:代码是一行一行执行,指令也应该是这样的。
但是现代的cpu似乎对这个事情有所打破,可能是一个叫微指令的概念
理解YEMU如何执行程序加法状态的状态机:把内存和寄存器的值作为状态。
两者的联系?cpu执行一条指令就是一次状态转移。
这个例子可以说明,只要有加法器和跳转功能,...
</div>
</div>
</div>
<a class="right-panel non-pic "
href="/2024/04/04/NJU-PA2/"
>
<i class="fa-solid fa-angle-right non-pic"></i>
</a>
</div>
</article>
<article id="post-NJU-PA1" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-inner">
<div class="article-main">
<header class="article-header">
<div class="main-title-bar">
<div class="main-title-dot"></div>
<h1 itemprop="name">
<a class="p-name article-title" href="/2024/04/04/NJU-PA1/">NJU PA1</a>
</h1>
</div>
<div class='meta-info-bar'>
<div class="meta-info">
<time class="dt-published" datetime="2024-04-03T19:27:34.000Z" itemprop="datePublished">2024-04-03</time>
</div>
<div class="need-seperator meta-info">
<div class="meta-cate-flex">
未分类
</div>
</div>
<div class="wordcount need-seperator meta-info">
5.4k 词
</div>
</div>
<ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/NJU-PA/" rel="tag">NJU PA</a></li></ul>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<div class="truncate-text">
fceux按照readme把内容下载下来之后运行可能会出现这个问题:
123456789/home/suzume/proj/ics2022/fceux-am/src/emufile.cpp: In member function ‘void EMUFILE_FILE::open(const char*, const char*)’:/home/suzume/proj/ics2022/fceux-am/src/emufile.cpp:33:22: error: array subscript 1 is above array bounds of ‘rom [1]’ [-Werror=array-bounds=] 33 | if (strcmp(roms[i].name, fname) == 0) { | ~~~~~~^In file included from /home/suzume/proj/ics2022/fceux-am/src/emufile.cpp:27:./nes/gen/roms.h:10:12: not...
</div>
</div>
</div>
<a class="right-panel non-pic "
href="/2024/04/04/NJU-PA1/"
>
<i class="fa-solid fa-angle-right non-pic"></i>
</a>
</div>
</article>
<article id="post-NJU-PA0" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-inner">
<div class="article-main">
<header class="article-header">
<div class="main-title-bar">
<div class="main-title-dot"></div>
<h1 itemprop="name">
<a class="p-name article-title" href="/2024/04/04/NJU-PA0/">NJU PA0</a>
</h1>
</div>
<div class='meta-info-bar'>
<div class="meta-info">
<time class="dt-published" datetime="2024-04-03T19:27:27.000Z" itemprop="datePublished">2024-04-03</time>
</div>
<div class="need-seperator meta-info">
<div class="meta-cate-flex">
未分类
</div>
</div>
<div class="wordcount need-seperator meta-info">
505 词
</div>
</div>
<ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/NJU-PA/" rel="tag">NJU PA</a></li></ul>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<div class="truncate-text">
installationos: Endeavouros/osx
libreadline在哪里?
在aur上搜索到了,但是版本在8.0上下,考虑到ubuntu上的版本可能会有偏差?问题是ubuntu上下载到的是多少?
在ubuntu package search的网站上找到jammy的也是8.0上下,那就没问题直接下载了
另外sdl也可以直接下载,但是sdl似乎是pinned version?不太了解
llvm version?在网上搜索了一篇教导其他人如何在ubuntu上下载llvm的文章(他们到处都是!)得知版本为14。
但是这里有个小小的问题,当我直接llvm-config --version的时候发现版本为16,
git log这个系统的一个i好处时,如果你还不习惯git的记录方式,他会自动帮你记录。但是我不是,同时我也不是nju的学生所以我选择直接关闭。这个功能开启之后你会有运行记录并且里面会携带你的修改内容,我觉得这样不舒服。
关于代码补全和跳转本人使用的是nvim+clangd作为lsp, 阅读clangd的文档有提到make这种组织方式推荐的方法是安装一...
</div>
</div>
</div>
<a class="right-panel non-pic "
href="/2024/04/04/NJU-PA0/"
>
<i class="fa-solid fa-angle-right non-pic"></i>
</a>
</div>
</article>
<article id="post-hello-world" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-inner">
<div class="article-main">
<header class="article-header">
<div class="main-title-bar">
<div class="main-title-dot"></div>
<h1 itemprop="name">
<a class="p-name article-title" href="/2024/04/03/hello-world/">Hello World</a>
</h1>
</div>
<div class='meta-info-bar'>
<div class="meta-info">
<time class="dt-published" datetime="2024-04-03T02:46:20.319Z" itemprop="datePublished">2024-04-03</time>
</div>
<div class="need-seperator meta-info">
<div class="meta-cate-flex">
未分类
</div>
</div>
<div class="wordcount need-seperator meta-info">
367 词
</div>
</div>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<div class="truncate-text">
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post1$ hexo new "My New Post"
More info: Writing
Run server1$ hexo server
More info: Server
Generate static files1$ hexo generate
More info: Generating
Deploy to remote sites1$ hexo deploy
More info: Deployment
</div>
</div>
</div>
<a class="right-panel non-pic "
href="/2024/04/03/hello-world/"
>
<i class="fa-solid fa-angle-right non-pic"></i>
</a>
</div>
</article>
</div>
<div id="footer-wrapper">
<footer id="footer">
<div id="footer-info" class="inner">
© 2024 Catizard<br>
Powered by <a href="https://hexo.io/" target="_blank">Hexo</a> & Theme <a target="_blank" rel="noopener" href="https://github.com/saicaca/hexo-theme-vivia">Vivia</a>
</div>
</footer>
</div>
<div class="back-to-top-wrapper">
<button id="back-to-top-btn" class="back-to-top-btn hide" onclick="topFunction()">
<i class="fa-solid fa-angle-up"></i>
</button>
</div>
<script>
function topFunction() {
window.scroll({ top: 0, behavior: 'smooth' });
}
let btn = document.getElementById('back-to-top-btn');
function scrollFunction() {
if (document.body.scrollTop > 600 || document.documentElement.scrollTop > 600) {
btn.classList.remove('hide')
} else {
btn.classList.add('hide')
}
}
window.onscroll = function() {
scrollFunction();
}
</script>
</div>
<script src="/js/light-dark-switch.js"></script>
</body>
</html>