在arch/arm64/kvm/hyp/vhe/switch.c 中,我们有以下代码在 arm64 上运行 EL2(虚拟化层)中的 CPU:
/* Switch to the guest for VHE systems running in EL2 */
static int __kvm_vcpu_run_vhe(struct kvm_vcpu *vcpu)
{
struct kvm_cpu_context *host_ctxt;
struct kvm_cpu_context *guest_ctxt;
u64 exit_code;
host_ctxt = &this_cpu_ptr(&kvm_host_data)->host_ctxt;
host_ctxt->__hyp_running_vcpu = vcpu;
guest_ctxt = &vcpu->arch.ctxt;
sysreg_save_host_state_vhe(host_ctxt);
/*
* ARM erratum 1165522 requires us to configure both stage 1 and
* stage 2 translation for the guest context before we clear
* HCR_EL2.TGE.
*
* We have already configured the guest's stage 1 …
Run Code Online (Sandbox Code Playgroud) 将一个对象和一个互斥锁作为 2 个不同的变量有点容易出错
MyObject myObject;
std::mutex myObjectMutex;
Run Code Online (Sandbox Code Playgroud)
有时我倾向于忘记锁定它。
在 Rust 上,一个共享对象需要在互斥锁中:
std::sync::Mutex<MyObject> mySharedObject
Run Code Online (Sandbox Code Playgroud)
所以我必须这样使用:
mySharedObject.lock().unwrap().objectMethod()
Run Code Online (Sandbox Code Playgroud)
在 C++ 中模拟这样的东西的不太容易出错的方法是什么,所以我不会忘记锁定它?
我想到了一个,std::tuple<std::mutex, MyObject>
但它不是很好,我可以忘记锁定。
我试图迭代分成块的切片,并返回一个包含每个块的第 n 个元素的元组。
例子:
&[1,2,3,4,5,6,7,8,9]
我想将其分成大小为 3 的块,然后迭代结果,返回这些元组,每个 next() 调用返回一个元组:
&mut[1,4,7], &mut[2,5,8], &mut[3,6,9]
我知道对于一般的东西,不可能返回可变的东西,这显然是不相交的,并且没有不安全的代码,我们可以拥有ChunksMut
(https://doc.rust-lang.org/std/slice/struct.ChunksMut .html)迭代器,所以也许有办法!。例如,我可以有 3 个ChunksMut
,然后编译器知道从它们返回的元素是不相交的。
这是我对非可变的尝试:
PS:我想避免每次迭代时使用 Vec 或任何分配
嵌套 KVM 虚拟化的开销应该很小,但 VM 内的 Android 模拟器应该可用。
当我在 ubuntu 20.04 guest 虚拟机(在 ubuntu 20.04 主机上)内启动 Android 模拟器时,它警告我,我处于嵌套虚拟化中,因此速度会很慢。但它的速度低得令人痛苦,而不仅仅是缓慢。启动进入 Android 需要 10 分钟,是的,所有系统都是 x86_64,甚至是 android 映像。
我认为这与 OpenGL 有关,所以我在我的 virt-manager 上启用了 OpenGL 虚拟化,但速度仍然很慢。
我在有 16 个核心的 Ryzen 7 2700x 上尝试了同样的操作,我将所有核心都给了虚拟机,并将 AMD GPU 传递给了它,Android 模拟器也慢得令人痛苦。
为什么?
我想要一个DataAllocator
可以返回具有生命周期的数据的数据'r
,这样我就可以将它传递给something
并且仍然能够返回内部分配的值something
:
use std::marker::PhantomData;
pub struct Data<'a, T>{
a: &'a [T]
}
impl<'a, T> Data<'a, T> {
pub fn new() -> Data<'a, T> {
todo!()
}
fn iter(&'a self) -> Iter<'a, T> {
todo!()
}
}
pub struct Iter<'a, T> {
_phantom: PhantomData<&'a T>
}
impl<'a, T> Iterator for Iter<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
todo!()
}
}
pub trait DataAllocator<'s, 'r, T> {
fn …
Run Code Online (Sandbox Code Playgroud) 在这个例子中
use std::marker::PhantomData;
pub struct A<'a, T> {
elements: Vec<B<'a, T>>
}
pub struct B<'a, T> {
_phantom: PhantomData<&'a T>
}
impl<'a, T> A<'a, T> {
pub fn iter(& self) -> Iter<'a, T> {
Iter {
iter: self.elements.iter(),
}
}
}
pub struct Iter<'a, T> {
iter: std::slice::Iter<'a, B<'a, T>>,
}
Run Code Online (Sandbox Code Playgroud)
我明白了
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter in function call due to conflicting requirements
--> src/lib.rs:14:24
|
14 | iter: self.elements.iter(),
| ^^^^
|
note: …
Run Code Online (Sandbox Code Playgroud) 我试图理解这段代码的作用。这应该否定系数模coeff
类型uint64_t*
为 的多项式的modulus_value
类型系数const uint64_t
:
std::int64_t non_zero = (*coeff != 0);
*coeff = (modulus_value - *coeff) & static_cast<std::uint64_t>(-non_zero);
Run Code Online (Sandbox Code Playgroud)
到底怎么了& static_cast<std::uint64_t>(-non_zero)
?这怎么能否定任何事情呢?
代码来自这里。