如何解决屏蔽原始指针锈迹
我正在编写代码以与仿真器(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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。