Pointers 掩蔽原始指针(生锈)

Pointers 掩蔽原始指针(生锈),pointers,rust,qemu,nic,Pointers,Rust,Qemu,Nic,我正在编写代码,以便在模拟器(QEMU)中与NIC接口。我需要将描述符数组的高32位和低32位写入内存中两个单独的地址。我正在努力掩盖(并移动)我的原始指针,以便将两半都写入内存 我有: #[repr(align(16))] struct e1000_rx_desc { address : u64, length : u16, checksum : u16, status : u8, errors : u8, special : u16, } 以

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

我有:

#[repr(align(16))]
struct e1000_rx_desc {
    address : u64,
    length : u16,
    checksum : u16,
    status : u8,
    errors : 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;

可以使用
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;

谢谢你的片段。但是你能解释一下
&0xffff
部分吗?@watashj OP最初的问题是他们想用整数
&
指针,但是不能,所以我加入了一个
&0xffff
来演示它的工作原理。谢谢你的代码片段。但是你能解释一下
&0xffff
部分吗?@watashj OP最初的问题是他们想用整数
&
指针,但是不能,所以我加入了一个
&0xffff
来证明它是有效的。