Dvorak
Dvorak

Dvorak Chen

All Posts


使用 Rust 为 RISC-V 设置页表

使用Rust为RISC-V设置页表的博文介绍了如何使用Rust语言编写一个简单的物理页帧分配器,并详细讲解了如何组装页表。首先,作者介绍了如何使用Rust编写一个分配器,该分配器可以从预先分配的物理内存中分配页帧。然后,作者展示了如何初始化根页表,并将其与分配器关联起来。接下来,作者讲解了如何使用根页表和级别页表来组装完整的页表。作者解释了如何将虚拟页号映射到页帧,并讨论了恒等映射和使用页帧映射的不同情况。最后,作者介绍了如何设置satp寄存器的值,以启用页表。整篇博文详细介绍了页表的设置过程,并提供了示例代码和具体实现细节。这篇博文对于想要了解如何使用Rust为RISC-V设置页表的读者来说是一个很好的参考资料。 有趣的问题: - 如何在Rust中实现一个简单的物理页帧分配器? - 如何使用根页表和级别页表来组装完整的页表? - 为什么需要恒等映射和使用页帧映射? - 如何设置satp寄存器的值以启用页表? 这篇博文提供了一个很好的起点,帮助读者了解如何使用Rust为RISC-V设置页表,并且激发了读者对于页表和操作系统底层的思考。阅读全文可以深入了解页表的实现细节,并回答上述问题。--GPT 4

Rust RISC-V

Rust 编写裸机代码使用链接器脚本

Rust 编写裸机代码使用链接器脚本 本文介绍了如何使用链接器脚本来编写裸机代码。首先,我们了解了链接器的功能,它将代码和数据安排到不同的段中。然后,我们学习了如何编写链接器脚本,并以一个简单的示例进行了说明。链接器脚本可以用于定义段的大小和布局,以及指定程序的入口符号。我们还讨论了汇编语言的一些基础知识,以便更好地理解链接器脚本中的一些概念。最后,我们演示了如何在Rust代码中使用链接器脚本中定义的符号。通过使用extern "C"关键字,我们可以在Rust代码中访问链接器脚本中定义的符号,并在程序中使用它们。本文提供了一个完整的示例,展示了如何在Rust中使用链接器脚本来编写裸机代码。通过阅读本文,读者将了解如何使用链接器脚本来优化代码布局,并在Rust中使用链接器脚本中定义的符号。是否想知道如何在Rust中编写裸机代码,以及如何使用链接器脚本来优化代码布局?--GPT 4

Rust RISC-V

使用 Rust 编写 Risc-V 裸机代码

使用 Rust 编写 Risc-V 裸机代码的过程中,需要注意以下几个方面: 1. 确定目标平台:通过查看 Rust 支持的目标平台列表,选择适合的目标平台,并安装相应的组件。 2. 链接器脚本:如果需要在裸机代码中链接一些符号,需要指定链接器脚本。在项目根目录下创建 `.cargo/config.toml` 文件,并指定链接器脚本的路径。 3. 使用 `no_std`:在裸机环境下无法使用标准库,所以需要在代码中添加 `#![no_std]`,告诉编译器不使用标准库。 4. 修改入口函数:在裸机中,`main` 函数不再是程序的入口,而是 `_start` 函数。需要在代码中使用 `#![no_main]` 告诉编译器不使用 `main` 函数作为入口,并提供一个 `_start` 函数作为程序的真正入口。 5. 错误处理函数:提供一个 `panic_handler` 函数,用于处理 panic 错误。 通过以上步骤,我们可以开始编写 Risc-V 裸机代码。--GPT 4

Rust RISC-V

GDB 调试 Rust 编译为 RISC-V 裸机代码

GDB调试Rust编译为RISC-V裸机代码的博客介绍了如何使用QEMU和GDB来调试编译为RISC-V裸机的二进制文件。在启动QEMU时,需要添加`-s`和`-S`参数,其中`-s`用于启用GDB服务器,默认在1234端口,`-S`用于在启动时暂停CPU。然后,可以使用gdb来进行调试。在进入gdb后,可以设置断点并执行代码,还可以使用`layout src`命令查看对应的Rust源码。如果在gdb中使用`layout src`无法显示源码,可能是因为没有执行下一步代码、使用了--release编译选项或链接器脚本去除了调试信息。博客提供了解决这些问题的建议,并提醒读者可以在网上找到更多有关gdb的命令。--GPT 4

Rust RISC-V

重新发明 Service Trait

重新发明Service Trait 这篇博客讲述了如何重新设计和改进Rust中的Service Trait。作者首先介绍了一个简单的HTTP服务器的实现,该服务器使用了三个Handler函数来处理请求。然后,作者展示了如何将这三个Handler函数组合成一个更通用的Handler。作者通过实现一个新的Handler trait,使用泛型和关联类型,使得Handler可以接受任意类型的请求和返回任意类型的响应。接下来,作者介绍了如何为Timeout和JsonContentType这两个Handler实现新的泛型版本。最后,作者讨论了Service trait的一个重要方法poll_ready,它可以用于拥塞控制。 这篇博客引发了一些有趣的问题,例如如何设计一个通用的Handler trait,以及如何实现拥塞控制。读者可以通过阅读全文来了解更多关于Rust中Service Trait的内容,并思考这些问题的答案。 摘要的最后提出了一个问题,即如何设计一个通用的Handler trait。这个问题可以激发读者的思考,并鼓励他们深入研究Rust中的Service Trait。--GPT 4

Rust

HTML 样式设计的兼容性考虑

HTML样式设计的兼容性考虑 这篇博客讨论了HTML元素的大小应该由其外部元素决定的概念。作者指出,这样设计的元素能够具有兼容性和伸缩性,适应不同大小的要求。通过使用Vue框架编写组件的例子,作者展示了组件和元素的伸缩性的重要性。他提到了一个手机组件的例子,该组件的固定宽高导致在不同屏幕上显示不完美。为了使组件具有伸缩性,作者建议将组件的宽高设置为100%,使其大小取决于使用它的地方。最后,作者指出并非所有组件都需要伸缩性,例如按钮组件可以使用固定的宽高。这篇博客引发了读者对HTML样式设计的思考,并提出了一个问题:什么样的元素需要具有伸缩性?--GPT 4

css

在 Dockerfile 里使用 crates 镜像提升 crates 下载速度

在这篇博客中,作者介绍了如何在Dockerfile中使用crates镜像来提高crates下载速度。文章首先说明了在国内访问crates时下载速度较慢的问题,并提出了在本地设置crates镜像的解决方案。然后,作者给出了在Dockerfile中添加镜像配置的具体步骤,并提到了与本地配置方式的细微差别。最后,作者引用了一个参考链接,供读者进一步了解和学习。通过本文,读者可以了解到如何在Dockerfile中使用crates镜像来提升下载速度,并且可以思考如何在其他环境中应用相似的镜像配置来优化软件开发过程中的依赖下载速度。--GPT 4

Rust

更好的 Javascript 运行时 Deno

# 更好的 Javascript 运行时 Deno 本博客介绍了一种更好的 JavaScript 运行时环境——Deno。与目前占据主导地位的Node不同,Deno提供了更好的使用体验。 Deno同样基于V8引擎,但与Node不同的是,Deno默认支持TypeScript,并提供了HTTP服务器等功能,而Node需要通过添加依赖来实现这些功能。 在安装Deno后,可以通过在控制台输入`deno -v`来查看Deno的版本。 Deno可以直接运行TypeScript,只需创建一个ts文件并编写代码,然后使用`deno`命令运行。此外,Deno还可以作为服务器使用,它提供了用于构建HTTP服务器的库。只需创建一个新文件并编写代码,然后使用`deno run --allow-net`命令运行即可。需要注意的是,在Deno中,默认情况下网络权限是关闭的,需要使用`--allow-net`参数开启。 通过使用Deno,无需安装任何依赖即可运行TypeScript和构建HTTP服务器。 想要了解更多关于Deno的信息,请查看[官方文档](https://deno.com/)。--GPT 4

Javascript

P2P 的使用 coturn 搭建 ICE 服务器

在这篇博客中,我们讨论了在NAT网络环境下进行P2P通信的问题,并介绍了使用STUN和TURN协议来解决这个问题。我们还介绍了如何使用coturn来搭建一个ICE服务器。首先,我们安装了coturn,并配置了证书和监听端口。然后,我们配置了用户名、密码和域名。最后,我们进行了测试,验证了STUN和TURN服务器的正常工作。我们还提供了让coturn在后台自启动的命令。通过阅读这篇博客,你将了解到如何搭建一个ICE服务器来支持P2P通信,并解决NAT网络环境下的问题。--GPT 4

network

Create your own simple reactivity front-end framework

创造你自己的简单响应式前端框架 本文介绍了如何创建一个简单的响应式前端框架。作者对Angular、Vue和React这三个主流前端框架进行了评价,并提到了自己对它们的喜好和不喜欢之处。作者决定尝试创建自己的响应式前端框架,类似于Solid并使用Signal。 首先,作者决定使用函数组件而不是类组件。作者展示了一个函数组件的例子,并介绍了如何通过编译器将jsx转换为普通的JavaScript代码。作者提到了SWC作为一个可用于转换JavaScript/TypeScript和支持jsx/tsx的工具,并提供了SWC playground用于查看jsx/tsx转换为JavaScript的过程。 接下来,作者讨论了响应式的实现。作者提到了Angular通过绑定变量、React通过虚拟DOM以及Solid使用Signal来实现响应式。作者决定使用Signal,并展示了如何使用createSignal创建一个信号,并在HTML中使用该信号的值。作者还展示了如何实现一个自定义的useSignal函数。 然后,作者讨论了如何在Dvorak.createElement函数中实现订阅值的逻辑。作者展示了如何在createElement函数中绑定属性值,并订阅相应的发布者。作者还展示了如何处理元素的子节点,并通过一个reactiveChildren函数实现了子节点的响应式。 总结起来,本文介绍了如何创建一个简单的基于Signal的响应式库。阅读全文可以了解更多细节和实现方法。 摘要:本文介绍了如何创建一个简单的响应式前端框架。作者讨论了Angular、Vue和React这三个前端框架,并决定尝试创建自己的框架。作者展示了如何使用SWC转换jsx/tsx为JavaScript,并介绍了Signal作为响应式的实现方式。作者还展示了如何实现一个简单的useSignal函数和reactiveChildren函数。阅读全文可以了解更多细节和实现方法。--GPT 4

Javascript