Dvorak
Dvorak

Dvorak Chen

Default Default Category


使用 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

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

dotnet Authentication and Authorization

# .NET身份验证和授权 本篇博客介绍了在.NET中的身份验证和授权。使用了基于Cookie的身份验证,即用户身份信息将存储在Cookie中并响应给客户端。在控制器中,通过创建一个包含用户身份信息的`ClaimsPrincipal`对象,并使用`SignIn(claimsPrincipal, CookieAuthenticationDefaults.AuthenticationScheme)`方法将其发送给客户端: ```csharp var claims = new List<Claim> { new(ClaimTypes.Sid, <Id>,ClaimValueTypes.Sid, ISSUER, ISSUER), new(ClaimTypes.Email, <Email>, ClaimValueTypes.Email, ISSUER, ISSUER) }; var claimsIdentity = new ClaimsIdentity( claims, CookieAuthenticationDefaults.AuthenticationScheme); var claimsPrincipal = new ClaimsPrincipal(claimsIdentity); return SignIn(claimsPrincipal, CookieAuthenticationDefaults.AuthenticationScheme); ``` `SignIn`方法将创建一个包含Cookie的`SignInResult`对象,并将其从控制器返回给客户端,你可以在响应中看到`set-cookie`头部: ![file](/image/img-b9fca940-08db-4696-9537-d76aecf8a553.png) ## 我更喜欢使用Cookie 有多种身份验证方式可供选择,例如:Cookie、JWT等。如果我使用基于浏览器的客户端,我更倾向于使用Cookie,例如Web、Tauri、Electron等。 因为现代浏览器具有更高的安全性,它们会自动处理Cookie,接收Cookie并存储Cookie,并在发送请求时附加Cookie。客户端不需要额外处理Cookie。 相比之下,JWT会更加复杂。 包含用户身份信息的Cookie可...--GPT 4

.NET

How to fix some issues while using "diesel"

If you encounter the 'cannot open input file "sqlite3.lib"' error when operating sqlite file with Diesel, don't worry, it's because Diesel can't find the file sqlite3.lib at the path ~/.rustup/toolchains/..... You can download sqlite3.lib from the link provided in the article. After downloading, unzip it and move sqlite3.lib to the path ~/.rustup/toolchains/stable-x86_64-pc-windows-msvc/lib/rustlib/x86_64-pc-windows-msvc/lib/. Note that the path might be different if you use a different version of Rust. This article provides a simple solution to the error and helps you get back on track with your work.--GPT 4

Rust

Rust 和经典语言在习惯上的差异

本文介绍了 Rust 和 C# 在编程习惯上的差异。首先介绍了 Rust 中的所有权概念,即变量持有它的值的所有权、变量赋值给别的变量会转移所有权、变量不能使用它没有持有所有权的值。这种概念带来的好处是严格限制了值的生命周期,为编译器知道在何处释放它提供了基础。其次,本文介绍了 Rust 中的抽象,即单元结构体的使用方法,它不定义任何的属性,可以用 `impl` 块给他定义方法,调用的时候单元结构体的名字提供了抽象。最后,本文介绍了在 Rust 中经常出现的嵌套泛型的写法,这种写法是为了实现动态分配,而其他的,如 `Mute<T>` 和 `Arc<T>` 是为了在多线程中共享数据。在 Rust 中必须要习惯这种 **wrap** 写法。--GPT 4

Rust