From 6ac9b2ae739618d719aab5222f068bb83c771fa3 Mon Sep 17 00:00:00 2001 From: Ivan Gualandri Date: Mon, 5 Jun 2023 20:39:00 +0100 Subject: [PATCH 1/4] Minor layout fixes --- 04_Memory_Management/01_Overview.md | 6 +++--- 04_Memory_Management/05_Heap_Allocation.md | 4 ++-- 07_IPC/01_Overview.md | 6 +++--- 08_VirtualFileSystem/01_Overview.md | 2 +- 08_VirtualFileSystem/02_VirtualFileSystem.md | 2 -- 09_Loading_Elf/01_Elf_Theory.md | 6 ++++-- Images/memorymanager_example.jpg | Bin 34577 -> 27285 bytes 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/04_Memory_Management/01_Overview.md b/04_Memory_Management/01_Overview.md index 584b6060..9e94b8d2 100644 --- a/04_Memory_Management/01_Overview.md +++ b/04_Memory_Management/01_Overview.md @@ -17,13 +17,13 @@ We will cover the following topics: *Authors note: don't worry, we will try to keep it as simple as possible, using basic algorithms and explaining all the gray areas as we go. The logic may sometimes be hard to follow, you will most likely have to go through several reads of this part multiple times.* -Each of the layers has a dedicated section below, however we'll start with a high level look at how they fit together. Before proceeding let's briefly define the concepts above: +Each of the layers has a dedicated chapter, however we'll start with a high level look at how they fit together. Before proceeding let's briefly define the concepts above: | Memory Management Layer | Description | -|---|---| +|---|------| | Physical Memory Manager | Responsible for keeping track of which parts of the available hardware memory (usually ram) are free/in-use. It usually allocates in fixed size blocks, the native page size. This is 4096 bytes on x86.| | Paging | It introduces the concepts of *virtual memory* and *virtual addresses*, providing the OS with a bigger address space, protection to the data and code in its pages, and isolation between programs. | -| Virtual memory manager | For a lot of projects, the VMM and paging will be the same thing. However the VMM should be seen as the virtual memory *manager*, and paging is just one tool that it uses to accomplish its job: ensuring that a program has memory where it needs it, when it needs it. Often this is just mapping physical ram to the requested virtual address (via paging or segmentation), but it can evolve into stealing pages from other processes. | +| Virtual memory manager | For a lot of projects, the VMM and paging will be the same thing. However the VMM should be seen as the virtual memory *manager*, and paging is just one tool that it uses to accomplish its job: ensuring that a program has memory where it needs it, when it needs it. Often this is just mapping physical ram to the requested virtual address (via paging or segmentation) | | Heap Allocator | The VMM can handle page-sized allocations just fine, but that is not always useful. A heap allocator allows for allocations of any size, big or small. | ## PMM - Physical Memory Manager diff --git a/04_Memory_Management/05_Heap_Allocation.md b/04_Memory_Management/05_Heap_Allocation.md index 59cbbd52..edca5c87 100644 --- a/04_Memory_Management/05_Heap_Allocation.md +++ b/04_Memory_Management/05_Heap_Allocation.md @@ -401,7 +401,7 @@ if (prev_node != NULL && prev_node->status == FREE) { ``` What we're describing here is the left node being "swallowed" by the right one, and growing in size. The memory that the left node owns and is responsible for is now part of the right oneTo make it easier to understand, consider the portion of a hypothetical heap in the picture below: -![heap_example_start](/Images/heapexample.png) +![Heap initial status](/Images/heapexample.png) Basically the heap starts from address 0, the first node is marked as free and the next two nodes are both used. Now imagine that `free()` is called on the second address (for this exammple we consider size of the heap node structure to be just of 2 bytes): @@ -413,7 +413,7 @@ free(0x27); //Remember the overhead This means that the allocator (before marking this location as free and returning) will check if it is possible to merge first to the left (YES) and then to the right (NO since the next node is still in use) and then will proceed with a merge only on the left side. The final result will be: -![heap_example_after_merge](/Images/heap_example_after_merge.png) +![The heap status after the merge](/Images/heap_example_after_merge.png) The fields in bold are the fields that are changed. The exact implementation of this code is left to the reader. diff --git a/07_IPC/01_Overview.md b/07_IPC/01_Overview.md index c0412cb3..a93c8c81 100644 --- a/07_IPC/01_Overview.md +++ b/07_IPC/01_Overview.md @@ -2,14 +2,14 @@ So far we've put a lot of effort into making sure each program (represented by a process in our kernel) is completely isolated from all others. This is great for safety and security, but it presents a big problem: what if we want two processes to communicate with each other? -The answer to this is some form of inter-process communication (IPC). This part will look at some basic implementations for the common types and will hopefully serve a good jumping off point for further implementations. +The answer to this is some form of inter-process communication (aka `IPC`). This part will look at some basic implementations for the common types and will hopefully serve a good jumping off point for further implementations. ## Shared Memory vs Message Passing All IPC can be broken down into two forms: -- Shared Memory: In this case the kernel maps a set of physical pages into a process's address space, and then maps the same physical pages into another processes address space. Now the two processes can communicate by reading and writing to this shared memory. This will be explained in the [Shared_Memory](02_Shared_Memory.md) chapter -- Message Passing: This works by writing the message we want to send into a buffer, and then giving that buffer to the kernel. The kernel will then pass that buffer to the destination process. The chapter [Message Passing](03_Message_Passing.md) will cover this topic. +- _Shared Memory_: In this case the kernel maps a set of physical pages into a process's address space, and then maps the same physical pages into another processes address space. Now the two processes can communicate by reading and writing to this shared memory. This will be explained in the [Shared Memory](02_Shared_Memory.md) chapter +- _Message Passing_: This works by writing the message we want to send into a buffer, and then giving that buffer to the kernel. The kernel will then pass that buffer to the destination process. The chapter [Message Passing](03_Message_Passing.md) will cover this topic. ## Single-Copy vs Double-Copy diff --git a/08_VirtualFileSystem/01_Overview.md b/08_VirtualFileSystem/01_Overview.md index a0d33260..c57b0860 100644 --- a/08_VirtualFileSystem/01_Overview.md +++ b/08_VirtualFileSystem/01_Overview.md @@ -34,6 +34,6 @@ How do we combine the output of all these different filesystems in a uniform way How the VFS presents itself is another design decision, but the two common ways to do it are: -* Each mounted filesystem is distinct filesystem, with a separate root. Typically each root is given a single letter to identify it. This is the MS-DOS/Windows approach. This is called the *multi-root* approach.RREADME.md +* Each mounted filesystem is distinct filesystem, with a separate root. Typically each root is given a single letter to identify it. This is the MS-DOS/Windows approach. This is called the *multi-root* approach. * Each mounted filesystem exists within a single global tree, under a single root. This is the usual unix approach, where a directory can actually a window into another filesystem. diff --git a/08_VirtualFileSystem/02_VirtualFileSystem.md b/08_VirtualFileSystem/02_VirtualFileSystem.md index 05aa255c..71098c44 100644 --- a/08_VirtualFileSystem/02_VirtualFileSystem.md +++ b/08_VirtualFileSystem/02_VirtualFileSystem.md @@ -1,7 +1,5 @@ # The Virtual File System -## Overview - Nowadays there are many OSes available for many different hardware architectures, and probably there are even more file systems. One of the problems for the OS is to provide a generic enough interface to support as many file systems as possible, and making it easy to implement new ones, in the future. This is where the VFS layer comes to aid, in this chapter we are going to see in detail how it works, and make a basic implementation of it. To keep our design simple, the features of our VFS driver will be: diff --git a/09_Loading_Elf/01_Elf_Theory.md b/09_Loading_Elf/01_Elf_Theory.md index ad27ceea..6309e3b8 100644 --- a/09_Loading_Elf/01_Elf_Theory.md +++ b/09_Loading_Elf/01_Elf_Theory.md @@ -1,6 +1,8 @@ # Executable Linker Format -The *executable and linker file* (ELF) is an open standard for programs, libraries and shards of code and data that are waiting to linked. It's the most common format used by linux and BSD operating systems, and sees some use elsewhere. It's also the most common format for programs in hobby as it's quite simple to implement and it's public specification is feature-complete. +## ELF Overview + +The *executable and linker file* (ELF) is an open standard for programs, libraries and shards of code and data that are waiting to be linked. It's the most common format used by linux and BSD operating systems, and sees some use elsewhere. It's also the most common format for programs in hobby operating systems as it's quite simple to implement and it's public specification is feature-complete. That's not to say ELF is the *only* format for these kinds of files (there are others like PE/portable execute, a.out or even mach-o), but the ELF format is the best for our purposes. A majority of operating systems have come to a similar to conclusion. We could also use our own format, but be aware this requires a compiler capable of outputting it (meaning either write our own compiler, or modify an existing one - a lot of work!). @@ -25,7 +27,7 @@ typedef uint8_t Elf64_UnsignedChar; All structs in the base ELF spec are defined using these types, and so we will use them too. Note that their exact definitions *will* change depending on the target platform. -# Layout Of An ELF +## Layout Of An ELF The format has four main sections: diff --git a/Images/memorymanager_example.jpg b/Images/memorymanager_example.jpg index 23e1b1ebba56ce614f621afb877a268ed051dcdb..e44e780705488f79d0f303629e16d33c79d37de6 100644 GIT binary patch literal 27285 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 T Date: Mon, 5 Jun 2023 23:58:14 +0100 Subject: [PATCH 2/4] Replace memory manager image --- Images/memorymanager_example.jpg | Bin 27285 -> 40316 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Images/memorymanager_example.jpg b/Images/memorymanager_example.jpg index e44e780705488f79d0f303629e16d33c79d37de6..9cb58e4f607d8ce995d20b7cdd45019968c5d361 100644 GIT binary patch literal 40316 zcmeFZ2RvMD+CP4DQA6}L5u!xz(ItW)B9iDWi0DKoh7k!8H3*_dC((`GqPK_|V)PcB z84(6!{Eyvz_T7Eo=l$*T?C$UV?ECxgan77EbIzIjy6*eF>i4?OzMahj7d2GXRRJ6v z0KftNfU_w;8NkCm-_Bq0zzv@e|9m4RBqSibKukh%f%w7&5;96M5>g7%3m3?#$SEi< zUZlE6LPmXw`r;+<{l)W#;GExyhffUNc#-r1DfsE{+|E7$RKz&BxZHR+Q~)j&4jvWG zSqA_C+ev`)hYk4ChJ%ZTPe4dSe1U`%yrAkLfD8UMEwLkbhfKNq0%`S3- z@RE)N(G^!3(dRLl#2h!vTWRkPBRRz^-GVNV(9tt6GF|23=Hb02E+Hv(U0O!@mWry{ zZFP+Y4|VnQ4GfK}9$P=Lv9+^z_we-c_VIo8;$?71=&RRZv2kzX6B6GgC1+*lnbTY>8(Lu3 z@sXC5@fbYKMSWO8)>KNhxt7jt&eW)*VL6OQt5tABC0aJOtD~RgUe-5*t>R`bG#g61 zSK#L-eZvU}O7cm%n)qAwk+ChlTe18t&`_$YYfo~FgmGHN^Tlr#3#xye~4qBlt{zQ*};oW=cJ{m$EJi&Pi zKK;{NAt>LHzkPq_>s&*$)s2atDa=zFOKiMFnVuJyetU3 zCS=>GiWzp%=TesuSeon#e|=H!pHj@ zKp8M>PTlA}uXzU0ZeXtV>dGEIFzc(s_LT3Px1^jQ(tIhP)Vjp3UKn|Y z%BQRSM!0V5(!&O!e62@HNtbaa=y|Ud=z0mi<%}&3 ziFGJQ)VKF|Bg|P%J{7+GZjBwTnWms|go;^s(^E}B1&{%`^U;*{GIu}97gd`1#F>p# z6;CGJlB&-gnAY&-k?nAQZxKOAhGP-*V2qM=q~(bs-TEv(x@kdLVt~z8PJ7{0v(1cz zV1;Tu`Bv7Rv5zxF+ry%X0cKx|Gr-e{=)N#Svb}C}vxN|2B^8QsA&i!M&6Qo^a|S4* z(o8+14eup~1HG~|pZR3s6786`+vc;V7Xk;F z3yNs9UFV%f-4FI|gB~?rKTZpnUrDyJq(979LtV?c6`9)(jZPvMEV9S{9kU9!M>IGG zfmw^8x=qKc)G@}{h}L5CV;>K}!iAi#&f-~23(ceX8b7iSz1#@gK4^`NK{m;7JQ;8m zCA5|AvSe6QC--3Ki3f`OpwRzWwT$=VB-5d4^{8>L0N)nR_^eyP%wf<)uboF1cFzDC zZF-;Rdv&P%a4avv482G=LJ|I9679EDtw)+aAYL8{m!cSDjQqSQ@*~czjOta`3nlvP zW;*olZB$~goJ9%x%WlVUeq5<-{lIor{kPoQk{qX1bpZ<@_NePuN4J+A3UOH4cs*%- zPj=Gs;taUt(X$J+D@N}LF{3Lrk@1Hw8-*=L=(P|+j{|#MpUrv%+1*JP|GcMKex=Bb zHe4VK_&G@6V>Z~zMm_|k&+i*CT4S;=J%yO#n+^_r>B zh4g`*Gt4)G+O#xJ#QV~@LQGAGCYk0<6;fCnt*T`i@f!QNo*5=%2e zhRDG%ITa*Ui=*v$?!`~-i|Yvg>Rj5HFL_w6G}gCb&aV~vT~j`h@byA=kGyzWAJYk% zK>g8`3xlr|IEET^kQ>7#S=txY5l_NxigOa??8bH^IQ?=P9Ui~Q-?^-&AH5zB!{rW`)F(p93H zT1ev-9Bq!)UrLF7HA_~7((R0jcXqy-EaAj$9I98IMt$?6IK2)5wdy>s)RpVKWML{? zMI0qLzg0*4g*IV110ow?^K+q0cVu>>pvrdHc8BzD>`*2qv9vo}PUWh?l>E~qz}nwy zn(TpMd$OjT{&=gt4iz0{Q5n~ffsBv5BJD)}Zj8YxK5EmQ|MeAmRdr75d&}={Ui?_Q zW21b+jiwqQHMQwX7an)?IK|y;XVOaB$)rroUH{QYSwR#<^QO_s0Z09@_Zwe_1V=K3 zM|HALQlwglgfG;6N$9l#=a>ZZ>4Wxd!R(@0!!EA6irOT8c2XLuu7>5Ny}qnM_ezMY zm`tt7+JpJ@Xv(lv6nTDxoUUEojJ98;i7%)=FM>wybGf}vkdXkd$Pcn+M3XQ|JCC6tMY@)6&YkFRa+-Qg#N=v(;$Itj& zI@G-e?T*~lKs#ldt{Zvf7T7`w4CzO;QTcGJ*LB7|0vFp)EPh!ahmTu)yc+k zng*pU(sZ7M#6qYXMvXOeNA@Eo+hc;rZ0~edsFW!8|rk6{MYeqCfL86ge(U%n{-}QIex|H#X^ErxpH=&AWfHht_?AU+@Z=?SA zi<(~sGv55*RQQ1pS{=ExV2f&gu^{UgP3!YN5-@v zqB(&|L|MOPzTqIHwwF$PFpp2)1&FL?P+}o#0n|;SE>KyQkG))_)~@{h;)(QBq9I{E zT{C5cK#-epdY~OKFJC0bDka))cU$%hxEbB8 zVD_5++wXH{SVXp?;a7Y#7s~a3An}G-@Ch}2rB6aFU<KKk$~fe&Te$G7Q-U2wq^> zPEPKg0Yllysq>b%V3O1-Z#+5!LYuLpE&Dte$upqU6f|_Wbhd^J6#xC;|GlgTS;CTD zI?*t4I?)csGO4x5y64XRh(7VlS)i>oym$uu=drpDjClSS~VoR&mj&BmK(zc8)1h% zS)U-5)n`Bk=mGA=s01o>f_g;(bq35`2?zYcrm+4?XF#(G9dJThgE{Fw1E6921pcaD z2u6339z{@*zPTB_lYHMuMC91fceGghR9O2IUx)S0mBGY27Ar$I|L{)eoJmq$n#WP_ z2)Y#{s<2iFqo(rP(wqCS3pw4pRwVov%>wv~TYG}!&VYKJGHPEB;BW0X`!LL7Sxs%hi{MCMpsAGj@jK@mwb- z+JWF6+gW385lPX~cn-!b_Xk`FK^9pXdJ`hX2F8Rji#5u8RwVE4iKMTJtK`4uu2$L;3O7sNepm4J30f7fpc~iu6!kvs|SALek_K)@crFsSt9`3;yVNK8tRiU zS8P6l`od_`dz&{CavaCsvR`qKcg{4-hmj@9YvF;u4^8m;vgX-z>4Ck1TB3NBPjVjw zaaMGm{{3HyH0o!koQmW|x=U0)Hk0N+hpr4R=ty{QvC#|&k(_Sb)Smnpsi8VtY$FEfq4j3_XlI8 zng^2#@z>LN3<5cA`qQNFi+niD%e7S99iB|cI1ZC0g^00O zzjX;v>l5{*F(s>#YTISBLpcnTt|c1L%(9jTVK*jps}m63>Lpi#BqA9_4I`#Po|15+ zE(5w9+KZIIY@Eooq3rsEKEKk7CIdE3cFsE^Im6YsE_53gS8lx@ND2_l@J5U+~6lca@OdL`P@bkcw5KK5+*DQEaXbcf+jR?XWl zKCyAco~Ygs%(hQ{_}xLAuU5S0l1OCZO5jqm{!Km~tJdVX@bC3iLq*@~YHOmT3@odY zZIYIguUox_!X3rrJ`kRM&}QttXV8hNdErTk>r?sw8Bi)tJ!dDD;*jwCG4WNvS?Bu| z5rkV^*JwncHT&yY*43_zC`Bd=>*5S|djJ)>b;2Y6*$j;1%22V&~3Y78mPFC zdj{C<9$%+?t%%m0I|EP%>3^L^<4|r3oT!#vn}c9EFZx_Ye*je@CS2{>7NBV7f{;+s zMS~5#jPnVvQy&9cHUe8t|Nj*I|2uo_->v?CV)Eftpj;vw9Z*E`^g*5(Y(DMAD6UMR z2sv#h*74E;Enm@_{BTvO(D{wrz-e%JTYgNYF$njA=7)H{ES52w!6v4GA*OS9rN%+Kz$$u`tdS^*U`r*ak z&1d_CA)lf%JRs2s|JkaAIY#uFy%@Um_6z-y+^+)ro5sP$eD5Bg@PEV)w(=ENNq=<3 z`k@HJn5d)CM=w$u%nelBjd73uQgV2G|9YiDblwGyQGQ3U>{f|^fo03tiO04hrrIpw zZ05`q>)M2Afn!68w*Hb+9rcN?C0==IS35Mbk4rc-#KVI&x9lXsrwkf}KhK&JU#PA9 ztX<{xl4Rzq0ZH;;H-vI}Z9>K~=ULj=xIlhM*q)sp-Nh_Kcpc%I)6H(`l!n#XJ(Q4e zR%Mx`av6<>`D+;ERyLA8Oz8c@3W~D*MDg0F23=WmhOb9ryV~sG9k3D87Y!WulL5ds!@2_|HF4GIX5al=IJN5M;39) zw)+*PE6QjvDyT1QPO`eA;*k#w8tpv7PyG10hxWI*r6vyPvi59326sX$YiwWJU43Ge z@rIiB8=3h_^NWqN^O2Ki^l&B+LODf0VK{zpm^7gF zE%)}UCQdts3mv>Lhl3|sY2oiFiw;%$di7#gM68iv(u$9RZrzM zyplJ31)VwVuEzH_)Lea+8Vh5xl2EioMZcD`!shG}odFxN`46Jn!uOr0& z?SE|j&J8U#5TX;GxlYLOjm(Gg9d2g&Rd|$qh(Lvxr-4gTC&oS(|6&#uf_7+}_cmh| zXy0$00s9quZzb`eb}N3m5pt#W!1?jh>O=}%WNd66O^tp!smY2-q<`WNA2eq8i7Qc5 z9OntX=!Ztahfl1T>u5@@R6_B-Uas=DJn1&0fe%aB^}Br368KhAe`5b-m|@5`sriA^ zwOZS;LLjE*d)B;z`iY!<0>aX61Ti4=x_`R$YFTp>54A<%X%OvwEB25RhXc1S;T6JD zfj3!dSynPydnE+)$YnLaE|En)srGx}Z6`3DC24r;2?y@fX>JC8j$`oK5(Db@Z%imc zADpHM!3S9R1sm0JrqERqT3(|klE#Tw4p`;yU2>`B2oX%Q5)-$dHTr;Q4W=he^Z@fE z`dwyxv7JzMn)HX`^&Xu20J8#^BKhw*pXI|^P zz0AUt`Fh3g9?qW*f?dRIt3}g-GoVnh4RRc{zQ0r!E%<@q*CNsXwId@fKr;L}$ zEw99lZy^O!&w$6M;KPv8{TZSMU-Rrbp80pQ%{rvys>E(z4Zh*`(BSTF{SDmsZ)`*; zJ81>lFQZAF{ODSDh&x= zcRug+dyOV^zGY`L_nDp(25{uE%J0LX$!2Lr_p6Zsq5l3ZA0*#@^mgE$g#Qd7W-r&Y zRu4f@cZ={z{&W{Kk+m-T#&4~RTJ5IlcM*THUfC#SIKZbx6X6VfwezMZ^z(}KiD$oh z1ohw>ecW(hTWTpFKgW1_{n+I>l-DW$^LR9Es_={&i-7Z!$Nc?IIcxj1*)7~g@%ADt z9^!sdG)Mnfln*f38TDOFr#(RoyE z{t*4O#KG0Pq(S2$3zd_WBk#@xeiDNL}?V57-Hafe4>#5aeDAlz;}aePO)^WOFa)xa-(FD zO$yXF7R~8>O1ly_KcKrij;kA<#qg857tZ#2UhAquJYTlF8Iel1lvIOLc>AGaP+B$BL4I%JKluA+M*r70$|sr;P@O>7SoQ+sR1JRY`b{nVE7>n;wSOv#4Q~ccFmrMp z{Q%nyy98S&483{~+s)^>~r!}%(u-7V<*W-wGAKj@PBLqT^oYhq~*!z-kSUZGQh zAe)=P?A@>fY8OkBn1OK%zf6fXH)lNq)~e88-i}0b5G$?nh6p263i`hLMi?;R5`1;_ z3}DIX!Nbx|bicami+|_ROuoS!f0HFGI7y(X!c2a4bi~-Dnrg<5gj?@Quj7~GFN)y8Nh_S?4Rpo zdC52ZYLmcsN9GFX>|OU{8r`7I-Ty+@-Tx61{?%Fh@Amy;L-b#Yf2}C(D2(?~Mg=$} zot8}fIv|#F2QJ&D8V)TS0W&9ZT}} zGx^+paKX^5O9c$cNQ3snT~J1Al&pjHLr=4Ql|g&o!F#-4IY{+>w3GR<^-14#uPe`3 zF;{%Ij4pD5IjGTIv+q~&3!pZSIj$i_KaWA~7?fSdBqUtRayn7pa~D4_`^np+*de-} zU282eRis2_;fIZ%jGyP5XXlwH+K@c-9^G|3!b&Zs)`Ypze6+6f5VpUN&)|m8YM9w; zV|J<})r*>W*XvvnBoeZHtdsnRZ)t&HsAwI2s6Vk|dz~Z9ZI-S>w>ZgqsEaq}txdlz zeAjc}!fthse+P1at)n7}BX!5b=18B-G;Xm>_q5pY;Ril>)@^hzR&B`D`xPUE$~qb^ zu-DGQUNQq7$}Ottxij)&0(0x)hwdv4sw}*{4~8a6!?Wd7F5J(TA{^iJM3;U>lf4ja zUtvsR@wygNdY57+wYdN4AL+jIZ9 zWgdnRd)59WQh_;>o^vGjz+3AhSIg7tIS-w^rjHwgZQ=dijvsJFEjh_-qF@?F8mWp= zsnZFPc2d>#u;taAT5Vdi4P|IBQ>xU>yS&`oTRR9nC+xy*^H!l~QLI>z1s+QWY;1<)i-o2kPicuC!mJNBpTHgV5 z(YLIdCYj+j<5EXH`;zVA?XPe!n6VVV+wYT4rBQ91s7&}i*)>!kXR2wApS^lYxXN~W zG9qD^!>tqQDblG+% zx82-1Ys|KJ3J3`=4u&R|6$S|VmKBF)!LIRKP~MU8GLwMv(4T6d34fmEN}k| zpkgh_B&^9dv`;v&oD?ixO66w6851VLo2}m~B7l-zW%`+>dfc#nSPeY`m|gE0cS@}5 z^}DS-8oP8?cmXoE_(9V~No4A*vDy0rHcUW7L) z^`OJ~eOL%JHA!{gr#aHnvBsrdZ`oQFF9+*M(;|cy?rNlmG(k-n7kM<|rE4W?j7vKM zY(70^On~rwURx@ENc-%mx5tXJq2QMd&E0T;s+me&JgryMBI(yp`Bv?aSeZ-reJ0`Q zh)odalu>Gl(O*baW%IB@&Jfpey-lpFcQTYX39dfLijLnl*9)LAGj6cHN0CBx*-Fm+ zSikQfI99$dmshGcRe^$*ThX)42OKL@`Ep=(r+*1JkYADDkZ+-)o08LF=9m&(2Bk5#6 zp=WPrGZq;=hNnf}ZI53j6m9}_!B!uV7J2cl!?-82-!FZO0{ixQm~O>%J%a@PXoR#A z*UZk51$p&k@JBW0&yQ;iZ!olbo$?F_)1r_Owt5~2zmJ=T;w)61(k`Ty*Tz3rtXa{F zXo#)AjlAo>zdW3Jtgz_wB-+wYjp~cHpcv+3v|umF;2L(k`kF3ndei~t@fpCecD877g#T+CKT&d z%!TIOg>>I_)?^k>nKD(}b3ZiU2Bmvwdt2mP=1gvyxVQsvCq58^^z?Af>tT|fI^($T z^QfCqLCxV8RDGUN<=%I85}4gZ!IF+BU`ZA~pkJzGNpIZCm-4(Txe~Tjl-0bJ<>$K) zA|Gwdk}o~|ZE&xYLj>d!0y`dc?cvviumcQd3&$>64P;WNTj%rcWq7&nB^QKtTvC3; zVWHMKmOW96wVgL=#uBh1o!c+@T#93kb3wJqMyIBsIm6Fp5Y1bUGlF|sMHpU>=dzT4!%TJMZ{ zcW+-l1I7yN&VXEfkIXWTq!rS?yA1UpdPg$7fBMjPbBHok8S zzrqz;mcAL^6PxSvl#h6fF01)1no{p}7RmDCU1vvtUzyDE!Z_ya&@ElsN&cCA*W|?ai}NCB1&Mc%G*( zboZJ*beWGd%755&fF4`tr`9`V&zZ7rWL>{l@Z{*#Ab&Orvv9xz*js7g9&V`bV2)6 zZU4Ani=$^FoN7YZ%DLM?183T(X=ZBu7kpSe12^mVH4xrSVR@#YhV46)=! zxwOJwrxOgjG^#9SkVzz@YCVV-HC)C+O z*=RAZ=})-XnJi|9LT9Lln~a2OF{gwx8YW1WMQ9N6d?OF}M8t48M!d@%{^_@+(wG$MY%#!1&@$0b`WeZw~=RfRrPXJq8k<(v8a zCSp%J-wS6CJ2o04m)h#};uq6M??h|XHpdx--W%hn_F0X+QN66%4c&NT@P;`48^brN zbj=MSy9F4voeVJaGmWyly!XAKy_6{Wjk%c`TjodOn|%of6~-c>T4V{RtZM)&Gv<(X zDp^TZ3&jEsvD5u}?TCFp7qSd|H5ZrM8?Z~-3i{cJ`;Q880#s<#g zQbu68k<$STU!l_PwH@4ZX3dTBLLDHl-ZzJgjI(Ulh9LMnB_q~@JrizlFfzN96TDFJ zfy8g$T>{ZIAU57?%!E?v^h1||=xup9kp=TpVFTT63pVB7D)AIT!n@h%6mdeMQp_vZ zWNL<%(f0MONde>IrNZybw@$hg%i!a(^<+FdVsztevWhfdsmG_o<7ep4=!V;I#%QaB zNH%g3n#Rbyri8=xamij50FqSXlAY|W(^o0%{1QLz8~HAiPsYMvhrC)x3uzVQD=cf} zFvbc++Lie6gF^O&nsVznjr1=+--+N{y)8H&iQV)q4SM=C*5RI<+QD1&^Bky}HjYEG z%0NpZ+v@@)eyb$Y{cnVI1u4dM0B5G=lbTPCtihBw$sg*L5QXbT{KjdOuRzBIPAjDY zRLiTD{TC`lE4ASuhKcVSkR(V159mT|pXSJ2hHZhOJBOYow=8L`1*tc!`>jG)@n(-9h;j$0^S_d1`lbI3;MqV(1PedubR$PMg^Y%RxPh! z`!7^M@**h(bHJ(^q6%zxVKhRlO$`eov-d+5--0rO5=%mp(kx{cip~89%8a^P*5?r6 zBTr>Y!N9+{i!{qY3DB=mkVPhROY8Q6X4AFZb}UDI$7!KoT`SF zF}JOW_|^v=K8~eYZ9(?7Ftw}>w$7o=)*zS^-7jD&JuW~3Hkk3E1=$2zwvtgEIA;J^ z3hE;kiUE`7!8^}EhXU^Yo)Z0dF4FwR>ijN7$b%BAm7NB_+PN_HAlzD!2)5w&9=7Mi zvWACclv>iq9HC{w^!d!W?QFXWrsn_pSJh@@XWz`b;`NF}27cYW@{B6Onwg1JL^RM1{|8CzuHu(Pm z{`qkSV<=0YGHBjRv|6W_?UEjtKgl;9(`rsDp0qa>Sb>i$Ma~pojd|dHLm20kBKs08 z`OI_U{+x3d)He`W$l1M3wIFr|n1khM%B~v57t%oyNPw?3$1L6smO;+cVBeaIM16`* zg4SpLeFb?eUYRJx_Il?UuIKVmWfN4NFAK3{aH!NSy;+KIACK>J_wGpk866Do`dY={ zoD*z%uNW@Cx4eI(c0F$&wz5`tdwjL#X_Vl0GPOG6yp+yOZ_*^A&<-$Y zvR*%(jDH~0ZlWd}*!T<@Nw*ZG93?Vnq)(dC%sEj6708n;E@=1UytWbSlxb(qo!=+j zDfONf!@D>j)J6AWdfn@ASfJshtGDA&?Cn9E`mjs2CVRV4bF@WU9-wDMV5c*yRxqtN zS;84h{fZqc9}#fiVTg}jYt z<)hP>Q3zZpnDP_`TPNE;SJ;r64QKRdUdC~vK+AsC_qU+B{`wo$^`Gk*p$G0$w=L>I zZl?lMrW&aiiLWcXf3XjizzPOlA7oj7wzB#P15t=4Z=W*SaJstwy6hu;f|Af6hxogw z!G17s_*a#-cof=rK5nZWT8kgIrG+Gf!&yY9p^G#0?<2KId$}*$@cU-95o5>~`dz4m z!iqeWE64i8-8EhINMAZCcBJd6(U&he=e;i%7b1<>sl9m>s)l9V}73h#dyo>jbh@} zA-!uO^q03IMC0e3Eg5iY2Q=efPOinEFD<-vfMc$YUS0p8?q6V&eGvGNQ`V8P4{@k{31`w;YLyozO)UZVM zikLVxG15>BJA@3jmShJ(vw|r1JuQ~cf{L6+*vt+Ql8;QeoxG%;Iz8EP zkWkS4@THX(-4@|ec~91szIe+5G1}@3xYd6f^kBBtz?C&@zgzv&oAav={4UsnjBYjh znxgjpTN=?lyhFhnQBC_*h?mNnh7xTQ-=oJX+D~$)1%13Sb7$@J4`s}<9S;t@+~qEH zERnOk>NM1@y&P5%hBXCTWvW|>rl7_{P!WRfGm?jz^>yi#0u)D7fqK)b3(-ohng#Xg zq1m>H^#{e^T2C8!iwD*r^4nE6xOc_aXw~j(1Gw56R{W+uQ(8ll@H2pDt^V;^2A}=2 z_#l%(H`kzB51hj|zi0%ebThw8wUXlMt<6AIW57tYg2E-xI93FCw`?!i0r`~=!Kl6y zx&{k{f^hkl0buv`jG2Nl$tjcz28{**_Qab8q{=rUj6e(B888_A5*%64BZ@~% z;boL);{XBB?1x+cQxA|F*q#Laqkp7vIHf4#PSJ%YqnK-b7y3$r#o>eao|;enj!zD< zwn*(xQE)|lv3;};pX(&5ihmXo zEO-wZCY30na0v*Jk4vjpJy+7gybxTyWan`M@@MdJ#lUHAJf5J8hgU0xDh0; zrQ8fbH|MX}k?VE&UzuzF*SpjKJ-d2htcHA2Cy|im;$5(If55}h@p5I9A^rWPS0YjP zw`MBDO@ez##PnIi)Oc4$|15oRHX#)iR!b8hl&1lp-~9){I2$m-+pt8D4%;xV`Lkej z`I~}q)C*Z$9sb_$x=zhVHcAxcW z*(d3#Jd@hZo$S558hpLI&6|IySb6<|Nii_=RMQRQ&D6c3l{)?fJK|ptq2P^FEzivF zhOT0B!POu3w+nQ;En^1%Qkl!^ADG;MdLetyfYP~Bj&v}xAlot(ECn?i9XwS6r|CX) z|6B)^@*zMa^dGfM|EE+j(a0B(d|Rtgr4hybAd-O{+1|6yZ+<;Un9>O(sLrh*R(-Ypf#BovSQHM>$@^d9>V+*^PwTpx#7g6RO^>i5 zi`T5}8Y`y656KKzN^EiYTtdt^$F`lE_rtAYdBw-ZN~{}dYv5tClC`lH@5E}*+u5S( zs?)j|)(mitZQ6uhJ!{StjImxo9rTncR$`J$F9+w=e&V{`*v)1~(%1cDi;wU+J`<3g zjb=8OfS>p^@u+cDO0>&p@jq1|Z@eNr+ACgE@XG97U^$*!OzQkS!tOQke8{a}S1TlUAiT>>;H_Qr6R&Vaj!U=uH1h5-Gldw+@Iro4ap&T0zP-wsCF z6!)X-?|-|q)8Yi5LAiYbZzKd4FHjrQki}I90MkDqZ2DEeZ#n!Kg*&6d6gTj4VC(p_ zDbpd!e-u1;R@x)tz3|d)EzSG&HRNtiF_+(%cM$yZ9e723RM@u^a+fBRsb&>n#k>*sM9(EX45NjiR{_C0Tee_8!@cl&*i zScFX!94GCUN>ny$RG$3YMd!PU-&u2E>&>(9s7{U$Ff9}@|1+9uGoghMD!*`D$ZOpj zp)xaefW6PUmkkuxp1YRM&yAb9`GSKDnaplX|Fbgyn_NdoIVsPvg7^pxaQrogdv{#F?zQzFVmNu_*2|f#E)k{lyFVl!k$8&-FyrJvlCa z59C)t!VF1$T?^3RH%1+|xypkDcWmBux*zl;8+(QKN51=*bt#r`ZgJ{G;02*(+N)7X zxu>O_OuA9|t_2$j^e8ipb=v%IZ3$N~jUtw&< zR>{k6gBS$CW8NKVVSNwT#6lC9Ofr2A=i7kwZX5YS`^0g*`h*lGp@ZPl^h67Hw_W!D zfwXu`wLuWu!vdj|-A6YgkO0p{3#q3Qw{o0eoXK#0EV7Eu9V2+^wCXeVv&~% z`H_ao3HYl7Pdo4;K*=f_{X$tm@(pZ^$PARZS~C*0SGwc3jp)v&0))0}M)uPSY;K+6 z{$_!m+jN5ODLXTk{HupNw@$K?lP3?fhs0=Zy&}H8ELF5(fN4iJF8J}a&)3~<;NvN= zMO&b8mIt=s_;BIH*82eI5 zc_7##S522Ndna~)pg28+%t2bP`N3_0v7;~u(dV|BdpJFt8PxkTR_*l9%qN|f8XHH7 zx0VrMSAIOuNnURWmzC^$@0#`rNk|TO&(fkYf*O@eePEsSU3tfzEiZqLjm1jUR!13H zUPKVhG54@66!)6*XnYaPeGqb)%_-NXzkSomdtpFFg2BUKhGI_h$9AT=pumdy$oewz zmycJHI=h z4e-fcyc_pn?KnO7$>9%Wt`wX6$({qcYW0(b{Mt81bm-e};gP`vU)(g^KM|#z%iQt; zu3daI{<-Kpm$?%^UBBg6fq6}3O0ewwmqT9p;7PPg*DiS~Y;YADt92fP=-w_!Y3Bcy zar_+gW7gK!)gGxm_x(@z{c``WofU%W7~sR*r%LdQQ}&=rzc)R+f2^o>GW1C}yff5N z>Ct~OrHN$S$=YSiZ+nN!{GRz=<@ zL*81~xTzTdRRrU2#H+`0nmP(|2Ohb%nA+m2T z@0C#VbjaSa?XOZm_PeYr(F?w(IaZ*WxfOlXqj zNbTkl=mEjTcoxjB@Z^+Hq1q{3lJ(7TnMwTcQYw>8y7|wRKeBzCG7S#ibP5Z2KTc3o z5b3&2XdWCOXo|McsvKdjY>Ao`P*~EgOK5-KpqXeWsM6MW{{w_K{w;-a$o)@IKETIC z?bosBFcAA~DzoY|n``0Ek|-0Act6XimH!6oGC^9#z_jsYTnZXo0GNESB>!P!#Qukm z+5BBZUO9{=;rLCMu}6z8{;ls^lj4pa^h~Tuds8psP?V#djT(xber%uEW8C-g$V>1y z84#0`vRvd%L-3a$-K<^mQosL#1YqUv;?s;Y@Cn;&b385%K0Q5%7Mv~uD6-oiq)_5Y<8?OfhNgyw z78GSDd@PplKK|3$*42u_OC=1;U54=o!F`1Sdx5?b6$jKChZT1Bj`Xx#*=wS$xOxs* zvmNAKKC%khfgzmXI2yk!KrA1yBIU#Ui5vS~9|Dr{5i~V~`VPRQ@csgUvffhp*e^iB z=jjp_rnnz_Zl-OY0gfPm(x?X%HWcS}nzn}Q1vYXJLHP${&)-5#o_~Ls(i-k``I+rA zee9c7!=_%o`~OYZGzID6zF(s|7$+<60xNBE=zivS@v_*&Z{MMKpo7F|K}Y96m9S%b z;HuB?lW<7+5#tZJ5sK53+AbL<>7O+9)08U696x7Icd)-^&wY`G4_C{?+BZdS{=$U6 zu9%l?3CdQGq>2Fn=_M2a>1{v(1r!ue z5S1pqgY@1JNa#JZ7$Af_%{U9JHR~W9>h!CCfYRr#%E)w*Y{SrC+X!<>#{Scx~!F;LkeJ zp19>5tH;yMb+g2V{2W}8V%XdtYu=@dr6z_v;t8-I zck9bT242^{6mfTIF_7w)UnHHH!=Y=wBx0tBU8GeR%v}q}PUMhBHfv&mQ?6rzyVx zBspb#pz7Jl^pl0luuMc<8MG$D7^~o(*Ffx?vZOe?@zTt-mp{{mF(}acQXqIF{5>m$ z4%>Hp(yiI|2~v&#XU5$SrD5z~54D=5l?J=Xaa1;e~ zm^#SLBBj zD~)Opo`_-4^+BEJ7|*60$YGqpDKs5#J+$}^E+m5m0Jz)-HaE-5F7S~keE9}q1`9ES z|E>Wq^6vSNho7sc8@|6~0~Q<~H#wK45G$^ls%SEI12!Fqrn0=-weNV;?R=|pcxy_u zWxh}(RQasI637Fb#R3A|j?Q1`JF5inCqV6xzSqu9&8&}zk~r{h6jtX-BBK$LUQEiu zeewR>V2>W;npSl%uGKRPIiZxsa2}B`v|!*HjF&|Ub3_z{VdX^9Qexg2FVj&y9~k>$ z+%fWIY`%q4ZVDeBlthw2ADf7zy#j9pBEN55%$|UbzUBjAdzPz$gxD*P!#AuHC!ji? z%o7kha5(@71Qpzy@DKntb~+b`6hAZsBE`RYBXAv2Iq=myFDUMK6^;#8dip>AL87(9 zL?~mVd8oC?&c&!7c&|%?jkwWk(@_Ev(pQ!G{WvV$Utt1PecPRXRPoKzq(~f8W-yUY z2!nkHSGu265t+~KQlhKR^5~~6geM-2y*lSL1V18il$@@>`b+KQ&sQk-T zE#$(c6?t^6alA_$%z7o8gg{>VS5hkg0`dRbMD$Oa5lixMOhz)0DkAmrnKUXM<^tnW?nUoWoM2>?Ac)?FQNHAjFK?HdOyTlWrI0*%HA15%U!RCosOpBmz@Wtf{Uj+qo-a-T$6w zvSW+BS5|hPI&cqYgL+B`zzF_tdjPkddM`BgPG1jnY3T%{_9~}-9eOY4%Qn{#VBB7W z95e9|*~R>p2!1V^ir34GJs+)2IaF(E1wq!dBU}7kdp&(F&lo|$TiR9cKl!S!8N!wx zBaq3&5}EQupR>-2mPEeUU?T8K=6o8nf&f@wdJyP6{_2u7W7YK#tj*1{F6C%Rc8z@}r+f_~1d|t-T{_+@$v4v*>%w@A7 ztd9F%p+{W$P`Onbl7!^N>xr+t&=KmT)dF*&R6D0S$DxNULLEP#*f0a zDiR9!=F8PPJKc9+DO4Xhr1DmK3aG{KD^{~eBS9~&t{9a?m(ecWj0ouVr1{aclek34 zzmP>Pq4E9k$SlK$3>94^kbxy4U0Pe^Bgub-fe=B80r!r_U_} zffn4`H{8j@wWe}R6b1vaUO(uXm>fLsr4?baD4&m!>mBf_x z*%_JVXoR;lm)L8J;S*=6$>>Gxs&e`>a~|t%(Yhp0f$#X!6#w@Y-ybS2K= ziM!x#j&MGCOU0C1dyiYj!D~7O>T;bX(Q0v_Hkx{TgW=DHpc{CBv$MP1c&^uY0xJ@b z-6~BIbm7kK&h%48a@odgjurfUB0R4GnSuy8Tv+l*(mdAAlx?fu*K1rZWcZ;$_j+3y zH%a1u{9HGxt(IxV58JTtpm(KwX^Xjzd>e&DN$k7qr#^#e$eBIfbL-qB=>h*CnN{@i zh#B+FUJP7Iy))f>Z$|8DlI#4AMf8EPh#BazXO~+FI8wf%!&|TI`@;N9N&m?wD<=JD znHa(UIllv~ZOR zUWxGxwd!zfuThA`7tj)t12EMHb*1dGYKtuMRYkdtG zu1ylxngo73c%QLNtMsES=?E%EDO~=xZ10K&iOequj4l%8O^^*}lo4IawT+^yM;Fv9 z2Ll?=uxZa{^;^5*F`wErb7fw}vy}fn3H=@^{(&*%gR{uHNac9=8ju!HR8tEY4(M;M zYU_g>hP42|@|-X57Bar^1^(s~eD4XbfrF<{a(!v>W62GE&+AIJ!Ix5>24;~13338l zviEC~boDX63jDXE0yZ`r?8!gI*M~Hmi3An>WPKB60E$#-RE8PLvVASaPn`2gzJteh zyVIaDr);+ndq+mKU{3v}Nb05Pf%VPBhD2Ylc|TIJ7CC6oQ(EjVG#Wc~=P{klBhV7N zN7aOm`RjfAn)tZG)xq}YgCym84(F@Y7OX*m(k=X1KDqz1qHjYG-$imI!q@6>j}w!? z`NuCWc*f2`_sOFGO3=haa3{9X6R4v6MEC?C?WhDuJNh3`@B>{-4^6V{pY)9E)Xw_s@^8%-4 z6JCEf&+3EQ;cS5_H~9&d0&0#Fal@GuehPWG-Xi3gA@|Sjmj>4N845-;Uj!F%%S!i0;X(O^7-kWS3@k|z{l9mh1K^-(eOq*pct@i|7 z$2=+)%~8{t#o^ckEHJ(?py>pZLSxo*N;DR>cl->x)C&+vTtGvx@3Y5011xyI9!u?e z1E4Bn8bm)hZ3_bEBDBZgJB@L6YyjPxPe2c3cWL`FFpnb&oWT$4^8nYGv-Wrs&JV{4 zR1!ihPe7f-($7vQ^T<|?t^++u&6(KC>(B#BmEw4S)2s$+M{%%w%31N~7_h*2xzVlw z=bm`(Iszz_gafn}neR_P3!$w4;_0?AY{#LCj-Sc!Vns(~SpCb9TFJ-7)Gq$TI7;7h z*usz5OP#m@)A8}RYKi{!F@rT;s8i8+V{7X~CxFXMWxl@6X*yzF7X2} zCi5SaVO#oICZx`q%y&*Je7kJ338{^K7h%bl6@sIzk;)lhWlxPm$4$o=>0G}t70zMN zfxge{qw=3+3H?8P<^DfgXn#%j|G3uqurW;vfS%wkdR>;ogdk{#>OT6(Ig6lI@+R7x zA7tDf8tG!;NKrcK6FhTcHa0vmtYE#_hpw@tE$(6Q3CI*kEU6EGUt{*tt6}GW934^J zp7;yArJtcufBx%t+M2~_T1$s9fUW?*J?4kk)C(Q<8D$s?Z~nh2%YWi4=&d^Iy)Q@C z{6wI8h^ls+x((0Lqbu1S=qmj_PIXc{umz<8HS!WsdHkaw9E=?k8#V z@26iLLWHaG*#&&146AgEXx1-?b1ngMygf+Ra87lt2wplT-e4Yqp6GrO{?6|TuSD33 zH|F+z3VhAn0pqskr&{N0Id(=2#)^|o3+Sn;hfVPcvjTd}DN7}1NS>>xIKrUKl^Myo z1u3H*p5iG@I+kcd&XV1Jpn6c?`jt2XA`Fp9?5u$N>O)TbQeCdF~)*1uiW2i<`^$~P>C?!a*Xq+{1QG!o>5NX^p(VW z$^ZGB;WG}J_zm`Qi>v3|*jSK|@vq3Qp&eXBv*_LVAy~-^n4>?;{QaG2`N_&`fg57f~;+8J^29GkAkdRbTH$MtY zRxM?E8x$3DWdK&N;eHN1Gb!37HY%(_Q&Mz~b9dOrJA0=++L^4vH7kCzjM8=v?T4vx zE^s&`#9ox2(;3RGCnkBfo0ebUM6RaYQlKZa*ZewhEE z?^3B_lp3jSx^dn+t0{?%6fXNI-?x-o8a5KY2c19Q4XzzP+Be47!&lmF0i{vh$Cl8? zDZXEu^x9$`0zRo}-Jbdo(Ta@N>n-|L_(})#_}mKK67Cl-8_|O`kzR^qpe2P> z&)uCgvU6vNb9UBEceq(rhUcD9QHT`m6{gB)WdFHui>Hs?l1_DnV^{*8#^j@c&kOCx z^S)lrRg?Hpj#;ezms_q%DI z|FWfltMY!=q+Vbr0LQigMir^b;1BJaLYpO~vk@@kCeO&PK4KZ=Mkb7Y38GyO?on3u z`ZDF%Tnuwpintj#!>_(z;VPa<6#&!%AKrc9Af4Mk|F$C4#hd z!FpHg$iD2UU)Gse^DZ{n%P#Uco#U4{nl@(#hgU{xwk%Nn;i3(za#U^VEBSb{l_aAA z8Pk$Bx7NjrHm(~Ni!YR9k-NT^>YN>InWP9UV=RAe>E`L~oxl7wq4~{ghOE*w&)4J7 z>emwKtKaHY%v>$r@d#tr(kG~4LdT=F!m)SZ$Tdy6TU8EDSPr){RO@j*EBb3Rjl$tp zp=FtTf%hM%p0SG6;WqR$!8p!toi+25LD^w1(H;7K$*A7&&o`W$>_)#m^7Z0)ti-&- z9YHm-m=v&d?JG6+nPR7P5>}CI&PtW_^4SgW?SZA@ZQ44wOK&=_b?jn1dK~y+=?+WQ zPwwo3+JbqLnE6PMU_!)`mMsb|o+iXbS+>I)NsM-@Pu$}zvTA$9l-d^)>`AXcJ2MpegXW*AP1-!wrbwn~ zz6Z0Kh_&Ku-%VpSU|iWIte>Vq)s}91@HtJaH6Lz;`(3ppk9~qpY(N*ve7%`E+Nox= zprDc~=qy2$B1S;@n!NC4_cEZBk8XPLNZU>?slq%QnPOCK4HvPQlPw?KNfJTRiH$7F zw1Q15MF%%CR5XfIi?x%3c9jeoe<@)4tz8WTn%=FczZ?NB9CUBt)FwgVDwejXdb4C$ zxTNmpW*)8qJ(U?*DoWd_;$D?NRe+WY;Du|;GGG3NUlu|KZ_uK14#&~N9r|t4;euZ4 zmsG|;2=!aOZ;Rml*XGK9X9%Rg{KJ6LadIsa2lMfC&EuSsUgB{xufwG#3Pi*{gItud@wO{} z%8=)$a7*)I$d(=azMIPv?!gZTIBIQ!1Q!LQ=x~&P>^g~y9OvmMFz#r;+El`w(n}Hn zQvp2l(a%6T>95907sZ=E5u+1y$8#IeGP5y&+@g!kRp**A`izee4dTzF?~4 zA;?Cj?VCUic-%oL$R*>Or19^`o+%FurSMEqy|#~WOAKzB>7bJ}EmEUSt`nHC+MhZBSNZ+-4}e)wTv zV0sE@?|2=unm(_OnPHjIC^W(o7mEU#u8hNJW4{E$FE#Rt7l+0=XMMtd`yB zKaQQgfxP`Gs^jssj%uO9y&G6=d={r^CWjY;$Oy1e^V_RD(Iw$2?OV}vs4Nn(EwYpl znvOA}PRXfC=QK8q=^K|2oQeou*2Te|D%zAv%{P-%FN+t1>OVRiXrt!(bj}7mCrrvM zXzghrO%&hSBHx(x&}&$kLI(0PvB=Ea8Dd(0&`E4?u)<2--ON5G6_n_Yvd53~(mF(A9OFs|CPk?8??tMW7@(}*x9pQM>wa8?%S z);FzDf23IA*Y6SYV`rVAGy;l!w2x_r@T#`?#J!>+ho0Jt_TV4?#Q@p(Sf5uzp7CY{ zF3!R1M7p_-+@{shyDcE)(NX^LNCd^?Q<0pIcm=1q?W}WiBTjRAcL}PxsUE3KNPW(F zxRlG9qeGzJB5YWiM8G}hy%6i^)Cw&GsiTkLN{zm($N9f(eJt=m{$Z~O=>5H0jUN?J zaw57F@ohXd3O=!OyIBMh&nHc4I*B?(_&}zg^yCFY!LNm7sg{{|0oITbn@_PK<@%S- z9prSxQv<3gQ_y?Sd*OyReKAB=OB19z*fFAJb=$8bA%~E8J`nl}q$PSaA+Ig}F>=@H z_HBAeFVpN=A02#!Jaw9nMm43??UY=?yuOik@1U%0BA^3z----1>&Oe70IrLj2eF*Z zTvCs4JsO=wygk)RQ#5{_`v;*OCWwFq5u_)OpUic|PF&5w{$rV6E2SHk&r$|%EbCms z({}5~q%oF{!rq<=ta6v%*yYJQ+gp*PG{2V!ckK1P*Ql7FsKIGc5J?S=_jgGH1;cJ4 zZxN|lgk6Vpsb*{NZ{3>O+s`5{C;ci;HT5}5z9C`Ilv-61nUsmA$!SV%nclqJQrXww^+?KpDpF>XOTK%G?Eu%XAprHN4j$kD$O2gDPjGT4p!Gb!A9%zD?^8bkv7La>dLVe? zdFb+`6Hq+-hzA5k5JC2+fbw+caWV+No}oBA2cL)FIsz&F`m(>o_}2pYt$jvNDBRej aSsVFvW7_UX)xyq)XTcIn(}B>F@qYtZh^~|X literal 27285 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 Date: Tue, 6 Jun 2023 12:03:19 +1000 Subject: [PATCH 3/4] Fixing indentation and line overflows --- 02_Architecture/02_Hello_World.md | 8 +-- 02_Architecture/04_GDT.md | 24 +++---- 02_Architecture/06_ACPITables.md | 65 +++++++++---------- .../11_Keyboard_Driver_Implementation.md | 16 ++--- 03_Video_Output/02_DrawingTextOnFB.md | 13 ++-- 04_Memory_Management/05_Heap_Allocation.md | 3 +- 05_Scheduling/03_Processes_And_Threads.md | 2 +- 06_Userspace/05_Example_ABI.md | 6 +- 99_Appendices/F_Memory_Protection.md | 3 +- 9 files changed, 69 insertions(+), 71 deletions(-) diff --git a/02_Architecture/02_Hello_World.md b/02_Architecture/02_Hello_World.md index 1ade240d..cdeeb9c0 100644 --- a/02_Architecture/02_Hello_World.md +++ b/02_Architecture/02_Hello_World.md @@ -55,15 +55,15 @@ static int init_serial() { outb(PORT + 2, 0xC7); // Enable FIFO, clear them, with 14-byte threshold outb(PORT + 4, 0x0B); // IRQs enabled, RTS/DSR set outb(PORT + 4, 0x1E); // Set in loopback mode, test the serial chip - outb(PORT + 0, 0xAE); // Test serial chip (send byte 0xAE and check if serial returns same byte) + outb(PORT + 0, 0xAE); // Send a test byte - // Check if serial is faulty (i.e: not same byte as sent) + // Check that we received the same test byte we sent if(inb(PORT + 0) != 0xAE) { return 1; } - // If serial is not faulty set it in normal operation mode - // (not-loopback with IRQs enabled and OUT#1 and OUT#2 bits enabled) + // If serial is not faulty set it in normal operation mode: + // not-loopback with IRQs enabled and OUT#1 and OUT#2 bits enabled outb(PORT + 4, 0x0F); return 0; } diff --git a/02_Architecture/04_GDT.md b/02_Architecture/04_GDT.md index 791a03bd..459500b9 100644 --- a/02_Architecture/04_GDT.md +++ b/02_Architecture/04_GDT.md @@ -260,18 +260,18 @@ If not familiar with inline assembly, check the appendix on using inline assembl void flush_gdt() { asm volatile("\ - mov $0x10, %ax \n\ - mov %ax, %ds \n\ - mov %ax, %es \n\ - mov %ax, %fs \n\ - mov %ax, %gs \n\ - mov %ax, %ss \n\ - \n\ - pop %rdi \n\ - push $0x8 \n\ - push %rdi \n\ - lretq \n\ - "); + mov $0x10, %ax \n\ + mov %ax, %ds \n\ + mov %ax, %es \n\ + mov %ax, %fs \n\ + mov %ax, %gs \n\ + mov %ax, %ss \n\ + \n\ + pop %rdi \n\ + push $0x8 \n\ + push %rdi \n\ + lretq \n\ + "); } ``` diff --git a/02_Architecture/06_ACPITables.md b/02_Architecture/06_ACPITables.md index e2570997..b607fe02 100644 --- a/02_Architecture/06_ACPITables.md +++ b/02_Architecture/06_ACPITables.md @@ -36,11 +36,11 @@ As already mentioned there are two different version of RSDP, basic data structu ```c struct RSDPDescriptor { - char Signature[8]; - uint8_t Checksum; - char OEMID[6]; - uint8_t Revision; - uint32_t RsdtAddress; + char Signature[8]; + uint8_t Checksum; + char OEMID[6]; + uint8_t Revision; + uint32_t RsdtAddress; } __attribute__ ((packed)); ``` @@ -55,13 +55,12 @@ Where the fields are: The structure for the v2 header is an extension of the previous one, so the fields above are still valid, but in addition it has also the following extra-fields: ```c -struct RSDP2Descriptor -{ - //v1 fields - uint32_t Length; - uint64_t XSDTAddress; - uint8_t ExtendedChecksum; - uint8_t Reserved[3]; +struct RSDP2Descriptor { + //v1 fields + uint32_t Length; + uint64_t XSDTAddress; + uint8_t ExtendedChecksum; + uint8_t Reserved[3]; }; ``` @@ -75,11 +74,11 @@ Before proceeding let's explain little bit better the validation. For both versi ```c bool validate_RSDP(char *byte_array, size_t size) { - uint32_t sum = 0; - for(int i = 0; i < size; i++) { - sum += byte_array[i]; - } - return (sum & 0xFF) == 0; + uint32_t sum = 0; + for(int i = 0; i < size; i++) { + sum += byte_array[i]; + } + return (sum & 0xFF) == 0; } ``` @@ -101,15 +100,15 @@ Since every SDT table contains different type of information, they are all diffe ```c struct ACPISDTHeader { - char Signature[4]; - uint32_t Length; - uint8_t Revision; - uint8_t Checksum; - char OEMID[6]; - char OEMTableID[8]; - uint32_t OEMRevision; - uint32_t CreatorID; - uint32_t CreatorRevision; + char Signature[4]; + uint32_t Length; + uint8_t Revision; + uint8_t Checksum; + char OEMID[6]; + char OEMTableID[8]; + uint32_t OEMRevision; + uint32_t CreatorID; + uint32_t CreatorRevision; }; ``` * The second part is the table itself, every SDT has it's own table @@ -123,16 +122,14 @@ The RSDT is an SDT header followed by an array of `uint32_t`s, representing the The XSDT is the same, except the array is of `uint64_t`s. ```c -struct RSDP -{ - ACPISDTHeader sdtHeader; //signature "RSDP" - uint32_t sdtAddresses[]; +struct RSDP { + ACPISDTHeader sdtHeader; //signature "RSDP" + uint32_t sdtAddresses[]; }; -struct XSDT -{ - ACPISDTHeader sdtHeader; //signature "XSDT" - uint64_t sdtAddresses[]; +struct XSDT { + ACPISDTHeader sdtHeader; //signature "XSDT" + uint64_t sdtAddresses[]; }; ``` diff --git a/02_Architecture/11_Keyboard_Driver_Implementation.md b/02_Architecture/11_Keyboard_Driver_Implementation.md index 98a16e47..24a424ee 100644 --- a/02_Architecture/11_Keyboard_Driver_Implementation.md +++ b/02_Architecture/11_Keyboard_Driver_Implementation.md @@ -43,8 +43,6 @@ If we want to store just the scancode we don't need much more, so we can already ```c void keyboard_driver_irq_handler() { - - uint8_t scancode = inb(0x60); // Read byte from the Keyboard data port keyboard_buffer[buf_position] = scancode; @@ -113,7 +111,9 @@ Now by changing the `current_state` variable, we can change how the code will tr uint8_t current_state; void init_keyboard() { - // Do other initialization stuff like: clean the keyboard buffer, identify the scancode set, enable the IRQ etc. + // You'll want to do other setup here in your own driver: + // ensure the input buffer of the keyboard is empty, check which scancode + // set is in use, enable irqs. current_state = NORMAL_STATE; } @@ -121,12 +121,11 @@ void keyboard_driver_irq_handler() { int scancode = inb(0x60); // Read byte from the Keyboard data port if (scancode == 0xE0) { current_state = PREFIX_STATE - // We have read a prefix, so let's update the state and finish here - // this is a very simple scenario, there could be more needed depending on the design + // We have read a prefix, so update the state and exit. return; } if (current_state == PREFIX_STATE) { - // Do what you need to store the key_code and eventually translate it to the kernel_code and return to the normal state + // Store the next part of the scancode, then return to normal state. current_state = NORMAL_STATE; } } @@ -214,10 +213,11 @@ We could use the following: ```c -//an example of our kernel-specific scancodes +//an example of our kernel-specific scancodes: +//note that these are totally arbitrary and can be whatever you want. typedef enum kernel_scancodes { [ ... ] - F1 = 0xAABBCCDD, //this can be defined to whatever value you want, the exact value is totally arbitrary. + F1 = 0xAABBCCDD, [ ... ] }; diff --git a/03_Video_Output/02_DrawingTextOnFB.md b/03_Video_Output/02_DrawingTextOnFB.md index 72e02471..054c8d8a 100644 --- a/03_Video_Output/02_DrawingTextOnFB.md +++ b/03_Video_Output/02_DrawingTextOnFB.md @@ -122,8 +122,8 @@ All the fields are 4 bytes in size, so creating a structure that can hold it is Let's assume from now on that we have a data structure called PSF_font with all the fields specified above. The first thing that we need of course, is to access to this variable: ```C -// We have linked _binary_font_psf_start from another .o file so we must specify that we are dealing -// with an external variable +// We have linked _binary_font_psf_start from another .o file so we must +// specify that we are dealing with an external variable. extern char _binary_font_psf_start; PSF_font *default_font = (PSF_font *)&_binary_font_psf_start ``` @@ -157,15 +157,18 @@ Below an example of how a glyph is stored: The glyphs start right after the psf header, the address of the first character will be then: ```C -uint8_t* first_glyph = (uint8_t*) &_binary_font_psf_start + default_font->headersize +uint8_t* first_glyph = (uint8_t*) &_binary_font_psf_start + + default_font->headersize ``` Since we know that every glyph has the same size, and this is available in the PSF_Header, if we want to access the *i-th* character, we just need to do the following: ```C -uint8_t* selected_glyph_v1 = (uint8_t*) &_binary_font_psf_start + sizeof(PSFv1_Header_Struct) + (i * default_font->bytesperglyph); //psf_v1 +uint8_t* selected_glyph_v1 = (uint8_t*) &_binary_font_psf_start + + sizeof(PSFv1_Header_Struct) + (i * default_font->bytesperglyph); -uint8_t* selected_glyph_v2 = (uint8_t*) &_binary_font_psf_start + default_font->headersize + (i * default_font->bytesperglyph); //psf_v2 +uint8_t* selected_glyph_v2 = (uint8_t*) &_binary_font_psf_start + + default_font->headersize + (i * default_font->bytesperglyph); ``` Where in the v1 case, `PSFv1_Header_Struct` is just the name of the struct containing the PSFv1 definition. diff --git a/04_Memory_Management/05_Heap_Allocation.md b/04_Memory_Management/05_Heap_Allocation.md index edca5c87..cb1caacd 100644 --- a/04_Memory_Management/05_Heap_Allocation.md +++ b/04_Memory_Management/05_Heap_Allocation.md @@ -90,7 +90,8 @@ What we have so far is already an allocation algorithm, that's easy to implement Its implementation is very simple: ```c -uint8_t *cur_heap_position = 0; //This is just pseudocode in real world this will be a memory location +uint8_t *cur_heap_position = 0; //Just an example, in the real world you would use + //a virtual address allocated from the VMM. void *first_alloc(size_t size) { uint8_t *addr_to_return = cur_heap_position; cur_heap_position= cur_heap_position + size; diff --git a/05_Scheduling/03_Processes_And_Threads.md b/05_Scheduling/03_Processes_And_Threads.md index b727fe80..ff4faae4 100644 --- a/05_Scheduling/03_Processes_And_Threads.md +++ b/05_Scheduling/03_Processes_And_Threads.md @@ -65,7 +65,7 @@ Creating a process is pretty trivial. We need a place to store the new `process_ size_t next_free_pid = 0; process_t* create_process(char* name, void(*function)(void*), void* arg) { - process_t* process = alloc(sizeof(process_t)); // We should have an allocation function available + process_t* process = alloc(sizeof(process_t)); strncpy(process->name, name, NAME_MAX_LEN); process->pid = next_free_pid++; diff --git a/06_Userspace/05_Example_ABI.md b/06_Userspace/05_Example_ABI.md index 7b3cdc7d..7d39a82b 100644 --- a/06_Userspace/05_Example_ABI.md +++ b/06_Userspace/05_Example_ABI.md @@ -41,8 +41,7 @@ We're going to implement a wrapper function for system calls in C, purely for co ```c __attribute__((naked)) -void do_syscall(uint64_t num, uint64_t a0, uint64_t a1, uint64_t a2, uint64_t a3) -{ +void do_syscall(uint64_t num, uint64_t a0, uint64_t a1, uint64_t a2, uint64_t a3) { asm ("int $0x50" ::: "rdi", "rsi", "rdx", "rcx", "r8", "memory"); } ``` @@ -54,8 +53,7 @@ This function also uses the `naked` attribute. If unfamiliar with attributes, th Now, let's combine our wrapper function with our example system call from above. We're going to write a `memcpy` function that could be called by another code, but uses the system call internally: ```c -void memcpy(void* src, void* dest, size_t count) -{ +void memcpy(void* src, void* dest, size_t count) { return do_syscall(3, (uint64_t)src, (uint64_t)dest, (uint64_t)count, 0, 0); } ``` diff --git a/99_Appendices/F_Memory_Protection.md b/99_Appendices/F_Memory_Protection.md index 204940a4..f123e312 100644 --- a/99_Appendices/F_Memory_Protection.md +++ b/99_Appendices/F_Memory_Protection.md @@ -53,8 +53,7 @@ Now that's a lot of words, let's have a look at a quick example of how it might An example in c might look like (note these functions are made up for the example, and must be implemented yourself): ```c -void* page_heap_alloc(size_t size, bool detect_overrun) -{ +void* page_heap_alloc(size_t size, bool detect_overrun) { const size_t pages_required = (size / PAGE_SIZE_IN_BYTES) + 1; void* pages = pmm_alloc_pages(pages_required); uint64_t next_alloc_address = get_next_addr(); From ebd7a52859a1927d3f45e12930338d7ed96f511a Mon Sep 17 00:00:00 2001 From: Ivan Gualandri Date: Tue, 6 Jun 2023 10:44:48 +0100 Subject: [PATCH 4/4] Update yaml headers with margin and image fixes --- .pandoc/pandoc.yaml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/.pandoc/pandoc.yaml b/.pandoc/pandoc.yaml index a7b3321d..f7f0651a 100644 --- a/.pandoc/pandoc.yaml +++ b/.pandoc/pandoc.yaml @@ -5,7 +5,34 @@ author: - Dean T. header-includes: - \usepackage{fvextra} + - \usepackage{geometry} - \usepackage[page,toc,titletoc,title]{appendix} + - \usepackage{fancyhdr} + - \pagestyle{fancy} + - \fancyhead[LE]{\leftmark} + - \fancyhead[RE]{\thepage} + - \fancyhead[LO]{\thepage} + - \fancyhead[RO]{\rightmark} + - \usepackage{float} + - | + ```{=latex} + \let\origfigure\figure + \let\endorigfigure\endfigure + \renewenvironment{figure}[1][2] { + \expandafter\origfigure\expandafter[H] + } { + \endorigfigure + } + ``` - \DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,commandchars=\\\{\}} +geometry: + - tmargin=2.5cm + - bmargin=2.5cm + - lmargin=2.5cm + - rmargin=2.5cm + - headsep =0.89cm + - footskip =0.89cm + - columnsep=1.5cm + - headheight=1.5cm book: true ---