屏蔽原始指针锈迹

问题描述

我正在编写代码以与仿真器(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,cso : u8,cmd : u8,css : u8,}

这些描述符的数组存储在内部:

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,((&self.rx as **mut e1000_rx_desc) & 0xFFFFFFFF) as u32);
self.write_u32_to_register(Registers::REG_RX_DESC_HI,((&self.rx as **mut e1000_rx_desc) >> 32) as u32);

我收到以下错误

no implementation for `*const *mut e1000::e1000_rx_desc & {integer}

获得对原始地址的最佳访问方式是什么?

解决方法

可以使用usize运算符将指针投射到as上和从其中投射指针:

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;