SEV内存加密位linux内核设置过程

AMD SEV实现 libvirt SEV相关代码分析 struct _virDomainObj { ... virDomainDefPtr def; /* The current definition */ ... } struct _virDomainDef { ... virDomainSEVDefPtr sev; ... } struct _virDomainSEVDef { int sectype; /* enum virDomainLaunchSecurity */ char ... 阅读详情

1. KVM_MEMORY_ENCRYPT_OP初始化

main()                     // QEMU 入口函数
    qemu_init()              // 初始化虚拟机
        configure_accelerators
            kvm_init
                sev_guest_init
                    KVM_SEV_INIT
                    sev_launch_start
                        KVM_SEV_LAUNCH_START
                    ram_block_notifier_add(&sev_ram_notifier);   //sev_ram_block_added KVM_MEMORY_ENCRYPT_REG_REGION
                kvm_state->memcrypt_encrypt_data = sev_encrypt_data;
                kvm_arch_init
                    kvm_vm_enable_cap
                kvm_memory_listener_register
                memory_listener_register
                cpus_register_accel
        machine_run_board_init()      //pc_init_isa
            pc_init1()    
                pc_memory_init
                pc_system_firmware_init
                    pc_system_flash_map
                        kvm_memcrypt_encrypt_data
                            kvm_state->memcrypt_encrypt_data

1.1、代码逻辑解析

此代码段属于 KVM 对 KVM_MEMORY_ENCRYPT_OP ioctl 的处理核心逻辑,其作用是为内存加密操作提供统一的入口,但实际功能由架构相关代码(如 AMD SVM)实现。以下为逐行分析:

case KVM_MEMORY_ENCRYPT_OP: {
    r = -ENOTTY; // 默认返回“不支持该操作”
    if (kvm_x86_ops->mem_enc_op) // 检查架构是否实现内存加密操作
        r = kvm_x86_ops->mem_enc_op(kvm, argp); // 调用具体实现(如 AMD SEV)
    break;
}

1.2、关键行为解读

1. 兼容性控制机制
  • -ENOTTY 的深层含义:表示当前内核或硬件不支持内存加密功能,可能原因包括:

    • 未启用 CONFIG_KVM_AMD_SEV 内核编译选项
    • 硬件无 SEV 支持(如非 AMD EPYC CPU)
    • 内核版本过旧(<4.16)或过新(≥5.10,此接口已废弃)
  • kvm_x86_ops->mem_enc_op 的动态绑定:

    • AMD 实现:指向 svm_mem_enc_op()(定义于 arch/x86/kvm/svm/sev.c)
    • Intel 实现:始终为 NULL(Intel 无等效 SEV 功能)
2. 参数传递流程
// 用户态(QEMU)调用示例:
struct kvm_sev_cmd cmd = {
    .id = KVM_SEV_INIT, // 子命令类型
    .data = (unsigned long)&init_params // 具体参数结构体
};
ioctl(kvm_fd, KVM_MEMORY_ENCRYPT_OP, &cmd);

// 内核态处理(svm_mem_enc_op):
static int svm_mem_enc_op(struct kvm *kvm, void __user *argp)
{
    struct kvm_sev_cmd cmd;
    copy_from_user(&cmd, argp, sizeof(cmd)); // 从用户空间复制命令
    return sev_handle_cmd(kvm, cmd.id, cmd.data); // 分发到 SEV 子处理函数
}

1.3、与新版接口的差异

旧版(KVM_MEMORY_ENCRYPT_OP) vs 新版(KVM_SEV_*)
特性旧版接口新版接口(≥5.10)
命令结构统一入口 + 子命令 ID独立 ioctl 命令(如 KVM_SEV_INIT)
可维护性参数解析耦合度高类型安全,减少错误传递
功能扩展性需修改共用结构体独立命令互不影响
典型调用栈ioctl(KVM_MEMORY_ENCRYPT_OP) → svm_mem_enc_op() → sev_handle_cmd()ioctl(KVM_SEV_INIT) → sev_guest_init()
淘汰原因分析(内核 ≥5.10)
  1. 安全性:旧接口允许任意 cmd.id 传递,存在非法命令注入风险
  2. 性能:新版省去多层间接跳转,调用路径更短
  3. 代码清晰度:每个 SEV 操作有独立入口,便于维护

1.4、实际应用场景验证

若在 5.4 内核 中执行以下 QEMU 命令:

qemu-system-x86_64 -machine confidential-guest-support=sev0...

内核日志将出现:

kvm_amd: SEV supported: 255 ASIDs
kvm_amd: SEV-ES supported: 255 ASIDs
svm_mem_enc_op: handling command KVM_SEV_INIT

此时旧接口仍有效,但 5.10+ 内核会拒绝此调用,需改用 KVM_SEV_INIT。

1.5、调试技巧

  1. 动态追踪调用路径:

    echo 'p:svm_mem_enc_op arch/x86/kvm/svm/sev.c:1800 cmd_id=+0(%dx):u32' > /sys/kernel/debug/tracing/kprobe_events
    echo 1 > /sys/kernel/debug/tracing/events/kprobes/enable
    

    可捕获所有经过 svm_mem_enc_op 的命令 ID。

  2. 错误码解读:

    • -ENOTTY → 检查硬件/Kconfig/内核版本
    • -EINVAL → 参数结构体不匹配(如 32/64 位模式混合)

1.6、迁移到新接口的代码示例

// 旧版(废弃):
struct kvm_sev_cmd cmd = {.id = KVM_SEV_INIT};
ioctl(kvm_fd, KVM_MEMORY_ENCRYPT_OP, &cmd);

// 新版(推荐):
ioctl(kvm_fd, KVM_SEV_INIT, &launch_params); // 直接使用独立命令

该代码段是 KVM 内存加密功能演进的历史产物,理解其工作原理有助于调试旧版本兼容性问题,但在新开发中应遵循 AMD 官方推荐使用 KVM_SEV_* 系列专用命令。

2 qemu中设置逻辑

kvm_init
    kvm_memory_listener_register
        memory_listener_register                              
            listener_add_address_space
                kvm_region_add        (kml->listener.region_add = kvm_region_add;)
                    kvm_set_phys_mem

3 KVM_SET_USER_MEMORY_REGION

3.1、函数调用链路解析

1. 内存槽操作核心流程
是
否
用户态 QEMU 调用 KVM_SET_USER_MEMORY_REGION
内核 kvm_vm_ioctl_set_memory_region
__kvm_set_memory_region
kvm_set_memslot?
调用 kvm_set_memslot
直接操作 memslots
触发 kvm_arch_commit_memory_region
调用 arch.encrypted_ops->region_add
l
2. 关键函数映射关系
用户预期名称内核实际名称/行为所属文件
memslot_region_addkvm_set_memslotvirt/kvm/kvm_main.c
__kvm_set_memory_regionvirt/kvm/kvm_main.c
sev_mem_enc_region_addarch/x86/kvm/svm/sev.c

3.2、调试与验证方法

1. 动态追踪技术验证
# 使用 ftrace 跟踪内存槽添加操作
echo 'p:kvm_set_memslot kvm_set_memslot' > /sys/kernel/debug/tracing/kprobe_events
echo 1 > /sys/kernel/debug/tracing/events/kprobes/enable

# 观察输出示例:
#   qemu-system-x86-3248  [002] ...1  5678.901234: kvm_set_memslot: (kvm_set_memslot+0x0/0x3c0)
2. 代码交叉引用检查
  • 在 sev.c 中搜索 region_add 的引用:
    git grep -n "region_add" arch/x86/kvm/svm/sev.c
    # 输出:sev.c:1873:    .region_add = sev_mem_enc_region_add,
    
  • 确认 sev_mem_enc_region_add 的实现细节:
    static int sev_mem_enc_region_add(struct kvm *kvm, u64 addr, u64 size) {
        // 具体实现:遍历 PFN 设置 C-bit
        for (pfn = addr >> PAGE_SHIFT; pfn < (addr + size) >> PAGE_SHIFT; pfn++)
            set_page_encryption_mask(pfn);
    }
    

3.3、版本兼容性说明

内核版本关键变化点影响分析
Linux 4.19使用 kvm_set_memory_region 旧接口直接操作 kvm_memory_slot
Linux 5.4+引入 kvm_set_memslot 统一接口抽象化内存槽操作
Linux 5.15加密回调通过 kvm_memory_encrypted_ops明确分离加密相关操作

3.4、开发者操作建议

  1. 正确跟踪回调函数:

    // 在 sev.c 中添加调试输出
    static int sev_mem_enc_region_add(struct kvm *kvm, u64 addr, u64 size) {
        pr_info("SEV: Encrypting memory region 0x%llx-0x%llx\n", addr, addr + size);
        // ...原有代码...
    }
    

    通过 dmesg 观察加密区域触发情况。

  2. API 变更应对策略:

    // 兼容多版本内核的代码示例
    #if LINUX_VERSION_CODE >= KERNEL_VERSION(5,4,0)
        ret = kvm_set_memslot(kvm, &old, &new, KVM_MR_MOVE);
    #else
        ret = kvm_set_memory_region(kvm, &mem);
    #endif
    
  3. 文档查阅指引:

    • 官方内核文档:Documentation/virt/kvm/api.rst(搜索 KVM_SET_USER_MEMORY_REGION)
    • AMD SEV 白皮书:AMD Secure Encrypted Virtualization API 第 4.2 节 “Memory Encryption”

4 KVM_MEMORY_ENCRYPT_REG_REGION

memory_region_init_ram_from_file
	qemu_ram_alloc_from_file
	    mr->ram_block = qemu_ram_alloc_from_fd  (qemu)
	    qemu_ram_alloc_from_fd  (qemu)
	    qemu_ram_alloc_internal  (qemu)
	        ram_block_add  (qemu)
	            ram_block_notify_add  (qemu)
	                ram_block_added = sev_ram_block_added   (qemu)
	                sev_ram_block_added    (qemu)
	                    kvm_arch_vm_ioctl (KVM_MEMORY_ENCRYPT_REG_REGION)
	                        svm_x86_ops->mem_enc_reg_region 
	                            svm_register_enc_region

qemu_ram_alloc_internal 函数解析

qemu_ram_alloc_internal 是 QEMU 内存管理子系统中的核心内部函数,负责为虚拟机分配物理内存块(RAM Block)。它是 QEMU 内存初始化和动态扩展的关键环节,直接关联虚拟机的内存布局与性能优化。以下是其详细说明:


4.1. 函数定义与参数

函数原型
RAMBlock *qemu_ram_alloc_internal(
    ram_addr_t size,        // 需要分配的内存大小(字节)
    ram_addr_t max_size,    // 最大可扩展大小(用于动态内存扩展)
    void (*resized)(const char*, uint64_t, void*), // 内存大小调整回调函数
    void *resized_opaque,   // 回调函数的用户参数
    uint32_t flags,         // 内存属性标志(如共享、只读等)
    const char *name,       // 内存块名称(调试用)
    Error **errp            // 错误处理指针
);
参数解析
  • size
    初始分配的物理内存大小(例如 4GB 的虚拟机内存)。
  • max_size
    允许动态扩展的最大内存大小。若无需扩展,通常与 size 相同。
  • resized 回调
    当内存块大小调整时触发(例如通过 balloon 驱动收缩内存)。
  • flags
    内存属性标志,常见值包括:
    • RAM_SHARED: 内存可共享(用于多进程或热迁移)。
    • RAM_PREALLOC: 预分配物理内存(避免惰性分配)。
    • RAM_NORESERVE: 不预留宿主内存(允许 overcommit)。
  • name
    唯一标识符,如 "pc.ram" 或 "virtio-mmio.region"。

4.2. 核心功能

内存分配流程
  1. 创建 RAMBlock 结构体
    初始化 RAMBlock 对象,记录内存块的元数据(大小、宿主指针、映射关系等)。

    RAMBlock *block = g_new0(RAMBlock, 1);
    block->used_length = size;
    block->max_length = max_size;
    block->flags = flags;
    block->idstr = g_strdup(name);
    
  2. 宿主内存分配
    调用宿主系统的内存分配接口(如 mmap 或 memfd),根据 flags 选择策略:

    • 私有匿名映射(默认):
      ptr = mmap(NULL, size, PROT_READ | PROT_WRITE,
                 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
      
    • 大页内存(若启用):
      ptr = qemu_memfd_alloc(name, size, F_SEAL_GROW | F_SEAL_SHRINK, errp);
      
    • 共享内存(RAM_SHARED):
      ptr = shm_open(name, O_CREAT | O_RDWR, 0666);
      ftruncate(fd, size);
      
  3. 注册到全局链表
    将新分配的 RAMBlock 添加到 QEMU 的全局 RAM 列表 ram_list,供地址空间映射使用:

    QLIST_INSERT_HEAD_RCU(&ram_list.blocks, block, next);
    
  4. 通知内存监听器
    触发 MEMORY_DEVICE_PREPLUG 事件,通知设备模型(如 VGA、virtio-balloon)内存已更新。


4.3. 调用场景

场景 1:虚拟机启动初始化

在 QEMU 启动参数 -m 4G 时,主函数调用链为:

main() → qemu_init() → pc_memory_init() → memory_region_allocate_system_memory()
                                       → qemu_ram_alloc_internal()
  • 作用:分配虚拟机的主内存(pc.ram)。
场景 2:热插拔内存设备

通过 QMP 命令 memory-device-add 动态添加 DIMM:

qmp_memory_device_add() → pc_dimm_plug() → pc_dimm_memory_plug()
                                        → qemu_ram_alloc_internal()
  • 作用:为热插拔的内存条分配新的 RAMBlock。
场景 3:内存动态调整

virtio-balloon 驱动收缩内存时:

virtio_balloon_handle_output() → qemu_balloon() → ram_block_discard_range()
                                               → 触发 resized 回调
  • 作用:释放部分内存并更新 RAMBlock 的 used_length。

4.4. 关键数据结构

RAMBlock 结构(部分)
struct RAMBlock {
    struct rcu_head rcu;        // RCU 同步保护
    ram_addr_t offset;          // 在全局地址空间中的偏移
    ram_addr_t used_length;     // 当前使用的内存大小
    ram_addr_t max_length;      // 允许的最大内存大小
    void *host;                 // 宿主内存指针
    uint32_t flags;             // 内存属性标志
    char idstr[256];            // 唯一标识名称
    QLIST_ENTRY(RAMBlock) next; // 全局链表指针
    // ...(其他字段省略)
};
ram_list 全局变量
RAMList ram_list = {
    .blocks = QLIST_HEAD_INITIALIZER(ram_list.blocks),
    .mru_block = NULL,
};

4.5. 性能优化机制

  1. 内存预分配(RAM_PREALLOC)
    避免宿主系统的惰性分配(lazy allocation),减少虚拟机运行时缺页中断的开销。

  2. 透明大页对齐
    若宿主支持 THP(Transparent Huge Pages),qemu_ram_alloc_internal 会确保分配的内存按大页对齐(如 2MB),提升 TLB 命中率。

  3. 内存锁(mlock)
    在实时性要求高的场景(如 vhost-user),调用 mlock 锁定物理内存,防止被换出。


4.6. 错误处理

  • 内存不足:返回 NULL 并通过 error_setg(errp, "Cannot allocate memory") 设置错误信息。
  • 重复名称:若 name 已存在,触发 assert(调试模式)或忽略(生产环境可能不同)。

4.7. 代码示例(简化版)

// 分配 1GB 内存,允许扩展到 2GB
RAMBlock *ram = qemu_ram_alloc_internal(
    1 * GiB,
    2 * GiB,
    NULL,  // 无需 resized 回调
    NULL,
    RAM_SHARED, // 共享内存
    "guest.ram",
    &error_fatal
);

// 将 RAMBlock 映射到地址空间
MemoryRegion *mr = g_new(MemoryRegion, 1);
memory_region_init_ram_ptr(mr, NULL, "sysmem", ram->max_length, ram->host);
address_space_add_memory(&address_space_memory, mr, 0);

小结

qemu_ram_alloc_internal 是 QEMU 内存管理的底层基石,负责:

  • 物理内存分配:对接宿主系统的内存分配机制。
  • 元数据管理:维护 RAMBlock 的全局状态。
  • 扩展性支持:为热插拔、动态调整提供基础设施。

5. KVM_MEMORY_ENCRYPT_OP和KVM_MEMORY_ENCRYPT_REG_REGION区别

5. 1、 KVM_MEMORY_ENCRYPT_OP

功能目标
  • 通用加密操作:执行与内存加密相关的全局性操作,例如初始化加密上下文、密钥管理(如生成/注入密钥)、加密状态控制等。
  • 示例:
    • AMD SEV 中的 KVM_SEV_INIT(初始化安全加密虚拟化环境)
    • KVM_SEV_LAUNCH_START(启动虚拟机加密流程)
参数处理
  • 直接传递指针:通过 argp 直接传递操作类型和参数(通常是架构定义的联合体或结构体)。
  • 无显式数据拷贝:依赖底层实现解析 argp 指针,操作可能直接修改内核或硬件状态。
操作层级
  • 架构相关实现:通过 kvm_x86_ops->mem_enc_op 调用具体硬件(如 AMD SEV 或 Intel TDX)的加密操作接口。
  • 影响范围:通常作用于整个虚拟机或加密会话。

5.2、 KVM_MEMORY_ENCRYPT_REG_REGION

功能目标
  • 内存区域注册:将特定内存区域标记为加密/受保护区域,或从加密状态中解除注册。
  • 示例:
    • AMD SEV 的 KVM_SEV_LAUNCH_UPDATE_DATA(标记某块内存需加密)
    • 解除内存区域的加密保护(如迁移完成后)。
参数处理
  • 结构化数据拷贝:从用户空间复制 kvm_enc_region 结构体,明确包含内存区域的物理地址和长度。
    struct kvm_enc_region {
        __u64 addr;  // 内存区域起始地址
        __u64 size;  // 内存区域大小
    };
    
  • 安全性检查:通过 copy_from_user 验证用户空间数据的合法性,避免非法内存访问。
操作层级
  • 内存粒度操作:通过 kvm_x86_ops->mem_enc_reg_region 针对特定物理地址范围进行加密配置。
  • 影响范围:仅作用于单个内存区域,用于精细化管理。

关键差异总结

维度KVM_MEMORY_ENCRYPT_OPKVM_MEMORY_ENCRYPT_REG_REGION
操作类型全局性加密控制(如初始化、密钥管理)内存区域级加密配置(注册/解注册)
参数形式可能为复合结构体(通过 argp 直接解析)固定结构体(明确地址和大小)
数据传递无显式用户空间拷贝需从用户空间拷贝 kvm_enc_region
影响范围虚拟机级别或加密会话级别特定物理内存区域

典型应用场景

  1. 虚拟机启动加密:

    • 调用 KVM_MEMORY_ENCRYPT_OP 初始化 SEV 环境。
    • 多次调用 KVM_MEMORY_ENCRYPT_REG_REGION 逐块注册内存到加密区域。
  2. 热迁移保护:

    • 迁移前通过 KVM_MEMORY_ENCRYPT_OP 导出加密密钥。
    • 迁移后通过 KVM_MEMORY_ENCRYPT_REG_REGION 重新绑定内存区域。
  3. 动态内存加密:

    • 运行时按需加密敏感内存区域(如 GPU 显存),通过 KVM_MEMORY_ENCRYPT_REG_REGION 动态注册。

底层实现依赖

  • 硬件支持:两者最终通过 kvm_x86_ops 调用具体实现(如 AMD 的 sev_mem_enc_op 和 sev_mem_enc_reg_region)。
  • 安全性约束:内存加密操作通常需要 Hypervisor 与安全处理器(如 AMD PSP)协同完成,确保密钥不泄露。

此设计体现了 KVM 对内存加密的灵活支持:既提供全局控制接口,又允许细粒度内存管理,适配不同硬件加密方案。

AMD SEV使用 qemu中有对SEV的部分介绍:qemu-5.0/docs/amd-memory-encryption.txt Libvirt对SEV的配置 libvirt官方文档如下: https://libvirt.org/formatdomaincaps.html#elementsSEV https://libvirt.org/kbase/launch_security_sev.html https://libvirt.org/formatdomain.html#sev 宿主机支持SEV检查 在libv 阅读详情

相关推荐

AMD SEV实战:在Ubuntu 22.04上为KVM虚拟机开启内存加密(含QEMU配置详解)

本文详细介绍了在Ubuntu 22.04上为KVM虚拟机开启AMD SEV内存加密的实战步骤,包括硬件验证、QEMU配置和故障排查。通过SEV技术,每个虚拟机都能拥有独立的加密密钥,确保数据安全,即使Hypervisor被攻破也无法解密内存数据。文章还提供了性能优化和密钥管理的高级配置建议。

weixin_30496999的博客 252

Linux 内核揭秘:AMD SEV 实现,安全加密虚拟化的内核支持

你是否曾担心过虚拟机的数据安全?在云端环境中,即使使用了虚拟化技术,敏感数据仍可能面临被 hypervisor(虚拟机监控程序)窥探的风险。AMD SEV(Secure Encrypted Virtualization,安全加密虚拟化)技术的出现,为这一问题提供了革命性的解决方案。本文将深入探讨 Linux 内核如何支持 AMD SEV,以及它如何在不依赖 hypervisor 信任的情况下保护虚...

gitblog_00346的博客 1420

构建三重加固AI训练沙箱:KVM GPU直通、网络微分段与内存加密实战

在AI模型训练领域,数据安全与算力高效利用是核心诉求。虚拟化技术通过硬件资源抽象与隔离,为多任务环境提供了基础支撑。KVM作为Type-1虚拟化方案,凭借近原生性能与完备的生态,成为构建安全隔离环境的理想选择。其技术价值在于,既能通过PCIe直通实现GPU算力的无损交付,又能借助独立内核与虚拟硬件实现强隔离安全边界。在金融、医疗等敏感数据处理场景中,结合网络微分段与基于CPU硬件的内存加密技术,可构建从设备、网络到运行数据的全方位防护层,这正是实现可信AI训练沙箱的关键路径。本文以NVIDIA GPU直通隔

weixin_33857230的博客 364

AMD SEV机密计算实战:从内存加密原理到SEV-SNP与宿主机隔离实践

在虚拟化环境中,KVM等方案下客户机内存对宿主机近乎透明,传统磁盘加密、传输加密均无法保护运行时的明文内存,这给云平台安全带来了深层挑战。机密计算技术应运而生,其核心在于利用硬件级内存加密能力,将数据保护边界从进程或文件下沉到物理内存层。AMD SEV基于安全处理器与内存加密引擎,通过独立密钥实现虚拟机内存对宿主机管理者的不可见,在保留虚拟化灵活性的同时,显著增强隔离性。从第一代SEV到SEV-ES再到SEV-SNP,分别补全了内存加密、vCPU寄存器加密、嵌套页表保护与内存完整性校验,形成完整的防窥探、防

weixin_34189116的博客 476

Linux 6.11内核发布:x86加密优化与ARM架构升级

Linux内核作为操作系统核心,通过硬件抽象层管理计算资源。最新6.11版本在x86架构引入AES-GCM加密算法优化,性能提升达162%,显著增强VPN和磁盘加密场景的安全运算能力。ARM平台则重点完善了Allwinner、Rockchip等芯片组的驱动支持,包括IOMMU内存隔离和PCIe控制器修复。这些改进通过硬件加速和电源管理优化,为云计算和物联网设备提供了更高性能与能效比。特别在嵌入式领域,新增的GPIO逻辑分析仪功能为硬件调试提供了轻量级解决方案,配合动态电压频率调节(DVFS)等特性,展现出L

weixin_30709061的博客 440

手把手教你用EPYC 7003搭建SEV-SNP靶场:从BIOS设置到漏洞复现全流程

本文详细指导如何使用AMD EPYC 7003处理器搭建SEV-SNP靶场,涵盖从BIOS配置到漏洞复现的全流程。通过硬件选择、内核编译、虚拟机部署及故障注入实验,深入解析TEE技术中的安全机制与防护措施,为云安全研究提供实用指南。

weixin_30329623的博客 432

AMD SEV内存加密实战:从原理到部署的虚拟化安全指南

在云计算与多租户环境中,虚拟化安全的核心挑战在于如何让Hypervisor无法窥探虚拟机内存。内存加密技术应运而生,通过在硬件层面对物理内存进行加密,将信任边界从平台管理员转移到硬件芯片。SEV(Secure Encrypted Virtual Machine)作为AMD EPYC处理器提供的加密虚拟化方案,正是这一方向的典型实现。它利用内存控制器内置的AES引擎,为每台虚拟机分配独立密钥,使宿主机即使能读取物理内存,也只能看到密文。本文从虚拟化信任模型、内存加密原理、C-bit与PSP固件机制讲起,结合K

weixin_34009794的博客 379

SWIOTLB深度解析:从DMA反弹缓冲到机密计算的关键机制

DMA(直接内存访问)是现代存储、网络与嵌入式设备高效运转的基石,其核心挑战是如何让外设安全、稳定地访问物理内存。当设备因寻址能力不足或内存加密而无法直接访问目标缓冲区时,就需要一种软件机制进行中转——SWIOTLB(软件I/O地址翻译缓冲)正是这样的通用解决方案。它本质上是一块启动时预留的内存池,通过2KiB槽位和环形分配器实现“反弹缓冲”,以额外的内存拷贝换取DMA路径的兼容性与安全性。在SEV/TDX等机密计算场景中,SWIOTLB更是成为设备唯一可安全访问的共享内存区域,其默认容量、性能调优和故障排

weixin_32520095的博客 341

AMD SEV机密计算:虚拟机内存加密原理与KVM/QEMU部署实践

在云计算与多租户场景中,Hypervisor通常拥有最高权限,能够读取虚拟机的内存数据,这一信任假设成为数据安全的主要痛点。基于硬件级别的内存加密技术,AMD SEV(安全加密虚拟化)通过平台安全处理器(PSP)为每个虚拟机分配独立密钥,在CPU层面实现内存的机密性保护,即使宿主机被攻破也无法获得明文数据。从SME到SEV-SNP,该技术逐步补全了完整性保护与启动度量能力,使机密计算从概念走向生产实践。SEV广泛适用于公有云、混合云、多机构联合建模及合规要求严格的场景。文章围绕SEV的工作原理、软硬件要求、

weixin_34279184的博客 400

避坑指南:Livox Mid-360双雷达SLAM配置中,那些官方文档没说的细节(IP设置、话题分离与时间同步)

本文详细解析了Livox Mid-360双雷达SLAM配置中的关键优化点,包括IP设置、话题分离与时间同步等官方文档未提及的细节。通过实战案例和代码示例,帮助开发者解决点云错位、IMU数据混乱等问题,提升SLAM系统的稳定性和精度。特别针对网络架构设计、驱动修改和时间同步机制提供了专业指导。

weixin_29745609的博客 425

离线安装ambari 更换spark版本 集成carbondate文档

1、Linux系统环境配置 1.1 配置IP地址 vim /etc/sysconfig/network-script/ifcfg-eth0 “DEVICE”:网卡对应的设备别名,如ifcfg-eth0第一块网卡; “HWADDR”:网卡物理地址; “BOOTPROTO”:网卡获得ip地址的方式,Static(静态 ip地址)dhcp(通过dhcp协议获取ip)bootip通过boot...

weixin_44742962的博客 3035

Ubuntu 24.04在SEV-SNP环境下RSA性能显著下降的技术分析

Ubuntu 24.04在SEV-SNP环境下RSA性能显著下降的技术分析 背景概述 在云计算安全领域,AMD的SEV-SNP(Secure Encrypted Virtualization with Secure Nested Paging)技术作为第三代安全加密虚拟化方案,通过内存加密和完整性保护为虚拟机提供硬件级安全隔离。然而在Ubuntu 24.04(Noble Numbat)系统中,我们...

gitblog_07888的博客 434

大模型-高通平台性能测试示例-2

在QNN中,可以使用(genis-t2t-run)和这两个工具来进行推理的性能分析。支持在QNX操作系统或Android操作系统上进行性能分析。:提供基本的性能数据,如运行时间、资源消耗等。:提供更详细的性能数据,可能包括各个操作的执行时间、资源使用情况等。:是指在性能分析的同时进行代码质量检查,以发现潜在的问题。:是指跟踪和分析神经网络中各个操作的性能,以优化网络结构或参数。

点滴的岁月 1491

高危内核漏洞 CVE‑2026‑63940 解析:KVM‑SEV 端口 IO 缺陷风险与安全防护

近期 Linux 内核对外披露临界级安全漏洞 CVE‑2026‑63940,该漏洞 CVSS 评分高达 9.3,缺陷位于 KVM 虚拟化模块下 SEV 安全加密虚拟化子系统。漏洞由长度为 0 的端口 I/O 请求引发,若被成功利用,攻击者可突破虚拟机隔离边界,造成宿主机内存信息泄露、权限提升或宿主机崩溃,对部署 AMD‑SEV 加密虚拟机的云计算、虚拟化平台带来不容忽视的安全隐患。

望获实时Linux系统 377

手把手教你构建轻量级CLIP模型:从理论到实践

本文手把手教你从零构建一个轻量级CLIP模型,深入解析其核心原理——对比学习,并提供完整的代码实践。通过精简的模型架构、数据准备和训练循环实现,帮助读者彻底理解多模态模型如何让图像与文本在共享空间中对齐,为学习更复杂的AI模型打下坚实基础。

weixin_29100927的博客 324

ADSP-21565的SigmaStudio图形化编程实战:从FW工程改造到音频通道打通

本文详细介绍了如何将ADSP-21569的SigmaStudio图形化编程固件工程改造,以适配ADSP-21565的纯片内SRAM内存架构。通过修改内存映射和链接文件,打通了音频输出通道,并成功利用SigmaStudio进行图形化编程,实现了从白噪声生成到音频输出的完整验证流程。

weixin_29169505的博客 380

高危内核漏洞 CVE‑2026‑63938 解析:KVM‑SEV PSC 请求校验缺失风险与安全防护

近期 Linux 内核披露临界级安全漏洞 CVE‑2026‑63938,CVSS 评分为 9.3,该缺陷存在于 KVM 虚拟化模块的 SEV 安全加密虚拟化子系统。虚拟机内部攻击者可利用页面状态变更(PSC)请求缺少边界校验的缺陷,触发内存越界访问,存在虚拟机逃逸风险,可能造成宿主机信息泄露、权限提升或系统崩溃,对搭载 AMD SEV 加密虚拟化能力的云平台、虚拟化节点带来安全挑战。

望获实时Linux系统 190

C#教程

C# 教程 C# 是一个简单的、现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的。 本教程将告诉您基础的 C# 编程,同时将向您讲解 C# 编程语言相关的各种先进理念。 现在开始学习 C#! C# 在线工具 谁适合阅读本教程? 本教程有助于初学者理解基础的 C# 编程。在学习完本教程后,您将到达一个中级的 C# 编程水平。

zm1_1zm 1万+

Linux阅码场 - Linux内核月报(2020年11月)

关于Linux内核月报Linux阅码场Linux阅码场内核月报栏目,是汇总当月Linux内核社区最重要的一线开发动态,方便读者们更容易跟踪Linux内核的最前沿发展动向。限于篇幅,只会对...

宋宝华 1482

软件测试面试题之易错题

(1)白盒测试:又称功能功能 测试、数据驱动测试和行为测试,是一种从用户观点出发的测试,被测程序为黑盒子, 通过测试来检测每个功能是否能够正常使用。(2)黑盒测试:又称结构测试和逻辑驱动 测试,是知道产品内部工作过程,通过测试来检测产品内部动作是否按照规格说明书 的规定去正常运行。(1)、测试需求分析;(2)动态白盒测试:需要对各个模块功能、模块间的接口、局部数据结构、主要执行路径、 错误处理等方面的测试。(2) 集成测试所测试的对象是模块间的接口,其目的是在找出在模块接口上面,包括整体体系结构上的问题;

m0_37449634的博客 678

sap资产post记录查询时候 报错 如图

SAP资产过账查询报错AA653解决方案摘要 错误原因:系统无法计算会计年度期间的最后一天,导致资产折旧/过账失败。常见原因包括:1)未创建2025年期间版本;2)期间日期映射不完整;3)依赖日历但未生成2025年日历。 解决方法: 通过OB37维护2025年12/13个完整期间 补充缺失期间或修正结束日期 使用SCAL生成2025年工厂日历 验证步骤: 检查T009R表2025年记录完整性 测试AFAB折旧运行 重新查询资产过账 提示:建议财务团队统一维护跨年度期间数据,并在测试系统验证变更。

金牌架构师 834

高危内核漏洞 CVE‑2026‑63939 解析:KVM‑SEV 缓冲区溢出风险与安全防护

近日 Linux 内核披露临界级安全漏洞 CVE‑2026‑63939,该漏洞 CVSS 评分为 9.3,缺陷位于 KVM 虚拟化模块的 SEV 安全加密虚拟化子系统。攻击者可在虚拟机内部发起利用,触发缓冲区溢出,有机会篡改宿主机内核关键数据结构,实现信息泄露、权限提升或宿主机崩溃,对部署 AMD SEV 加密虚拟机的虚拟化与云平台构成较高安全威胁。

望获实时Linux系统 164

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

KVM SEV 三连高危漏洞解析:机密计算虚拟机逃逸风险处置方案

【摘要】Linux内核披露三组高危KVM虚拟化漏洞(CVE-2026-63938/63939/63940,CVSS 9.3),均涉及AMD SEV-SNP机密计算的边界校验缺陷,可致虚拟机逃逸攻击。漏洞源于共享缓冲区长度校验缺失,允许恶意客户机越界读写宿主机内存,威胁工业云、涉密计算平台的数据隔离性。短期建议禁用SEV功能,长期需升级修复内核并建立多层防护:关闭非必要模块、强化内存保护、实施补丁常态化管理。事件暴露硬件加密需结合软件安全运维,构建完整的机密计算防御体系。

望获实时Linux系统 117

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

保姆级教程:在Ubuntu 22.04上为KVM虚拟机开启AMD SEV加密(含密钥管理实战)

本文提供在Ubuntu 22.04上为KVM虚拟机开启AMD SEV加密的完整教程,涵盖硬件检查、BIOS配置、内核优化、密钥管理及虚拟机部署等关键步骤。通过实战演示,帮助用户实现硬件级内存加密,提升虚拟化环境的数据安全性,特别适合企业级云计算应用。

weixin_31648507的博客 260

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

linux内核第一个页表

linux内核第一个页表

xiaozhi 295

LiteBox能做什么?5大主流沙箱场景清单(含OP-TEE与SEV SNP)

**LiteBox 是一个以安全为核心的库操作系统(Library OS)沙箱**,它能大幅缩减程序与宿主系统之间的接口,从根源上压缩攻击面。下面这份清单帮你快速了解:这个微软开源的 Rust 项目到底能在哪些场景里派上用场。 ## LiteBox 的核心思路:North 接口 + South 平台 LiteBox 的设计非常简洁:向上提供一套功能丰富的、类 Unix(灵感来自 nix/rus

gitblog_00345的博客 316
上一篇: linux内核 kvm_mmu_page_fault 分析
下一篇: kdump分配内存过程分析
inquisiter
博客等级 码龄10年 374粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值