gpt4 book ai didi

pointers - 屏蔽原始指针 (Rust)

转载 作者:行者123 更新时间:2023-12-03 11:42:52 25 4
gpt4 key购买 nike

我正在编写代码来与我的模拟器(QEMU)中的 NIC 接口(interface)。我需要将描述符数组的高 32 位和低 32 位写入内存中的两个单独地址。我正在努力掩盖(并转移)我的原始指针以将两半写入内存。
我有:

#[repr(align(16))]
struct e1000_rx_desc {
address : u64,
length : u16,
checksum : u16,
status : u8,
errors : u8,
special : u16,
}
和:
#[repr(align(16))]
struct e1000_tx_desc {
address : u64,
length : u16,
cso : u8,
cmd : u8,
status : u8,
css : u8,
special : u16,
}
这些描述符的数组存储在内部:
pub struct E1000 {
base : u32,
rx : [*mut e1000_rx_desc; 32],
tx : [*mut e1000_tx_desc; 8],
}
我一直在尝试使用以下方法写入硬件寄存器:
self.write_u32_to_register(Registers::REG_RX_DESC_LO, 0, ((&self.rx as **mut e1000_rx_desc) & 0xFFFFFFFF) as u32);
self.write_u32_to_register(Registers::REG_RX_DESC_HI, 0, ((&self.rx as **mut e1000_rx_desc) >> 32) as u32);
我收到以下错误:
no implementation for `*const *mut e1000::e1000_rx_desc & {integer}
访问原始地址以便我可以操纵它的最佳方法是什么?

最佳答案

指针可以在 usize 之间进行转换。使用 as运算符(operator):

let x: i32 = 5;
let x_ptr: *const i32 = &x as *const i32;
let x_ptr_addr: usize = x_ptr as usize;
let new_ptr = (x_ptr_addr & 0xffff) as *const i32;

关于pointers - 屏蔽原始指针 (Rust),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63395869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com