-
Notifications
You must be signed in to change notification settings - Fork 0
/
local-search.xml
59 lines (27 loc) · 20.6 KB
/
local-search.xml
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
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>hello</title>
<link href="/2024/09/27/hello/"/>
<url>/2024/09/27/hello/</url>
<content type="html"><![CDATA[<p>最近没有更新blog,是因为一直更新不了,github上面的内容都更新了,但是页面不更新,今天下定决心要解决这个问题,刚刚总算让我在一大堆垃圾文章里面找到了解决方法<img src="/.io//image.png" alt="alt text"> <img src="/.io//image.png" alt="alt text"> 谢谢她!!!</p><p>再加上更新blog的操作顺序 >D: Set-ExecutionPolicy RemoteSigned-Scope Process</p><p>cd blog/KavinXvBlog</p><p>hexo clean</p><p>hexo g</p><p>hexo d</p><p>你好</p><p><img src="/.io//highlight.png" alt="alt text"> <img src="/.io//highlight.png" alt="alt text"></p>]]></content>
</entry>
<entry>
<title>Mit6.828_lab1</title>
<link href="/2024/09/10/Mit6-828-lab1/"/>
<url>/2024/09/10/Mit6-828-lab1/</url>
<content type="html"><![CDATA[<h1 id="mit6.828_lab1">Mit6.828_lab1</h1><p>这是我正式写的第一篇Blog</p><h3 id="前言">前言</h3><p>最近刚刚开学,时间比较充裕,打算搞一些东西做做,暑假一直在学习神经网络相关的知识,什么CNN,RNN,LSTM,GAN,Transformer,一直学到Transformer,开学了,不是很想继续,打算等之后有时间再说吧,正好这个学期有一个小项目要用到yolov8(不得不说,yolov8用起来是真的简单)</p><p>最开始是刷到了一个日本人(抱歉忘记叫什么了)写了一本书《30天自制操作系统》,最开始是边看这个书边做实验的,后来看到了mit6.828,就改了这个。我们是上个学期学的os,当时是看王道的网课,当时自我感觉学的还不错,就开始跟着这个做lab,今天刚刚结束lab1,真的是受益匪浅。</p><h3 id="一如何加载内核">一、如何加载内核?</h3><p><img src="/.io//highlight.png" alt="alt text">这也是lab1里面我觉得最启发我的部分,就是如何让电脑一通电就能用(那个日本人的说法,哈哈哈,一通电就能用)。1.这就要用到BIOS了,BIOS被提前写在了ROM里面(早期计算机),一通电,机器就会找到0xffff0这个位置,这个地方是BIOS的最后16个字节,这里有一条指令:<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">[f000:fff0] 0xffff0:ljmp $0xf000,$0xe05b<br></code></pre></td></tr></table></figure> 这是一个longjump(长跳跃)指令,跳到CS:IP =0xf000:0xe05b(0xfe05b)这个地方。 2.这个地方在BIOS内部,ljmp到这里,BIOS开始进行各自初始化,什么初始化寄存器之类的,然后BIOS开始查找一个可启动的磁盘,在正常情况下,会找到bootloader这个内核引导。3.在找到bootloader之后,BIOS会将整个扇区(其实也就512bit)加载到内存0x7c00-0x7dff里面,然后又是一个ljmp到0x7c00,把控制权交给bootloader(就是开始执行bootloader的指令了)4.现在开始执行boot.S的内容,这段代码的作用就是从实模式切换到保护模式(禁用中断,启用A20地址线,将CR0寄存器的PE位设置为1)并且调用C语言5.现在跳转到main.c,这里面的主要功能就是读取一个ELF的内核镜像文件,然后跳转到ELF内核入口地址执行内核代码<u><strong>就这样结束啦,撒花!</strong></u></p><h3 id="二虚拟内存">二、虚拟内存</h3><p><u><strong>“操作系统内核经常链接并运行在非常高的虚拟地址,比如0xf0100000”</strong></u>>其实就是说内存太小了,我们把内核运行进程需要的数据放在外存里面,用虚拟内存这个技术来将需要的部分放入内存运行</p><h3 id="三控制台打印">三、控制台打印</h3><p><u><strong>自己实现cprintf函数进行控制台打印</strong></u>(就是补全代码,)</p><p>主要是阅读kern/printf.c、lib/printfmt.c 和kern/console.c这三部分代码</p><p>没什么好说的,但是这里的<u><strong>可变参数列表</strong></u>我还是第一次听说,感觉是printf这个函数和类似函数的实现关键</p><h5 id="我们用以下函数进行分析">我们用以下函数进行分析</h5><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><stdarg.h></span></span><br><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><stdio.h></span></span><br><br><span class="hljs-comment">// 可变参数函数,接收固定参数和任意数量的整数,计算这些整数的总和</span><br><span class="hljs-type">int</span> <span class="hljs-title function_">sum</span><span class="hljs-params">(<span class="hljs-type">int</span> count, ...)</span> {<br> va_list ap; <span class="hljs-comment">// 定义一个 va_list 类型的变量,用于存储可变参数信息</span><br> <span class="hljs-type">int</span> total = <span class="hljs-number">0</span>;<br><br> <span class="hljs-comment">// 使用 va_start 初始化 va_list,count 是最后一个固定参数,用来确定可变参数从哪里开始</span><br> <span class="hljs-comment">// 因为是(int count, ...)只有count被指定了,剩下来的有几个还不知道</span><br> va_start(ap, count);<br><br> <span class="hljs-comment">// 循环处理每个可变参数,读取并累加</span><br> <span class="hljs-keyword">for</span> (<span class="hljs-type">int</span> i = <span class="hljs-number">0</span>; i < count; i++) {<br> total += va_arg(ap, <span class="hljs-type">int</span>); <span class="hljs-comment">// 通过 va_arg 获取每一个 int 类型的参数</span><br> }<br><br> <span class="hljs-comment">// 使用 va_end 结束对可变参数的处理</span><br> va_end(ap);<br><br> <span class="hljs-keyword">return</span> total;<br>}<br><br><span class="hljs-type">int</span> <span class="hljs-title function_">main</span><span class="hljs-params">()</span> {<br> <span class="hljs-comment">// 调用 sum 函数,传入 3 个整数作为可变参数</span><br> <span class="hljs-built_in">printf</span>(<span class="hljs-string">"Sum: %d\n"</span>, sum(<span class="hljs-number">3</span>, <span class="hljs-number">10</span>, <span class="hljs-number">20</span>, <span class="hljs-number">30</span>)); <span class="hljs-comment">// 10 + 20 + 30 = 60</span><br> <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>}<br></code></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-comment">// 遇到 '%' 前的普通字符直接输出</span><br> <span class="hljs-keyword">while</span> ((ch = *(<span class="hljs-type">unsigned</span> <span class="hljs-type">char</span> *)fmt++) != <span class="hljs-string">'%'</span>)<br> {<br> <span class="hljs-keyword">if</span> (ch == <span class="hljs-string">'\0'</span>) <span class="hljs-comment">// 如果是字符串结尾,则返回</span><br> <span class="hljs-keyword">return</span>;<br> putch(ch, putdat); <span class="hljs-comment">// 调用 putch 输出字符</span><br> }<br></code></pre></td></tr></table></figure><p>这个是prinfmt.c里面的vprintfmt函数,有两个参数:fmt和ap <figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs c"><span class="hljs-type">void</span> <span class="hljs-title function_">vprintfmt</span><span class="hljs-params">(<span class="hljs-type">const</span> <span class="hljs-type">char</span> *fmt, va_list ap)</span><br></code></pre></td></tr></table></figure>我觉得用法应该是: <figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs c">vprintfmt(<span class="hljs-string">"hello,%d,%d"</span>,<span class="hljs-number">14</span>,<span class="hljs-number">15</span>);<br></code></pre></td></tr></table></figure>其中fmt就是指向hello,%d的字符串指针,ap就是1415,剩下来的可以看源码来理解了。</p><h3 id="四the-stack">四、The Stack</h3><p><img src="/.io//image-1.png" alt="alt text"> >对于一个C语言程序而言,内存空间主要由五个部分组成代码段(text)、数据段(data)、未初始化数据段(bss),堆(heap) 和 栈(stack)组成,其中代码段,数据段和BSS段是编译的时候由编译器分配的,而堆和栈是程序运行的时候由系统分配的。布局如上图所示。</p><p>首先我们需要知道一些基本概念</p><p><u><strong>esp</strong></u>:栈指针寄存器(extended stackpointer),该指针永远指向系统栈最上面一个栈帧的栈顶。esp是一个指针寄存器,它指向栈的顶部,因为栈是不断向下增长的,esp就指向上图那个下箭头那个位置。<u><strong>ebp</strong></u>:基址指针寄存器(extended basepointer),该指针永远指向系统栈最上面一个栈帧的底部。<u><strong>栈帧</strong></u>:栈帧(StackFrame)是每次函数调用时,在栈上创建的一段空间,用来存储函数执行过程中的重要数据,通常包括:-<strong>返回地址</strong>:调用函数后的返回地址,即函数执行完毕后应返回的代码位置。- <strong>函数参数</strong>:传递给函数的参数值。 -<strong>局部变量</strong>:函数内声明的局部变量。 - <strong>旧的 EBP值</strong>:调用者的栈基指针<code>EBP</code>,以便函数执行完毕后能够恢复调用者的栈帧。</p><p><strong>栈帧结构示例</strong> 1.函数被调用时,当前的<code>EBP</code>值被压入栈中,保存为“旧的<code>EBP</code>”,<code>EBP</code>指向新的栈帧底部。2. 函数的返回地址被压入栈中。 3.函数参数和局部变量依次存储在栈帧中。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs assembly">PUSH EBP ; 保存调用者的 EBP<br>MOV EBP, ESP ; 建立新的栈帧<br>SUB ESP, N ; 分配 N 字节的局部变量空间<br><br>... 函数执行 ...<br><br>MOV ESP, EBP ; 恢复栈指针<br>POP EBP ; 恢复调用者的 EBP<br>RET ; 返回到调用者的地址<br></code></pre></td></tr></table></figure><p>那么当这个函数调用结束后 1. 将 ESP 恢复为 EBP的值,释放局部变量所占的空间。 2. 从栈中弹出旧的EBP,恢复调用者的栈帧。(将栈顶的内容(即调用者的 EBP)弹出,并赋值给EBP) 3. 执行 RET 指令,从栈中弹出返回地址,跳转到调用者的代码位置。<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs assembly">MOV ESP, EBP ; 恢复栈指针,释放局部变量空间<br>POP EBP ; 恢复调用者的栈基址,将栈顶的内容(即调用者的 EBP)弹出,并赋值给 EBP<br>RET ; 返回到调用者<br></code></pre></td></tr></table></figure></p><p><strong>栈和堆</strong> | <strong>比较项</strong> |<strong>栈(Stack)</strong> | <strong>堆(Heap)</strong> | |---------------- |-------------------------------------------------------- |-------------------------------------- | | <strong>内存分配方式</strong>| 自动分配和释放,编译器管理 | 手动分配和释放,由程序员管理 | |<strong>存储内容</strong> | 局部变量、函数参数、返回地址 |动态分配的对象、较大的数据结构 | | <strong>内存布局</strong> |连续分配,后进先出 | 非连续分配,内存块可随机分布 | |<strong>分配速度</strong> | 快,直接由 CPU 寄存器管理 |慢,需要系统调用和内存管理 | | <strong>生命周期</strong> |短,局限于函数的执行周期 | 长,直到手动释放内存 | |<strong>大小</strong> | 一般较小,几 MB 到几十 MB |一般较大,可以接近系统的最大内存限制 | | <strong>使用场景</strong> |函数调用、局部变量 | 动态分配的大块内存、复杂的数据结构 | |<strong>错误风险</strong> | 栈溢出(StackOverflow),通常由于递归太深或局部变量过多 |内存泄漏、内存碎片、使用未释放的内存等 |</p>]]></content>
</entry>
<entry>
<title>Markdown笔记</title>
<link href="/2024/09/09/Markdown%E7%AC%94%E8%AE%B0/"/>
<url>/2024/09/09/Markdown%E7%AC%94%E8%AE%B0/</url>
<content type="html"><![CDATA[<h1 id="这是我的第一篇文章">这是我的第一篇文章</h1><h2 id="这是二级标题">这是二级标题</h2><p>这是正文。 换了一行?</p><p>中间空一行才算换行。</p><p>或者打两个空格 也是换行</p><p>你好呀!!! <strong>你也是</strong> <em>斜体</em> <u>下划线</u> 表情 :smile: :cry: :angry: 下标:H<code>2</code>O 上标:X<sup>2</sup> </p><p>==这是一段高亮文字==</p><ol type="1"><li>你好(1. 和你好之间要有空格)</li><li>你好(按一下tab) 1. en 1. oo</li></ol><p><img src="/.io//幻灯片1.png" alt="alt text"> 图片直接复制粘贴到文章里面就可以了</p><p>第二张图片 <strong>格式:<img src="/.io//路径"></strong></p><p><img src="/.io//幻灯片25.png" alt="alt text"> <em>你好</em></p><h3 id="三级标题">三级标题 </h3><p><em>这是latex的公式</em> <span class="math display">\[\lim_{x \to \infin}\frac{sin(t)}{x}=1\]</span></p><p>在文字里面(crtl+m) <span class="math inline">\(\lim_{x \to\infin}\frac{sin(t)}{x}=1\)</span>也可以插入公式</p><h2 id="表格">表格</h2><p>(---是默认左对齐) | 小明 | 小米 | 小康 | | ---- | ---- | ---- | | 1.2| 1.3 | 1.4 |</p><p>(---:是右对齐) | xx | yy | zz | | --- | ---: | --- | | 1.2 | 1.3 |1.4 |</p><p>(:---:是居中) | 11 | 22 | 33 | | --- | :---: | --- |</p><p><strong>全选然后alt+shift+f就可以规范化</strong></p><p><span class="math display">\[\begin{bmatrix}1 & 2 & 3 \\4 & 5 & 6 \\7 & 8 & 9\end{bmatrix}\]</span></p><h2 id="链接">链接</h2><p>这是一个<a href="https://blog.csdn.net/qq_51800570/article/details/123562654?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171345729316800180661117%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=171345729316800180661117&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-123562654-null-null.142%5Ev100%5Epc_search_result_base4&utm_term=%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%A4%8D%E4%B9%A0&spm=1018.2226.3001.4187">链接</a></p><p>直接复制链接,选择文字然后v一下</p><p>一个链接<a href="http://baidu.com%22一个解释%22">百度</a></p><p><a href="id">百度</a></p><h2 id="code">code</h2><p>两个```之间是代码快,标明C++是为了高亮</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs C++"><br><span class="hljs-meta">#<span class="hljs-keyword">include</span> <span class="hljs-string"><iostream></span></span><br><span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> std;<br><br><span class="hljs-function"><span class="hljs-type">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span>{<br><br>}<br><br></code></pre></td></tr></table></figure><p>ctrl+k,再按z全屏,退出按两下esc</p><p><span style="color:red;">这是红色字体</span> <span style="color:blue;">这是蓝色字体</span> <span style="color:green;">这是绿色字体</span></p><p><strong><span style="color:yellow;">这是我写的黄色字体</span></strong></p><blockquote><p>听说这是引用 <span style="color:pink;">可以写其他颜色吗</span> 你好 无序列表: * 你 * 我 * 他 - 吃的 - 喝的 - 玩的 任务 - [] 吃饭 - [x] -和[]之间有空格,[]里面也有空格,按钮可以点 </p></blockquote><p>脚注: 学习markdown<sup id="fnref:1" class="footnote-ref"><a href="#fn:1" rel="footnote"><span class="hint--top hint--rounded" aria-label="脚注是这样的,在最后要解释一下">[1]</span></a></sup></p><hr><p>横线:<strong><span style="color:green;">输入三个-就可以了</span></strong> </p><strong>最后导出文件,在预览那里右键就可以导出了</strong><section class="footnotes"><div class="footnote-list"><ol><li><span id="fn:1" class="footnote-text"><span>脚注是这样的,在最后要解释一下<a href="#fnref:1" rev="footnote" class="footnote-backref">↩︎</a></span></span></li></ol></div></section>]]></content>
</entry>
<entry>
<title>Hello World</title>
<link href="/2024/09/08/hello-world/"/>
<url>/2024/09/08/hello-world/</url>
<content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your veryfirst post. Check <a href="https://hexo.io/docs/">documentation</a> formore info. If you get any problems when using Hexo, you can find theanswer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> oryou can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="hello-hexothis-is-kavin">Hello Hexo,This is Kavin</h2><h2 id="quick-start">Quick Start</h2><h3 id="create-a-new-post">Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">$ hexo new <span class="hljs-string">"My New Post"</span><br></code></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="run-server">Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">$ hexo server<br></code></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="generate-static-files">Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">$ hexo generate<br></code></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="deploy-to-remote-sites">Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">$ hexo deploy<br></code></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
</entry>
</search>