精选分类

文章列表

5.7k 5 分钟

# 前言 C2Rust 是一个将符合 C99 标准的代码迁移到 Rust 的转换器,本项目需要基于 C2Rust 将 C 预处理阶段的宏转换为 Rust 编译阶段的宏。因此,需要对 C 宏进行分析,并利用 Rust 宏的性质来寻找它们之间可能的映射关系和转换方案。 # 研究对象 根据 C99 标准,C 宏大体上可以分为替换文本宏(Replacing Text Macros)和条件包含(Conditional Inclusion)两种,而我们要根据这两类宏设计与之对应的 Rust 宏的转换规则。 替换文本宏的句法如下: #define identifier...
3.1k 3 分钟

# 概述 当一个进程正在运行时触发系统调用或被中断,将进行中断上下文的切换,之后执行 ISR 中断服务,在中断处理结束后,使用_schedule () 函数进行进程切换。 schedule () 函数首先从 CPU 任务队列中取出当前进程的标识符记为 prev 进程。然后通过进程调度算法确定下一个要被换上的进程,记为 next 进程。之后,检查 next 如果和 prev 进程不一样,调用 context_switch () 函数进行上下文切换,next 进程进入 CPU 运行。 在 context_switch () 中调用 switch_to ()...
4.5k 4 分钟

# c2rust 条件编译转化对应的实际例子: // C#ifdef ABCD printf("1: yes\n");#else printf("1: no\n");#endif#ifndef ABCD printf("2: no1\n");#elif ABCD == 2 printf("2: yes\n");#else printf("2: no2\n");#endif// Rust examplemy_def!(F_ABCD: bool,...
1.9k 2 分钟

# 常量宏 C 中常量宏的四种使用方式: #define MAX_SIZE 1024#define MY_STR "root/api/"#define MYTY int#define MYNIL以下是对应的 Rust 版本的处理方案: macro_rules! my_def { ($name: ident : $ty: ty, $value: expr) => { #[allow(non_upper_case_globals)] pub const $name: $ty = $value; }; ($name:...
3k 3 分钟

# eg1: macro_rules! my_macro { // 定义宏函数 ($arg1:expr, $arg2:expr) => { // 定义宏函数体,此处为求两个参数的和 ($arg1) + ($arg2) };}fn main() { // 调用宏函数 let x = my_macro!(1, 2); println!("{}", x); // 输出 "3"}#...
7.1k 6 分钟

# Rust 条件编译 下面是一个简单的 Rust 条件编译的例子,它展示了如何使用 cfg 属性来选择在哪个平台上编译代码。 #[cfg(target_os = "windows")]fn main() { println!("This is Windows.");}#[cfg(target_os = "linux")]fn main() { println!("This is...
2.4k 2 分钟

# 使用内嵌汇编触发 time/gettimeofday 系统调用 首先编写一个 test.c 程序,该程序会通过 gettimeofday 库函数来触发系统调用。 gettimeofday 是 C 库提供的函数,它封装了内核里的 sys_gettimeofday 系统调用。 在 ARM64 架构下 Linux 系统调用由同步异常 svc 指令触发。当用户态(EL0 级)程序调用库函数从而触发系统调用的时候,先把系统调用的参数依次放入 X0-X5 这 6 个寄存器( Linux 系统调用最多有 6 个参数,ARM64 函数调用参数可以使用 X0-X7 这 8 个寄存器),然后把系统调用号放在...
1.3k 1 分钟

# Rust 声明宏: MacroRulesDefinition : macro_rules ! IDENTIFIER MacroRulesDefMacroRulesDef : ( MacroRules ) ; | [ MacroRules ] ; | { MacroRules }MacroRules : MacroRule ( ; MacroRule )* ;?MacroRule : MacroMatcher => MacroTranscriberMacroMatcher : ( MacroMatch* ) | [ MacroMatch* ] |...
5.8k 5 分钟

# 前言 在 rust 中,声明宏本质就是匹配规则 + 转译替换规则,也是代码模版按照匹配规则进行代码化替换。调用声明宏时,就是传入一串代码片段,在编译期由编译期根据传入代码片段来匹配宏自身定义的匹配规则,再经过转译替换规则,将宏调用代码替换为转译后的代码。 # 声明式宏的几类写法: 常量宏,简单模式匹配替换 语句宏,语句替换,返回表达式结果 函数宏(Function-like macro),和过程中的类函数式宏极为相似。 这里对前两种用法做个总结,然后对 Rust 中条件编译宏 cfg 和 cfg_if 用法做简要总结。 # 声明宏一般形式: macro_rules! $name...
6.3k 6 分钟

# 准备 sudo apt install build-essentialsudo apt install qemu sudo apt install libncurses5-dev bison flex libssl-dev libelf-dev# 下载内核源码 sudo apt install axelaxel -n 20 https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.34.tar.xzxz -d linux-5.4.34.tar.xztar -xvf linux-5.4.34.tar cd...