Pointers 掩蔽原始指针(生锈)
我正在编写代码,以便在模拟器(QEMU)中与NIC接口。我需要将描述符数组的高32位和低32位写入内存中两个单独的地址。我正在努力掩盖(并移动)我的原始指针,以便将两半都写入内存 我有: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, } 以
#[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
来证明它是有效的。