屏蔽原始指针 (Rust)

Masking raw pointer (Rust)

我正在编写代码以与我的模拟器 (QEMU) 中的 NIC 接口。我需要将描述符数组的高 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}

访问原始地址以便我可以对其进行操作的最佳方式是什么?

可以使用 as 运算符将指针转换为 usize

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;