Leitura DP: Arquitetura e Programação do Processador Kunpeng (14) ACPI e Ajuste Específico da Arquitetura de Software

kernel do sistema operacional

ACPI (Advanced Configuration and Power Interface)
é um padrão de gerenciamento de energia desenvolvido em conjunto pela Intel, Microsoft, HP, Sony e outras empresas. Ele fornece uma interface comum de gerenciamento de energia para gerenciar aspectos do estado de energia, desempenho e configuração de um sistema de computador.

Em sistemas de computador, a ACPI é responsável por lidar com eventos de gerenciamento de energia , como inicialização, desligamento, hibernação e ativação do sistema. Ele também fornece controle sobre dispositivos de hardware, dispositivos de resfriamento, baterias e outros dispositivos.

ACPI desempenha um papel importante em sistemas de computador para melhorar a eficiência energética do sistema e a vida útil da bateria, ao mesmo tempo que fornece melhor desempenho e estabilidade do sistema.
Diagrama ARM da ACPI
A Árvore de Dispositivos da plataforma ARM64 é definida no arch/arm64/boot/dts/diretório do código-fonte do Linux. Árvore de dispositivos é uma estrutura de dados usada para descrever o hardware do sistema e é usada para inicializar o hardware durante o processo de inicialização.

A seguir está um exemplo de uma árvore de dispositivos simples da plataforma ARM64, que é uma árvore de dispositivos virtuais, apenas para entender os conceitos básicos. Na árvore de dispositivos real, haverá propriedades e configurações mais detalhadas.
Desculpe, não posso lidar diretamente com o código C. Mas posso ajudá-lo a entender a estrutura básica de uma árvore de dispositivos da plataforma ARM64 (Device Tree) e posso dar um exemplo.


git clone https://github.com/torvalds/linux.git
cd linux
cd scripts/dtc/

make
sudo make install PREFIX=/usr/local


// SPDX-License-Identifier: GPL-2.0
/*
 * Example Device Tree for ARM64 SoC
 *
 * This is a simple example showing the basic structure of a Device Tree for an ARM64 platform.
 */

/dts-v1/;

/ {
    
    
    compatible = "example,arm64";
    model = "Example ARM64 SoC";

    memory@80000000 {
    
    
        device_type = "memory";
        reg = <0x0 0x80000000 0x0 0x80000000>; // 2 GiB of memory starting from 0x80000000
    };

    chosen {
    
    
        bootargs = "console=ttyAMA0,115200";
    };

    uart@9000000 {
    
    
        compatible = "example,uart";
        reg = <0x0 0x9000000 0x0 0x1000>;
        interrupt-parent = <&gic>;
        interrupts = <0 13 4>; // interrupt number 13, active high, level triggered
    };

    gic: interrupt-controller {
    
    
        compatible = "example,gic-v3";
        interrupt-controller;
        #interrupt-cells = <3>;
        interrupt-parent = <&gic_cpuif>;
    };

    gic_cpuif: interrupt-controller@5000 {
    
    
        compatible = "example,gic-v3-cpuif";
        reg = <0x0 0x5000 0x0 0x1000>;
        interrupts = <0 8 1>; // interrupt number 8, active high, edge triggered
        interrupt-parent = <&gic>;
    };
};

Portabilidade de software Kunpeng

Arquitetura de software de alto nível

Processo de migração de software Kunpeng

O processo de migração do software Kunpeng inclui as seguintes etapas:

  1. Prepare o JDK: Instale a versão ARM do JDK.
  2. Configurar variáveis ​​de ambiente: configure variáveis ​​de ambiente, como o caminho JDK.
  3. Compilação: o código-fonte Java gera bytecode.
  4. Teste: inicie o programa Java, função de depuração.

O texto acima é o processo completo de transplante de software Kunpeng

Seleção de ferramenta de compilação

A escolha da ferramenta de compilação depende principalmente da linguagem de programação e do ambiente de desenvolvimento que você usa. Aqui estão algumas ferramentas de compilação comuns:

  1. Microsoft Visual Studio: Este é um conjunto completo de ferramentas de desenvolvimento para linguagens de programação como C/C++/C# para todas as plataformas suportadas pela Microsoft. Inclui ferramentas UML, ferramentas de controle de código, ambiente de desenvolvimento integrado (IDE), etc. É um software de escrita e desenvolvimento de código muito prático e poderoso.
  2. GCC: GNU Compiler Collection (GCC) é um software para compilação de linguagens de programação, que suporta C, C++, Objective-C, Fortran, Ada e outras linguagens.
  3. Clang: Clang é um compilador C/C++/Objective-C baseado em LLVM, usado principalmente para otimizar a eficiência de compilação e a qualidade do código.
  4. Java Development Kit (JDK): Se você estiver desenvolvendo aplicativos Java, precisará do JDK, que contém o compilador Java (Javac) e outras ferramentas.
  5. Intérprete e compilador Python: Python é uma linguagem interpretada, portanto não requer um compilador. No entanto, Python possui vários interpretadores e compiladores, como CPython, Jython, IronPython, etc.
    Isso é apenas parte disso; na verdade, existem muitas outras ferramentas de compilação para você escolher. Você deve escolher a ferramenta de compilação mais adequada a você de acordo com suas necessidades e hábitos específicos.

Caso de migração de parâmetro de compilação

Durante o processo de compilação, alguns parâmetros específicos de compilação podem afetar o resultado e a adaptabilidade da compilação. A seguir estão alguns exemplos de parâmetros de compilação que podem desempenhar um papel fundamental no processo de migração:

1. -march 和 -mtune:这两个参数用于指定目标处理器架构。例如,-march=native 将使编译器优化为运行在本地硬件上,而 -march=x86_64 将优化为运行在64位x86处理器上。
2. -fPIC (Position-Independent Code):该参数用于生成位置无关的代码,这在实现共享库时非常重要。
3. -I:该参数用于指定头文件的搜索路径。在移植过程中,可能需要修改此参数以适应新的环境。
4. -L:该参数用于指定库文件的搜索路径。同样,在移植过程中,可能需要修改此参数。
5. -l:该参数用于指定要链接的库。这可能涉及到链接到不同的库文件,以适应新的环境。
6. -D:该参数用于定义宏。在移植过程中,可能需要定义新的宏以适应新的环境。

Observe que os itens acima são apenas alguns exemplos de parâmetros de compilação comuns; na verdade, existem muitos outros parâmetros de compilação que podem ser usados ​​no processo de migração. A seleção de parâmetros específicos dependerá de suas necessidades e das especificidades da plataforma de destino.

Caso de modificação do código-fonte

O caso de modificação do código-fonte visa principalmente modificar e otimizar o código-fonte do programa para necessidades ou problemas específicos. A seguir está um caso simples de modificação do código-fonte:

Suponha que temos um programa em linguagem C, que possui uma função chamada calculate_average, que recebe como entrada um array inteiro e o comprimento do array, calcula o valor médio do array e retorna o resultado.

double calculate_average(int* arr, int length) {
    
    
    double sum = 0.0;
    for (int i = 0; i < length; i++) {
    
    
        sum += arr[i];
    }
    return sum / length;
}

Agora queremos modificar esta função para que ela ignore quaisquer números negativos na matriz e simplesmente ignore o cálculo. Podemos adicionar uma simples declaração de julgamento para atingir esta função.

double calculate_average(int* arr, int length) {
    
    
    double sum = 0.0;
    for (int i = 0; i < length; i++) {
    
    
        if (arr[i] >= 0) {
    
    
            sum += arr[i];
        }
    }
    return sum / length;
}

Com esta modificação, a função agora contará apenas os números não negativos do array e retornará sua média. Isso pode ser aplicado a qualquer array contendo números negativos para ignorá-los e obter resultados mais precisos.

Observe que este é apenas um exemplo simples, a modificação real do código-fonte pode ser mais complicada e envolver mais detalhes. Antes de modificar o código-fonte, é recomendável realizar testes e backups suficientes (executando em uma máquina virtual sem nenhum problema) para garantir que a modificação não introduzirá erros ou destruirá a função original.

Ferramenta de verificação de análise Kunpeng Dependency Advisor

Dependency Advisor é uma ferramenta que pode simplificar o processo de migração de aplicativos de clientes para servidores Kunpeng. Ele é instalado principalmente em servidores X86 e é usado para analisar portabilidade e esforço de portabilidade. Esta ferramenta suporta a verificação das bibliotecas dependentes de SO contidas no pacote de recursos de software do usuário (arquivos RPM, JAR, TAR, zip, gzip) e a avaliação da portabilidade das bibliotecas dependentes de SO; a verificação das bibliotecas dependentes de SO no caminho de instalação do software do usuário especificado , E avaliar a portabilidade da biblioteca dependente de SO; verificar o arquivo do projeto de construção de software C/C++ do software do usuário e avaliar a portabilidade do arquivo; e verificar o código-fonte C/C++ do software do usuário e avaliar a portabilidade da fonte do software arquivo.

Além disso, o Dependency Advisor analisa e gera automaticamente relatórios de orientação, fornecendo relatórios de migração de software e avaliações de esforço de migração. Ele também suporta dois modos de trabalho de linha de comando e Web.

Consultor de portabilidade da ferramenta de migração de código Kunpeng

Porting Advisor é uma ferramenta de migração de código que pode ajudar os desenvolvedores a migrar aplicativos da plataforma x86 para a plataforma Kunpeng. Os recursos específicos incluem:

  1. Analisar portabilidade: O Porting Advisor pode analisar o código-fonte do usuário e as dependências relacionadas para determinar se ele pode ser migrado para a plataforma Kunpeng.
  2. Análise automática: o Porting Advisor pode analisar automaticamente o conteúdo do código que precisa ser modificado e dar sugestões de modificação.
  3. Fornecer orientação: o Porting Advisor pode ajudar os desenvolvedores a resolver problemas encontrados no processo de migração e fornecer soluções correspondentes.

Usar o Porting Advisor para migração de código pode reduzir a carga de trabalho da investigação manual e melhorar a eficiência geral da migração.

分析可迁移性
自动分析
提供指导

Ajuste de desempenho do software Kunpeng

Processo de ajuste de desempenho do software Kunpeng

O processo de ajuste de desempenho do software Kunpeng inclui as seguintes etapas:

  1. Estabeleça uma linha de base: antes de iniciar a otimização ou o monitoramento, primeiro devem ser estabelecidos dados de linha de base e uma meta de otimização. Isso inclui configuração de hardware, rede, modelos de teste e dados operacionais do sistema (CPU/memória/IO/rendimento de rede/atraso de resposta, etc.). Precisamos fazer uma avaliação e monitoramento abrangente do sistema para analisar melhor os gargalos de desempenho do sistema e as alterações no desempenho do sistema após a implementação de medidas de otimização. A meta de otimização é a meta de desempenho que se espera que o sistema atinja com base na arquitetura atual de hardware e software.
  2. Teste de estresse e gargalos de monitoramento: Use cargas de trabalho de pico ou ferramentas profissionais de teste de estresse para testar o sistema. Use algumas ferramentas de monitoramento de desempenho para observar o status do sistema. Durante os testes de estresse, recomenda-se registrar detalhadamente o status operacional do sistema e dos programas. Registros históricos precisos serão mais úteis na análise de gargalos e na confirmação se as medidas de otimização são eficazes.
  3. Análise de desempenho: Com base nos resultados do teste de estresse, realize uma análise de desempenho para descobrir gargalos de desempenho. Isso inclui encontrar gargalos em CPU, memória, E/S, rede e muito mais.
  4. Otimização: De acordo com os resultados da análise de desempenho, tome as medidas de otimização correspondentes. O método exato de otimização pode variar de acordo com o sistema e o aplicativo.
  5. Novo teste: Após a implementação de medidas de otimização, é necessário realizar novamente testes de estresse e monitoramento de desempenho para confirmar o efeito de otimização.
  6. Iteração: O ajuste de desempenho é um processo iterativo que precisa ser continuado para otimizar o desempenho do sistema.

O texto acima é o processo geral de ajuste de desempenho do software Kunpeng, e a implementação específica pode precisar ser ajustada de acordo com a situação específica.

循环
建立基准
压力测试与监视瓶颈
性能分析
优化
再测试
迭代

Ajuste de desempenho do subsistema de CPU e memória

Para ajuste de desempenho dos subsistemas de CPU e memória, as seguintes medidas podem ser tomadas:

  1. Aspecto da CPU:

    • Otimização multi-thread: uso razoável de multi-threads, divisão de tarefas de computação em vários threads para execução paralela e aproveitamento total do desempenho de CPUs multi-core.
    • Reduza a troca de contexto: reduza a troca frequente entre threads e evite sobrecarga causada pela troca de contexto.
    • Otimização de cache: Faça uso total do cache da CPU para evitar perda de desempenho causada por falhas de cache. Por exemplo, usar princípios de localidade para otimizar padrões de acesso a dados e reduzir perdas de cache.
  2. Em termos de memória:

    • Otimização de alocação de memória: Defina razoavelmente a estratégia de alocação de memória para evitar alocação e liberação freqüentes de memória. Tecnologias como pools de objetos e pools de memória podem ser usadas para otimizar o gerenciamento de memória.
    • Otimização do modo de acesso à memória: faça pleno uso do princípio da localidade para otimizar o modo de acesso à memória. Por exemplo, reduza a aleatoriedade do acesso à memória através de acesso contínuo, acesso alinhado, etc.
    • Compressão e fragmentação de memória: Para estruturas de dados ou objetos com grande uso de memória, a compactação ou fragmentação de memória pode ser considerada para reduzir o uso de memória e melhorar a eficiência do acesso.
CPU方面优化
多线程优化
减少上下文切换
缓存优化
内存方面优化
内存分配优化
内存访问模式优化
内存压缩与分片

Além disso, o subsistema de CPU e memória pode ser monitorado e analisado por meio de ferramentas de monitoramento e análise de desempenho para encontrar gargalos de desempenho e adotar estratégias de otimização correspondentes. Diferentes cenários e requisitos de aplicação podem exigir diferentes métodos de otimização, por isso é recomendado otimizar de acordo com a situação específica e realizar testes e avaliações de desempenho para verificar o efeito da otimização.

Ajuste de desempenho do subsistema de rede

Para ajustar o desempenho do subsistema de rede, as seguintes medidas podem ser tomadas:

  1. Reduza a latência da rede:

    • Use equipamentos de rede de alto desempenho: escolha switches de rede, roteadores e outros equipamentos de rede de alto desempenho para reduzir o atraso de transmissão de pacotes de dados.
    • Use protocolos de rede mais rápidos: por exemplo, adote protocolos de transporte mais rápidos (como TCP Fast Open, QUIC) para reduzir o atraso do handshake e o tempo de estabelecimento da conexão.
    • Otimizando a topologia da rede: planeje racionalmente a topologia da rede, reduza a distância de transmissão dos pacotes de dados e reduza o atraso da rede.
  2. Aumente a largura de banda da rede:

    • Balanceamento de carga de rede: Ao configurar equipamento ou software de balanceamento de carga, o tráfego de rede é distribuído uniformemente para vários servidores para melhorar a largura de banda geral da rede.
    • Compressão e aceleração de dados: use tecnologia de compressão e aceleração de dados para reduzir a quantidade de transmissão de dados, aumentando assim a largura de banda disponível.
    • Aumente a capacidade de largura de banda: atualize o equipamento de rede para aumentar a capacidade de largura de banda para atender a altas solicitações de rede simultâneas.
  3. Otimize protocolos e políticas de rede:

    • Ajuste de parâmetros TCP/IP: De acordo com cenários de aplicação específicos, ajuste os parâmetros do protocolo TCP/IP, como tamanho da janela, algoritmo de controle de congestionamento, etc., para melhorar a eficiência de transmissão da rede.
    • Gerenciamento de prioridade de pacotes de dados: Ao configurar a função QoS (Qualidade de Serviço) do equipamento de rede, diferentes tipos de pacotes de dados são priorizados para garantir a transmissão oportuna de dados importantes.
  4. Gerenciamento de cache e buffer:

    • Aceleração CDN: Use a Rede de Distribuição de Conteúdo (CDN) para armazenar recursos estáticos em cache e acelerar a transmissão de dados.
    • Aplicação da tecnologia de cache: de acordo com as necessidades reais, use racionalmente a tecnologia de cache para armazenar dados populares e consultar os resultados na memória para acelerar o acesso aos dados.
    • Otimização do tamanho do buffer: otimize o tamanho do buffer dos dispositivos de rede para evitar problemas de desempenho causados ​​por buffers muito grandes ou muito pequenos.

此外,还可以通过监控和分析网络流量、延迟等指标,找出网络性能瓶颈,并进行相应的调优策略。综合考虑应用程序的特点、网络环境以及业务需求,选择合适的调优方案,并进行性能测试和评估,以验证优化效果。

CPU方面优化
内存方面优化
CPU多线程优化
减少上下文切换
缓存优化
内存分配优化
内存访问模式优化
内存压缩与分片

磁盘I/O子系统性能调优

对于磁盘I/O子系统的性能调优,可以采取以下措施:

优化磁盘I/O性能的常见措施包括:

  1. 使用RAID技术:RAID技术可以提供更高的磁盘读写性能和冗余容错能力。

  2. 块大小优化:根据应用程序的访问模式和数据块大小,调整磁盘块的大小以提高磁盘I/O性能。

  3. 操作系统参数调优:操作系统参数调整相关参数来改善磁盘I/O性能。

  4. 文件系统选择与优化:选择适合特定应用场景的文件系统,并进行相应的优化。

  5. I/O缓存与缓冲区管理:I/O缓存和缓冲区管理技术来减少磁盘I/O操作次数。

  6. 应用程序优化:应用程序优化,减少不必要的磁盘I/O操作。

  7. 磁盘性能监控与故障诊断:磁盘性能监控磁盘的性能指标,及时发现潜在问题,并采取相应的故障诊断和修复措施。

这些措施综合起来可以提升磁盘I/O子系统的性能和可靠性。但需要根据具体情况进行调优,并进行性能测试和评估,以验证优化效果。

应用程序性能调优

对于应用程序的性能调优,可以采取以下措施:

  1. 代码优化:优化算法和数据结构和提高代码执行效率。
  2. 数据库优化:数据库索引优化和提高数据检索操作。
  3. 缓存技术应用:使用缓存技术和提高读取速度。
  4. 网络通信优化:减少网络请求次数和提高速度。
  5. 性能监控与调试:使用性能监控工具和评估系统的性能表现。
  1. 代码优化:

    • 优化算法和数据结构:选择高效的算法和数据结构,减少不必要的计算和内存消耗,提高代码执行效率。
    • 减少资源占用:及时释放不再使用的资源,避免资源泄露。合理使用内存、文件句柄、数据库连接等资源,避免资源瓶颈。
    • 并发编程优化:合理使用多线程、多进程或异步编程模型,利用多核处理器和异步操作提高并发性能。
  2. 数据库优化:

    • 数据库索引优化:分析数据库查询的频率和模式,创建适当的索引来加速数据检索操作。
    • 数据库连接管理:合理维护和管理数据库连接,减少连接的建立和关闭开销。
    • 批量操作和事务管理:将多个数据库操作批量提交或使用事务进行管理,减少单次数据库交互的次数,提高效率和数据一致性。
  3. 缓存技术应用:

    • 使用缓存技术:将频繁读取的数据缓存在内存中,减少对底层存储系统(如数据库)的访问,提高读取速度。
    • 合理设置缓存策略:根据数据的更新频率和重要性,设置合适的缓存策略,如缓存过期策略、LRU(最近最少使用)策略等。
  4. 网络通信优化:

    • 减少网络请求次数:合并多个网络请求、采用批量操作,减少网络开销和延迟。
    • 压缩和加速数据传输:使用数据压缩和加速技术,减少网络传输数据量,提高速度。
  5. 性能监控与调试:

    • 使用性能监控工具:通过监控工具来获取应用程序的性能指标,如CPU使用率、内存占用、数据库查询时间等,找出性能瓶颈和潜在问题。
    • 进行性能测试:模拟实际使用场景,进行负载测试和性能测试,评估系统的性能表现,及时发现和解决性能问题。

除了以上措施,还可以根据具体应用场景和需求进行针对性的优化。关注应用程序的瓶颈和低效点,不断进行测试和改进,以提高应用程序的性能和响应速度。同时,注意平衡性能调优和可维护性之间的关系,避免过度优化导致代码难以理解和维护。

增加硬件资源
+增加CPU、内存和磁盘等硬件资源()
+使用更快的存储设备或网络传输设备()
调整软件参数
+调整操作系统或数据库的参数()
+调整Web服务器参数()
优化软件架构和设计
+应用合适的软件设计模式和开发框架()
+优化软件架构()
资源的合理利用
+减少访问磁盘次数()
+使用缓存技术对数据进行缓存()
进行性能测试和优化
+负载测试和性能测试()
+评估不同参数组合或优化技术()
系统监控和调试
+实时监控系统性能和资源利用率()
+收集日志信息()

基础软件性能调优

基础软件(如操作系统、数据库、Web服务器等)的性能调优,可以采取以下措施:

  1. 增加硬件资源:

    • 增加CPU、内存和磁盘等硬件资源,以提高基础软件的执行速度和并发处理能力。
    • 使用更快的存储设备或网络传输设备,以提高数据的访问速度和传输效率。
  2. 调整软件参数:

    • 根据应用的工作负载和硬件配置,调整操作系统或数据库的参数,以达到最优性能。
    • 对于Web服务器,可以调整连接池大小、缓存策略、请求过滤等参数,以提高并发处理和响应速度。
  3. 优化软件架构和设计:

    • 应用合适的软件设计模式和开发框架,以提高代码复用性和可维护性。
    • 良好的软件架构可以提高基础软件的并发处理能力和可扩展性。
  4. 资源的合理利用:

    • 对于数据库系统,可以通过使用数据库缓存、合理索引等手段,减少访问磁盘的次数,提高数据访问速度。
    • 对于Web服务器,可以使用缓存技术对经常访问的数据进行缓存,降低数据库访问的频率。
  5. 进行性能测试和优化:

    • 对基础软件进行负载测试和性能测试,找出瓶颈和性能瓶颈。
    • 评估不同参数组合或优化技术的性能效果,选择最优方案。
  6. 系统监控和调试:

    • 通过系统监控工具实时监控系统的性能、资源利用率等指标,在系统出现异常时及时进行调试和修复。
    • 收集日志信息,及时发现潜在问题,并对系统进行诊断。

除了以上措施,还可以根据不同的基础软件进行针对性的调优。例如,对于数据库系统,还可以使用分区、分片等技术,提高数据处理的并行性和可扩展性。对于Web服务器,还可以使用负载均衡技术,提高并发处理能力和可用性。总之,基础软件的性能调优需要多方面的考虑和综合处理。
Mecanismo de otimização de leitura e gravação de aplicativos

鲲鹏性能优化工具 Tuning Kit

Tuning Kit 是一款针对鲲鹏计算平台的性能分析和优化工具,能收集处理器硬件、操作系统、进程/线程、函数等各层次的性能数据,分析出系统性能指标,定位到系统瓶颈点及热点函数。

Tuning Kit 支持以下功能特性:

  1. 系统配置全景分析:采集整个系统的软硬件配置信息,分析并针对不合理项提供优化建议。
  2. Análise panorâmica do desempenho do sistema: aprenda com o método USE (utilização, saturação, erros) da indústria, colete as condições operacionais da CPU do sistema, memória, armazenamento IO, rede IO e outros recursos, obtenha sua taxa de utilização, saturação, erros e outros indicadores , identifique o gargalo do sistema.
  3. Para alguns itens de índice do sistema, são fornecidas sugestões de otimização com base nos valores de benchmark existentes e na experiência de otimização.
  4. Análise de agendamento de recursos do sistema: com base em eventos de agendamento da CPU, analise o status de execução dos núcleos da CPU, processos/threads em cada ponto de tempo, alternância de processos/threads e forneça sugestões de otimização correspondentes.

O Tuning Kit pode ajudar os usuários a entender melhor o desempenho do sistema, identificar e resolver gargalos do sistema e melhorar a eficiência geral do sistema.

系统配置全景分析
系统资源调度分析
系统性能全景分析
针对部分系统指标项优化建议

Kit Kunpeng Boost
Comunidade de desenvolvedores Kunpeng: https://www.hikunpeng.com/developer/boostkit
kunpengBoostKit 23.0
Módulo de migração de código
Endereço do documento oficial Kunpeng
https://www.hikunpeng.com/document/detail/zh/kunpengdevps/porting/qs/qs-pa-kunpengdevps. htmlKunpeng
Xiaozhi
https://www.hikunpeng.com/zh/airobot

Referências:
[1] GB/T 7714: Dai Zhitao, Liu Jianpei. Arquitetura e programação do processador Kunpeng: Huawei Intelligent Computing Technology Series [M]. Pequim: Tsinghua University Press, 2020. [2] https: //www.hikunpeng
. com/
[3] Qi Zhengwei, Guan Haibing. Virtualização de sistema simples: princípios e prática [M] Pequim: Tsinghua University Press, 2021.

Acho que você gosta

Origin blog.csdn.net/m0_74037814/article/details/132564623
Recomendado
Clasificación