[{"data":1,"prerenderedAt":354},["ShallowReactive",2],{"content:\u002Ffiddling\u002Fcsapplab0":3,"surround:\u002Ffiddling\u002Fcsapplab0":343},{"id":4,"title":5,"body":6,"categories":318,"date":320,"description":321,"draft":322,"extension":323,"image":324,"meta":325,"navigation":327,"path":328,"permalink":324,"published":324,"readingTime":329,"recommend":324,"references":324,"seo":334,"sitemap":335,"stem":336,"tags":337,"type":341,"__hash__":342},"content\u002Fposts\u002Ffiddling\u002Fcsapplab0.md","CSAPP LAB 环境搭建",{"type":7,"value":8,"toc":302},"minimark",[9,13,20,23,45,48,51,59,62,66,69,80,83,89,92,99,102,107,110,120,123,126,129,132,138,141,147,150,154,157,160,163,169,172,178,181,184,187,196,199,202,205,211,214,220,223,229,232,235,238,244,247,253,256,263,265,268,275,278,281,290,294],[10,11,12],"h3",{"id":12},"前言",[14,15,16],"blockquote",{},[17,18,19],"p",{},"学 CSAPP 不做实验，就像四大名著不看红楼梦，说明这个人文学造诣和自我修养不足，他理解不了这种内在的阳春白雪的高雅艺术，他只能看到外表的辞藻堆砌，参不透其中深奥的精神内核，他整个人的层次就卡在这里了，只能度过一个相对失败的人生。",[17,21,22],{},"劝退 CSAPP 实验人的最大因素，就是 Linux 环境。本科时候做过一次，用的是 Vmware Workstation，安装 Ubuntu Desktop。虽然我个人倒是没遇到过什么问题，但是身边的人遇到过一下问题：",[24,25,26,30,33,36,39,42],"ul",{},[27,28,29],"li",{},"虚拟机安装错误",[27,31,32],{},"Vmware 与 Hyper-v 不兼容",[27,34,35],{},"虚拟机无网络",[27,37,38],{},"虚拟机与宿主机共享文件夹不好使",[27,40,41],{},"Ubuntu 中文输入法",[27,43,44],{},"其他玄学问题",[17,46,47],{},"另外，虚拟机的性能也是很难恭维，毕竟要从宿主机划出去一片内存，你永远不知道，是虚拟机先 OOM，还是宿主机先 OOM。",[17,49,50],{},"综上，我选择 WSL（Windows Subsystem for Linux，适用于 Windows 的 Linux 子系统）。推荐的操作系统是 Windows 10 Version 2004 以上，或者 Windows 11，以使用 WSL 2。低于此版本的 Windows，即使有 WSL 功能，也只是 WSL 1，使用翻译层将 Linux 系统调用转化成 Windows 系统调用，而 WSL 2 使用了一个轻量级的、无需维护的虚拟机，并在这个虚拟机中运行了一个完整的 Linux 内核。一个完整的 Linux 内核，对于 CSAPP 的实验至关重要。",[17,52,53,54,58],{},"什么，你问我 MacOS 怎么办，Intel 芯片的 MacBook 可以安装 VirtualBox、VMWare Fusion 或者 Parallel Desktop，并在其上安装 Linux 发行版，也可以使用 Docker。至于 m1 芯片的 MacBook，",[55,56,57],"strong",{},"建议换电脑","（不是开玩笑，m1 真的没法做实验）。",[17,60,61],{},"笑死，我发现我废话就真多。",[10,63,65],{"id":64},"安装-wsl-和-ubuntu","安装 WSL 和 Ubuntu",[17,67,68],{},"Windows 安装 WSL 非常简单，只需要在一个有管理员权限的 PowerShell 中输入如下命令：",[70,71,77],"pre",{"className":72,"code":74,"language":75,"meta":76},[73],"language-shell","wsl --install -d Ubuntu\n","shell","",[78,79,74],"code",{"__ignoreMap":76},[17,81,82],{},"系统就会自动配置好所需的功能，并且自动下载 Ubuntu 的最新 LTS（截至本文写作时，版本 20.04）。在下载安装完成后，会弹出一个终端，要求你输入用户名和密码：",[70,84,87],{"className":85,"code":86,"language":75,"meta":76},[73],"Installing, this may take a few minutes...\nPlease create a default UNIX user account. The username does not need to match your Windows username.\nFor more information visit: https:\u002F\u002Faka.ms\u002Fwslusers\nEnter new UNIX username: shinya\nNew password:\nRetype new password:\npasswd: password updated successfully\nInstallation successful!\n",[78,88,86],{"__ignoreMap":76},[17,90,91],{},"注意，输入密码时是不会显示在屏幕上的。",[17,93,94,95,98],{},"配置完成后，一个 ",[78,96,97],{"code":97},"shinya@DESKTOP-4TMFLAE:~$"," 样式的文字就出现了，等待你输入命令。至此，你已经进入了 Ubuntu 系统。",[10,100,101],{"id":101},"一些使用小技巧",[103,104,106],"h4",{"id":105},"windows-terminal","Windows Terminal",[17,108,109],{},"Windows Terminal，可以说是 Windows 下的终端之王了。",[17,111,112,113,119],{},"安装 Windows Terminal 可以直接在 Microsoft Store 中搜索“Windows Terminal”，或者在其 Github Releases 页面：",[114,115,116],"a",{"href":116,"rel":117},"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fterminal\u002Freleases",[118],"nofollow","，下载 msixbundle 文件，双击即可安装。",[17,121,122],{},"如果你已经安装了 WSL 和 Ubuntu，那么在 Windows Terminal 顶栏加号下拉处，就会显示一个 Ubuntu 的选项。点击即可快速打开 Ubuntu 的默认 shell。",[103,124,125],{"id":125},"文件共享",[17,127,128],{},"WSL 中的 Ubuntu 和你使用的 Windows，是两个隔离的系统，各自使用自己的文件系统。但是，隔离，但没完全隔离。",[17,130,131],{},"Windows 的 C 盘，在 Ubuntu 中被挂载到了 \u002Fmnt\u002Fc，例如你要在 Linux 中访问 Windows 的桌面：",[70,133,136],{"className":134,"code":135,"language":75,"meta":76},[73],"$ cd \u002Fmnt\u002Fc\u002FUsers\u002FShinya\u002FDesktop\n$ ls\n course.py     desktop.ini     szxx.bat     szxx.txt\n",[78,137,135],{"__ignoreMap":76},[17,139,140],{},"同样，如果想要在 Windows 上查看 WSL 自己的文件系统中的文件（例如 ~），可以通过如下命令，例如我想查看用户文件夹 ~：",[70,142,145],{"className":143,"code":144,"language":75,"meta":76},[73],"$ cd ~\n$ explorer.exe .\n",[78,146,144],{"__ignoreMap":76},[17,148,149],{},"这时会打开 Windows 的资源管理器，其中就是你要查看的文件夹的内容。你可以像操作 Windows 自己的文件夹一样操作它。",[103,151,153],{"id":152},"visual-studio-code","Visual Studio Code",[17,155,156],{},"vscode，世界上最好的文本编辑器，支持直接打开 WSL 中的文件夹，完全提供本地项目一般的体验。毕竟，不是所有人，都喜欢直接在 vim 里做实验的。",[17,158,159],{},"首先打开 Windows 下的 vscode，在扩展商店中搜索 WSL，并安装“Remote - WSL”，这个插件一般是这个关键词的第一个搜索结果。",[17,161,162],{},"随后在 Ubuntu 中，在项目文件夹下，输入命令：",[70,164,167],{"className":165,"code":166,"language":75,"meta":76},[73],"$ code .\n",[78,168,166],{"__ignoreMap":76},[17,170,171],{},"如果是第一次运行这个命令，会首先安装相关的支持组件：",[70,173,176],{"className":174,"code":175,"language":75,"meta":76},[73],"$ code .\nInstalling VS Code Server for x64 (899d46d82c4c95423fb7e10e68eba52050e30ba3)\nDownloading: 100%\nUnpacking: 100%\n",[78,177,175],{"__ignoreMap":76},[17,179,180],{},"随后就会自动打开 Windows 下的 vscode，并将 Ubuntu 中的项目文件夹作为工作目录，随后，想怎么开发就可以怎么开发了。",[103,182,183],{"id":183},"更换中国源",[17,185,186],{},"首先明确，什么叫源：",[14,188,189],{},[17,190,191,192,195],{},"据古籍记载，天地合气生万物的时代，混沌迷蒙，灵气氤氲，非常浓密，很多灵物可以吸收天地间的本源精气，结出琥珀般的晶体，里面封有庞大的生命精华。",[193,194],"br",{},"\n保存到现在的，便被称作“源”",[17,197,198],{},"sorry，串了。",[17,200,201],{},"简而言之，就是 Ubuntu，或者说 Debian 系使用的软件包管理器 apt，维护了一个 URL 列表，在用户通过 apt install 安装软件包时，会请求那些 URL 中搜索下载并安装。这个 URL 列表，就是源（sources）默认的 URL 都是国外的地址，由于众所周知的原因，速度很慢，甚至连接不了。所以需要将其更换为国内的源。",[17,203,204],{},"方法如下：",[70,206,209],{"className":207,"code":208,"language":75,"meta":76},[73],"$ sudo mv \u002Fetc\u002Fapt\u002Fsources.list \u002Fetc\u002Fapt\u002Fsources.list.bak\n$ sudo nano \u002Fetc\u002Fapt\u002Fsources.list\n",[78,210,208],{"__ignoreMap":76},[17,212,213],{},"将如下内容粘贴进去，这里我使用的是阿里的源。注意，不同的发行版，不同的版本，源是不同的，注意甄别。这里我用的是 Ubuntu 20.04 的源。",[70,215,218],{"className":216,"code":217,"language":75,"meta":76},[73],"deb http:\u002F\u002Fmirrors.aliyun.com\u002Fubuntu\u002F focal main restricted universe multiverse\ndeb-src http:\u002F\u002Fmirrors.aliyun.com\u002Fubuntu\u002F focal main restricted universe multiverse\ndeb http:\u002F\u002Fmirrors.aliyun.com\u002Fubuntu\u002F focal-security main restricted universe multiverse\ndeb-src http:\u002F\u002Fmirrors.aliyun.com\u002Fubuntu\u002F focal-security main restricted universe multiverse\ndeb http:\u002F\u002Fmirrors.aliyun.com\u002Fubuntu\u002F focal-updates main restricted universe multiverse\ndeb-src http:\u002F\u002Fmirrors.aliyun.com\u002Fubuntu\u002F focal-updates main restricted universe multiverse\ndeb http:\u002F\u002Fmirrors.aliyun.com\u002Fubuntu\u002F focal-proposed main restricted universe multiverse\ndeb-src http:\u002F\u002Fmirrors.aliyun.com\u002Fubuntu\u002F focal-proposed main restricted universe multiverse\ndeb http:\u002F\u002Fmirrors.aliyun.com\u002Fubuntu\u002F focal-backports main restricted universe multiverse\ndeb-src http:\u002F\u002Fmirrors.aliyun.com\u002Fubuntu\u002F focal-backports main restricted universe multiverse\n",[78,219,217],{"__ignoreMap":76},[17,221,222],{},"随后刷新源并更新软件包：",[70,224,227],{"className":225,"code":226,"language":75,"meta":76},[73],"$ sudo apt update\n$ sudo apt upgrade\n",[78,228,226],{"__ignoreMap":76},[10,230,231],{"id":231},"安装实验所需软件",[103,233,234],{"id":234},"软件包",[17,236,237],{},"必要的就一句话：",[70,239,242],{"className":240,"code":241,"language":75,"meta":76},[73],"$ sudo apt install build-essential gcc-multilib gdb\n",[78,243,241],{"__ignoreMap":76},[17,245,246],{},"可选安装：cgdb。cgdb 是 GDB 的一个轻量级前端。它提供了一个分屏窗口，分别显示 gdb 命令界面（和默认 gdb 一样）和程序源码。由于软件源中的 cgdb 不是最新版本，于是从源码编译安装。方法如下：",[70,248,251],{"className":249,"code":250,"language":75,"meta":76},[73],"$ sudo apt install automake libncurses5-dev flex texinfo libreadline-dev\n$ git clone git:\u002F\u002Fgithub.com\u002Fcgdb\u002Fcgdb.git\n$ cd cgdb\n$ .\u002Fautogen.sh\n$ .\u002Fconfigure --prefix=\u002Fusr\u002Flocal\n$ make\n$ sudo make install\n",[78,252,250],{"__ignoreMap":76},[17,254,255],{},"安装完成后，就可以在任何位置，通过 cgdb 命令打开了。如下：",[17,257,258],{},[259,260],"img",{"alt":261,"src":262},"CGDB","https:\u002F\u002Fblog-img.774352199.xyz\u002F2025\u002Fa36f15210399888f0e0cf56efe45a202.jpg",[17,264,261],{},[17,266,267],{},"左侧的窗口被称为代码窗口，右侧为 gdb 窗口。",[17,269,270,271,274],{},"打开 cgdb 时，默认两个窗口是上下分隔的，可以通过 ",[78,272,273],{"code":273},"ctrl+w"," 切换成左右分隔模式。",[17,276,277],{},"按 esc 键可以将焦点从 gdb 窗口转移到代码窗口，在代码窗口可以上下翻看源码，空格键可以在焦点行设置一个断点。",[17,279,280],{},"按 i 键可以将焦点从代码窗口转移到 gdb 窗口，在 gdb 窗口的操作与普通 gdb 完全一致。",[17,282,283,284,289],{},"更具体的 cgdb 使用可以查看这本 ",[114,285,288],{"href":286,"rel":287},"https:\u002F\u002Fleeyiw.gitbooks.io\u002Fcgdb-manual-in-chinese",[118],"CGDB 中文手册","。",[103,291,293],{"id":292},"实验在哪","实验在哪？",[17,295,296,297,301],{},"如果你是自学 CSAPP，可以到这个网站：",[114,298,299],{"href":299,"rel":300},"http:\u002F\u002Fcsapp.cs.cmu.edu\u002F3e\u002Flabs.html",[118]," ，每个实验后的 Self-Study Handout 连接就是实验材料的下载。传入 WSL，就可以快乐实验了！",{"title":76,"searchDepth":303,"depth":303,"links":304},4,[305,307,308,314],{"id":12,"depth":306,"text":12},3,{"id":64,"depth":306,"text":65},{"id":101,"depth":306,"text":101,"children":309},[310,311,312,313],{"id":105,"depth":303,"text":106},{"id":125,"depth":303,"text":125},{"id":152,"depth":303,"text":153},{"id":183,"depth":303,"text":183},{"id":231,"depth":306,"text":231,"children":315},[316,317],{"id":234,"depth":303,"text":234},{"id":292,"depth":303,"text":293},[319],"折腾","2021-12-27 00:09:00","在学习 CSAPP 的过程中，实验环节的重要性不可忽视。然而，许多学生在搭建 Linux 环境时遇到各种麻烦，尤其是在使用虚拟机的情况下。诸如安装错误、兼容性问题、网络连接不畅等问题层出不穷，往往让人望而却步。为了解决这些障碍，WSL（Windows Subsystem for Linux）成为了一个理想的选择，尤其适用于 Windows 10 版本 2004 及以上的用户。WSL 提供了一个更为简洁、直接的方式来体验 Linux 环境，同时避免了虚拟机带来的复杂性和性能瓶颈。",false,"md",null,{"slots":326},{},true,"\u002Ffiddling\u002Fcsapplab0",{"text":330,"minutes":331,"time":332,"words":333},"10 min read",9.15,549000,1830,{"title":5,"description":321},{"loc":328},"posts\u002Ffiddling\u002Fcsapplab0",[319,338,339,340],"CSAPP","实验","环境搭建","tech","KyeDb25OM13rVyeg8tpyWSCH0K_iIdGkzqyxOdnNN4A",[344,349],{"title":345,"path":346,"stem":347,"date":348,"type":341,"children":-1},"MYDB 10. 服务端客户端的实现及其通信规则","\u002Fprojects\u002Fmydb\u002Fmydb10","posts\u002Fprojects\u002Fmydb\u002Fmydb10","2021-12-25 18:26:00",{"title":350,"path":351,"stem":352,"date":353,"type":341,"children":-1},"Java 中 this 关键字导致编译期常量传播优化失效的问题","\u002Ffiddling\u002Fthis-in-javac-string-concat","posts\u002Ffiddling\u002Fthis-in-javac-string-concat","2022-04-16 00:01:28",1787554445497]