No.1 Morning News
1. 🤩 myspaghetti/macos-virtualbox 一个可以一键安装 MacOS 虚拟机的 bash 脚本,支持 MacOS、Windows 和 Linux。
2. 🤙 Tutorial - Write a System Call 教你如何在 Linux 内核中实现一个简单的系统调用,可以学到系统调用的基本原理以及编译自己的 Linux 内核。作者此前还写过一个用 C 实现一个 shell 的教程,也非常值得一读。
3. 🥳 The 5.14 kernel has been released 在 30 周年庆祝的同时,Linux Kernel 5.14 发布了。
4. 📏 Rust Language Cheat Sheet 包含了 Rust 主要特性的快捷参考,图文并茂,追求效率的程序员应该收藏甚至制作自己的 cheat sheet。
Have a nice day!
1. 🤩 myspaghetti/macos-virtualbox 一个可以一键安装 MacOS 虚拟机的 bash 脚本,支持 MacOS、Windows 和 Linux。
2. 🤙 Tutorial - Write a System Call 教你如何在 Linux 内核中实现一个简单的系统调用,可以学到系统调用的基本原理以及编译自己的 Linux 内核。作者此前还写过一个用 C 实现一个 shell 的教程,也非常值得一读。
3. 🥳 The 5.14 kernel has been released 在 30 周年庆祝的同时,Linux Kernel 5.14 发布了。
4. 📏 Rust Language Cheat Sheet 包含了 Rust 主要特性的快捷参考,图文并茂,追求效率的程序员应该收藏甚至制作自己的 cheat sheet。
Have a nice day!
GitHub
GitHub - myspaghetti/macos-virtualbox: Push-button installer of macOS Catalina, Mojave, and High Sierra guests in Virtualbox on…
Push-button installer of macOS Catalina, Mojave, and High Sierra guests in Virtualbox on x86 CPUs for Windows, Linux, and macOS - myspaghetti/macos-virtualbox
🔀 Aadit Sheth 在近日的一串推文中表示,用的好的话,你的推特账号可能比你的学历更有用。你需要
1. 控制你关注的内容,99% 的人用推特来看新闻,这没什么不对,但它还可以是高质量信息的来源——前提是你自己控制好
2. 使用推特列表(Twitter Lists)来创建有的放矢的关注列表,这个列表不会被推特的推荐算法影响,而是忠实地以时间顺序列出你收集的账号的内容。
3. 使用高级搜索功能,譬如
> (from:aaditsh) min_faves:1000 marketing
可以搜索来自 aaditsh 这个账号点赞数超过 1000 的包含 “marketing” 关键字的推文,而
> (from:aaditsh) until:2021-09-01 since:2021-05-01
则可以列出特定时间范围内的内容
4. 屏蔽掉杠精和喷子(原词是 troll)
5. 打磨你的个人简介
6. 集成你的 Newsletter,用 newsletter 来写更有深度的文章
7. 使用推特串,把复杂的主题分解为简单可执行的小建议
8. 像本能一样般去建立关系,使用推特的 DM 去接触人
9. 使用名为 Minimal Twitter 的 Chrome 插件去除噪音
1. 控制你关注的内容,99% 的人用推特来看新闻,这没什么不对,但它还可以是高质量信息的来源——前提是你自己控制好
2. 使用推特列表(Twitter Lists)来创建有的放矢的关注列表,这个列表不会被推特的推荐算法影响,而是忠实地以时间顺序列出你收集的账号的内容。
3. 使用高级搜索功能,譬如
> (from:aaditsh) min_faves:1000 marketing
可以搜索来自 aaditsh 这个账号点赞数超过 1000 的包含 “marketing” 关键字的推文,而
> (from:aaditsh) until:2021-09-01 since:2021-05-01
则可以列出特定时间范围内的内容
4. 屏蔽掉杠精和喷子(原词是 troll)
5. 打磨你的个人简介
6. 集成你的 Newsletter,用 newsletter 来写更有深度的文章
7. 使用推特串,把复杂的主题分解为简单可执行的小建议
8. 像本能一样般去建立关系,使用推特的 DM 去接触人
9. 使用名为 Minimal Twitter 的 Chrome 插件去除噪音
Twitter
Aadit Sheth
If you use it right, your Twitter account is worth more than your degree. But 98.8% suck at it. Here are 9 unique ways to turn Twitter into a crazy valuable asset:
Go 语言之父 Russ Cox 写过三篇关于内存模型(memory model)的文章,对于并发编程已经是必须的今天,任何一个系统程序员都应该对此有正确的认知,强烈推荐阅读。
C++ 中关于函数定义有三个非常容易混淆的概念,即 overload、overwrite 和 override。
overload 是定义具有不同参数类型的同名函数,相当于同一个名字背负了多个不同的函数,所以叫做重载(load 对应的中文是负载);
overwrite 发生在编译时多态,即子类定义了一个和父类非 virtual 函数相同名字的函数,那么父类的这个函数将被隐藏,所以叫做重写或者隐藏(write 就是写嘛);
而 override 则是我们实现虚函数的时候写的关键词,即运行时多态,可以实现通过父类指针调用子类方法的效果,所以称之为覆盖。
正确理解这三个关键词的前提是弄清楚 C++ 的多态机制以及调用函数时发生的 name resolution 机制。
类似这种需要厘清的概念在 C++ 中非常多,花时间自己总结和归纳是最好的学习方法。
overload 是定义具有不同参数类型的同名函数,相当于同一个名字背负了多个不同的函数,所以叫做重载(load 对应的中文是负载);
overwrite 发生在编译时多态,即子类定义了一个和父类非 virtual 函数相同名字的函数,那么父类的这个函数将被隐藏,所以叫做重写或者隐藏(write 就是写嘛);
而 override 则是我们实现虚函数的时候写的关键词,即运行时多态,可以实现通过父类指针调用子类方法的效果,所以称之为覆盖。
正确理解这三个关键词的前提是弄清楚 C++ 的多态机制以及调用函数时发生的 name resolution 机制。
类似这种需要厘清的概念在 C++ 中非常多,花时间自己总结和归纳是最好的学习方法。
通常来说编译和运行在 Linux 上的 Rust 程序底层是依赖 libc 的,原生的系统调用需要通过 libc 抽象的接口才能被 Rust 调用。Rust programs written entirely in Rust 是一个有趣的尝试:移除 libc 这一层 C 的中间层,让 Rust 程序的执行自上而下都只经过 Rust。
为了达成这个目的,作者实现的 mustang 运行时通过短短几行嵌入汇编让程序启动后直接调用 rust 函数,使用 rsix 包提供的系统调用,并实现了 C ABI 兼容的 Rust 的标准库依赖的一些 libc、libpthread 等库的函数,最后使用自定义的 global_allocator 代替了默认的 malloc 作为 Rust 运行时的内存分配器,从而实现了一个可以打印 hello world 的 demo。
很难说这个 mustang 运行时是否有实际价值,但实现这样一个小项目一定是很有趣的 hack 经历。
回顾程序启动与运行,本质上都是 CPU 指令。
链接后的 ELF 可执行文件中会有一个特殊的地址作为操作系统返回到用户态开始执行程序的入口。
用户从 shell 中执行程序时,shell 会调用 execve 系统调用,同时压入 argc, argv 和 envp 的参数,把运行程序的任务交接给内核。
内核加载并解析 ELF 二进制后,返回用户态并跳转到程序入口。
这个入口是整个程序的执行开始的地方,由运行时提供(常见的运行时有 libc、musl、crt 等),通常需要初始化栈(即设置栈寄存器),以及调用一些初始化函数,当这些都完成后,就可以把执行交给 main 函数。
用户程序和内核交互需要通过系统调用,本质上是特殊的 CPU 指令配合内核相关的系统调用编号实现,直接操作会降低程序的可移植性,所以通常也会由运行时来提供一层抽象,一方面用户程序可以直接调用函数实现系统调用,另一方面可以通过换运行时重新编译在不同平台上移植程序。
这些是在操作系统课上学到的知识,可惜我只局限在知道,但从未真正实践过。Hack 的核心之一就是实践,这个项目还是很有启发意义的。
为了达成这个目的,作者实现的 mustang 运行时通过短短几行嵌入汇编让程序启动后直接调用 rust 函数,使用 rsix 包提供的系统调用,并实现了 C ABI 兼容的 Rust 的标准库依赖的一些 libc、libpthread 等库的函数,最后使用自定义的 global_allocator 代替了默认的 malloc 作为 Rust 运行时的内存分配器,从而实现了一个可以打印 hello world 的 demo。
很难说这个 mustang 运行时是否有实际价值,但实现这样一个小项目一定是很有趣的 hack 经历。
回顾程序启动与运行,本质上都是 CPU 指令。
链接后的 ELF 可执行文件中会有一个特殊的地址作为操作系统返回到用户态开始执行程序的入口。
用户从 shell 中执行程序时,shell 会调用 execve 系统调用,同时压入 argc, argv 和 envp 的参数,把运行程序的任务交接给内核。
内核加载并解析 ELF 二进制后,返回用户态并跳转到程序入口。
这个入口是整个程序的执行开始的地方,由运行时提供(常见的运行时有 libc、musl、crt 等),通常需要初始化栈(即设置栈寄存器),以及调用一些初始化函数,当这些都完成后,就可以把执行交给 main 函数。
用户程序和内核交互需要通过系统调用,本质上是特殊的 CPU 指令配合内核相关的系统调用编号实现,直接操作会降低程序的可移植性,所以通常也会由运行时来提供一层抽象,一方面用户程序可以直接调用函数实现系统调用,另一方面可以通过换运行时重新编译在不同平台上移植程序。
这些是在操作系统课上学到的知识,可惜我只局限在知道,但从未真正实践过。Hack 的核心之一就是实践,这个项目还是很有启发意义的。
sunfishcode's blog
Rust programs written entirely in Rust
A blog by sunfishcode
