小编Raf*_*elo的帖子

了解arm64的kvm_vcpu_run_vhe函数

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)

c assembly arm kvm linux-kernel

8
推荐指数
1
解决办法
162
查看次数

如何在 C++ 中模拟 Rust 的 Mutex<Object>?

将一个对象和一个互斥锁作为 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>但它不是很好,我可以忘记锁定。

c++ rust

7
推荐指数
1
解决办法
196
查看次数

可变地迭代 &amp;[1,2,3,4,5,6,7,8,9] 以接收 `&amp;mut [1,4,7]` 然后 `&amp;mut [2,5,8]` 然后 `&amp;mut[ 3,6,9]`

我试图迭代分成块的切片,并返回一个包含每个块的第 n 个元素的元组。

例子:

&[1,2,3,4,5,6,7,8,9]

我想将其分成大小为 3 的块,然后迭代结果,返回这些元组,每个 next() 调用返回一个元组:

&mut[1,4,7], &mut[2,5,8], &mut[3,6,9]

我知道对于一般的东西,不可能返回可变的东西,这显然是不相交的,并且没有不安全的代码,我们可以拥有ChunksMuthttps://doc.rust-lang.org/std/slice/struct.ChunksMut .html)迭代器,所以也许有办法!。例如,我可以有 3 个ChunksMut,然后编译器知道从它们返回的元素是不相交的。

这是我对非可变的尝试:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=cfa7ca0bacbe6f1535050cd7dd5c537c

PS:我想避免每次迭代时使用 Vec 或任何分配

rust

6
推荐指数
1
解决办法
1069
查看次数

为什么 Android 模拟器的嵌套虚拟化速度非常慢?

嵌套 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 模拟器也慢得令人痛苦。

为什么?

virtualization android kvm virtual-machine

5
推荐指数
1
解决办法
1800
查看次数

返回包含函数拥有的数据的数据

我想要一个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)

rust

5
推荐指数
1
解决办法
311
查看次数

当 &amp;self 的生命周期与结构体不同时

在这个例子中

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)

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=e246ef19b9ae5f1d405bde7c59d456d7

我明白了

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)

lifetime rust

4
推荐指数
1
解决办法
139
查看次数

这行代码如何否定 std::uint64_t 值?

我试图理解这段代码的作用。这应该否定系数模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)?这怎么能否定任何事情呢?

代码来自这里

c++

1
推荐指数
1
解决办法
143
查看次数