Índice
Os componentes básicos de um sistema operacional moderno de código aberto:
Função | endereço do link |
---|---|
Gerenciamento de arquivos e gerenciamento de dispositivos | Sistema de arquivos virtual (sistema de arquivos sem armazenamento persistente), tomando proc e sysfs como exemplos |
Gerenciamento de memória | Princípios de gerenciamento de memória de sistemas operacionais modernos: tomando Linux2.6.xx como exemplo |
Princípio de inicialização do sistema | Análise aprofundada do código-fonte da arquitetura Arm Linux 2.6.4.30 - com base na "análise de código-fonte do kernel Linux ARM" |
espaço de endereço virtual | O que é um espaço de endereço virtual? Explicado de uma perspectiva arquitetônica |
link dinâmico | Um longo artigo conduz você por todo o processo de vinculação dinâmica do Linux |
No artigo anterior: Manual do desenvolvedor de software das arquiteturas Intel® 64 e IA-32, você pode ver Intel
que a tecnologia de virtualização ainda é muito importante, portanto, este artigo usa a plataforma Linux para resumir a tecnologia de virtualização.
A diferença entre tecnologia de virtualização e tecnologia de contêiner: uma breve discussão sobre os princípios da tecnologia de virtualização de kernel KVM e da tecnologia de contêiner Docker?
Próximo artigo: Princípios e soluções de sistemas multi-core
A virtualização é dividida principalmente nas seguintes partes: CPU
virtualização, virtualização de memória, virtualização de interrupção e virtualização de dispositivos. Entre elas, a virtualização de memória e a virtualização de interrupção pertencem a tecnologias de virtualização de software, enquanto a CPU
virtualização e a virtualização de dispositivos pertencem a tecnologias de virtualização de hardware, especialmente a virtualização de dispositivos, que não é muito diferente dos dispositivos reais.
Tecnologia VT-d
Virtualização de CPU
Combinado com
Intel
a tecnologia de virtualização do manual
Modelo de armadilha e simulação ( Trap and Emulate
) : Tanto o programa do usuário quanto o kernel da máquina virtual são executados no modo de usuário (geralmente, o programa do usuário é executado no modo de usuário e o kernel é executado no modo de sistema). Isso é chamado de compactação de nível de privilégio (). Neste caso Ring Compression
Neste modo, o tratamento de nível não privilegiado da máquina virtual é executado diretamente no processador. Quando uma instrução de nível privilegiado é executada, a exceção do processador será acionada e presa no VMM, e a máquina virtual proxy será VMM
concluída o acesso aos recursos do sistema.
Posteriormente, Intel
foram desenvolvidas tecnologias VT
para suportar a virtualização, como CPU
foi adicionado VMX
, viz Virtual-Machine Extension
. CPU
Dois modos de operação são fornecidos neste momento : VMX Root Mode
e VMX non-Root Mode
, cada um deles é suportado ring0-ring3
. VMM
A execução em VMX Root Mode
, exceto suporte VMX
, VMX Root Mode
não é essencialmente diferente do modo normal. VM
Correndo VMX non-Root Mode
, Guest kernel
correndo . VMX non-Root Mode
_ring0
VT
É tecnicamente uma função do processador, então não se preocupe com os detalhes.
Você VMX Root Mode
pode mudar para ele VMM
executando CPU
as instruções de virtualização fornecidas . Como esse processo é equivalente a entrar , muitas vezes também é chamado . Quando a execução interna de instruções sensíveis à força, como certas operações, irá desencadear uma ação presa, esse processo é equivalente a exit , por isso é chamado . Em seguida, simule a operação.VMLaunch
VMX non-Root Mode
Guest
VM entry
Guest
I/O
CPU
VM
VM exit
VMM
Guest
Assim como uma pessoa CPU
pode executar diversas tarefas em tempo compartilhado, cada personagem tem seu próprio contexto, e o contexto é alterado quando agendado pelo agendador, permitindo assim que a mesma tarefa execute diversas tarefas ao mesmo tempo CPU
. cenário, o mesmo personagem físico CPU
pode ser executado de maneira compartilhada, portanto Host
, Guest
diferentes modos também precisam salvar seu próprio contexto. Cada um Guest
tem sua própria instância e será executado de maneira diferente quando carregado VMCS
fisicamente .CPU
VMCS
Guest
Ao executar Guest
um modo, Guest
as chamadas de sistema do espaço do usuário são interceptadas diretamente no Guest
espaço do kernel do modo, em vez de serem interceptadas no Host
espaço do kernel do modo.
Para interrupções externas, porque são necessários VMM
recursos do sistema de controle , quando a interrupção externa é recebida Guest
no modo CPU
. Em seguida, o modo é acionado para sair CPU
do modo e a interrupção externa é processada pelo kernel.Depois que a interrupção é processada, o modo é reentrado. (Não precisa ser gerado neste momento )Guest
Host
Host
Guest
VM exit
Para VCPU
, VMM
use um thread para representar esta VCPU
entidade
KVM
é um módulo do kernel.
Preso e simulado : Ao Guest
acessar os recursos do sistema, você precisa sair Host
do modo e Host
o gerenciador unificado concluirá o acesso aos recursos em seu nome. Quando uma máquina virtual acessa I/O
, ela primeiro precisa ser interceptada Host
. Depois que VMM
o disco virtual na máquina virtual receber I/O
a solicitação, se a imagem de disco da máquina virtual estiver armazenada em um arquivo local, o arquivo local será lido e gravado em seu nome . Ao acessar I/O
o espaço de endereçamento mapeado pela memória do dispositivo, uma exceção de página será acionada. Porém, esses endereços não correspondem à memória, mas sim ao I/O
espaço do dispositivo simulado. Portanto, é necessário KVM
intervir e chamar o dispositivo simulado correspondente em processamento.I/O
Para armadilhas de gatilho passivas, você só Guest
precisa CPU
abrir mão de recursos Host
.
Os métodos de acesso periférico comumente usados incluem
PIO
eMMIO
virtualização de memória
A essência é criar uma tabela de páginas sombra ou EPT
outra tabela de páginas para mapear o relacionamento com a memória física.
Interrompa a virtualização
Para chips de interrupção virtual de software, o sinal de interrupção é apenas uma variável. Do ponto de vista da simulação de software, é para definir o valor da variável. Se KVM
for constatado que o chip de interrupção virtual possui uma solicitação de interrupção, as informações da interrupção são gravadas no campo VMCS
do meio . No momento da mudança para o modo, este campo será verificado, assim como a verificação do pino. Se houver uma interrupção , o processo de execução da interrupção será inserido.VM entry control
VM-entry interruption-information filed
Guest
CPU
CPU
A lógica de interrupção é
PIC
O dispositivo virtual envia uma solicitação de interrupção ao chip de interrupção virtual ePIC
registra virtualmente as informações de interrupção do dispositivo virtual. Diferente do processo de interrupção física, a lógica de avaliação de interrupção do chip virtual não é acionada neste momentoPIC
, masVM entry
é executada em tempo real.- Se o virtual
CPU
estiver em estado de suspensão, ative o virtualCPU
, mesmo queCPU
o thread correspondente ao virtual entre naCPU
fila de tarefas físicas prontas - Quando o virtual
CPU
começar a funcionar,Guest
pouco antes de ligar,KVM
o módulo verificará oPIC
chip virtual para ver se há alguma interrupção que precise ser processada. Neste momento, a lógica de avaliação de interrupção doKVM
chip virtual será acionada.PIC
Guest
Depois que uma interrupção que precisa ser processada é calculada pelo chip de interrupção virtual , as informações da interrupção são injetadasVMCS
no campo de interrupção .VM-entry interruption-information
- Depois de entrar
Guest
no modo,CPU
verifiqueVMCS
as informações de interrupção - Se houver uma interrupção que precise ser processada, o serviço de interrupção correspondente
CPU
será chamado para tratar a interrupção.Guest IDT
Geralmente, o controle de interrupção é realizado por um controlador de interrupção 8259A
, um controlador de interrupção programável ou um controlador de interrupção avançado programável, portanto, esses dois chips também devem ser virtualizados.APIC
Suporte para virtualização de hardware
O chip de interrupção virtual é implementado no espaço do usuário, mas o chip de interrupção está intensamente envolvido no processo de operação de todo o sistema do computador.Portanto, a fim de reduzir a sobrecarga causada pela alternância de contexto entre o espaço do kernel e o espaço do usuário, posteriormente, o virtual O chip de interrupção está no espaço do kernel. Para melhorar ainda mais a eficiência, Intel
todos os aspectos da virtualização são suportados no nível do hardware.
virtual-APIC page
: Implementado um para armazenar registros de interrupçãoIntel
noCPU
modo . Com este estado no modo e lógica de interrupção nos modos posteriores , muitos comportamentos de interrupção não precisam de intervenção, reduzindo bastante o número de interrupções.Guest
virtual-APIC page
Guest
Guest
VMM
VM exit
Guest
Lógica de avaliação de interrupção no modo.Intel
A lógica de parte do chip de interrupção é implementada noGuest
modo de avaliação de interrupção.Quando ocorre uma interrupção,CPU
não há necessidade de passar paraHost
o modo, masGuest
a avaliação da interrupção é concluída diretamente no modo.posted-interrupt processing
: Após o chip de interrupção virtual receber a solicitação de interrupção, ele salvará as informações no chip de interrupção virtual. Nesse momentoVM entry
, a lógica de avaliação de interrupção do chip de interrupção virtual é acionada e a avaliação da interrupção é realizada com base nas informações de interrupção registradas no chip de interrupção virtual. No entanto, quando a lógica de avaliação de interrupção no modo deCPU
suporteGuest
é implementada, o chip de interrupção virtual pode passar diretamente as informações de interrupção para o chip de interrupção no modo após receber a solicitação de interrupção. AGuest
avaliação de interrupçãoCPU
é realizada noGuest
modo lógico do chip de interrupção. no modo e enviado para entrega direta do padrão está quebrado.Guest
Guest
CPU
Virtualização de dispositivos
Virtualização de dispositivos: O software de virtualização de sistema usa software para apresentar Guest
a lógica dos dispositivos de hardware ao sistema operacional. A virtualização de dispositivos experimentou sucessivamente virtualização completa, paravirtualização e, posteriormente, virtualização assistida por hardware, incluindo a transmissão direta de hardware para a máquina virtual e a virtualização de uma peça de hardware do nível de hardware em vários subhardwares, cada subhardware separadamente. para máquinas virtuais, etc.
Transmissão transparente do dispositivo
Se a virtualização de dispositivos usar simulação de software, ela precisará VMM
estar envolvida. Para evitar essa sobrecarga, tente oferecer suporte à virtualização Intel
no nível do hardware , ou seja, transmitir diretamente o dispositivo para o dispositivo , ignorando o acesso direto ao dispositivo físico sem participar do processo. Este método fornece o melhor desempenho de virtualização.I/O
Guest
Guest
VMM
VMM
I/O
I/O
Intel
O método inicial era Direct Assignment
transmitir de forma transparente todo o dispositivo para uma determinada máquina virtual e não suportava várias VM
máquinas compartilhando o mesmo dispositivo. PIC-SIG
Por exemplo , foi desenvolvido um padrão para tornar equipamentos de diferentes fabricantes compatíveis entre si : Single Root I/O Virtualzation and Sharing
para abreviar SR-IOV
. SR-IOV
Dois novos Function
tipos são introduzidos, um é Physical Function
abreviação PF
; o outro é Virtual Function
abreviatura VF
. Pode SR-IOV
-se suportar vários VF
e cada um VF
pode ser transmitido separadamente de forma transparente , dessa forma, o compartilhamento múltiplo do mesmo dispositivo físico Guest
será realizado do ponto de vista do hardware .Guest
Cada VF possui seu próprio espaço de armazenamento independente, fila, interrupção e unidade de processamento de comandos para transmissão de dados, etc., mas o gerenciamento dessas VFs ainda está sob o controle do sistema, através VMM
do VMM
gerenciamento PF
destas VF
. A máquina virtual pode acessá-los diretamente VF
em vez de VMM
acessar o dispositivo físico por meio do dispositivo emulado na máquina virtual. PF
Além de fornecer VF
acesso ao gerenciamento, Host
os aplicativos nele contidos ainda podem PF
acessar o dispositivo físico indiscriminadamente. Para quem não tem VF
drivers Guest
, as máquinas virtuais ainda podem SR-IOV
compartilhar dispositivos físicos por meio da interface PF do dispositivo.
Método de transmissão de dados
(1)MMIO
:Memory-Mapped I/O
Mapeie a memória e os registros dos periféricos paraCPU
o espaço de endereço da memória eCPU
acesse os periféricos como se estivesse acessando sua própria memória.
(2)PIO
:Port I/O
: UsoIN
eOUT
instruções para ler dados da porta especificada.
Não gosto de redes e não explorei a virtualização de redes, então pulei.
Ressalta-se aqui que
VT-d
a tecnologia implementaCPU
virtualização e virtualização de memória, e interrupções e dispositivos não são considerados um tipo de virtualização.
Tecnologia QEMU/KVM
Já vi muitos conceitos e é um pouco chato, vamos dar uma olhada na prática.
QEMU
Download do código-fonte: download do site oficial do código-fonte qemu
Linux
Download do código-fonte: download do site oficial do código-fonte do kernel Linux
conceitos e história
Uma máquina virtual ( Virtual Machine,VM
) é um processo. Um processo pode ser considerado como uma coleção de recursos. Ele possui seu próprio espaço de endereço de processo independente e CPU
registros independentes. Ele executa instruções escritas pelo programador e completa certas tarefas. A virtualização de sistemas desenvolveu-se rapidamente com o suporte da computação em nuvem, Intel
e ambas as empresas adicionaram sucessivamente suporte à virtualização AMD
no nível do hardware.CPU
Posteriormente, foi desenvolvida no kernel a tecnologia de virtualização de hardware Qumranet
utilizada , com arquitetura simplificada e integração natural com o kernel, permitindo sua entrada rápida no kernel. A virtualização é agora uma pedra angular de muito sucesso do que é conhecido como computação em nuvem.Intel
Linux
KVM Kernel Virtual Machine
KVM
Linux
KVM
VMM
QEMU
No início, as instruções da arquitetura de origemTCG Tiny Code Generator
eram convertidas em instruções da arquitetura de destino por meio do mecanismo.
Intel
Hedu adicionou sucessivamente suporte para virtualizaçãoAMD
no nível de hardware, ou seja, virtualização de hardware, adicionou um conjunto de instruções estendidas com base no conjunto de instruções , adicionou novos modos de operação e completou a correção de vulnerabilidades de virtualização. Através das novas instruções de virtualização de hardware, ele pode ser construído de forma muito conveniente e o código na máquina virtual pode ser executado nativamente no físicoCPU
Intel
x86
VMX
VT-x
CPU
x86
VMM
x86
CPU
KVM
É um módulo do kernel que exporta uma série de interfaces para o espaço do usuário. O espaço do usuário pode usar essas interfaces para criar máquinas virtuais. No início, KVM
ele era responsável apenas pelas CPU
partes principais de virtualização e virtualização de memória. Era usado QEMU
como componente de modo de usuário e era responsável pela simulação de um grande número de periféricos. A solução na época era chamada de QEMU-KVM
.
Além disso, existem soluções de virtualização como VMware
.VirtualbBox
Virtualização de CPU
Criação de uma máquina virtual: Para criar uma KVM
máquina virtual, uma solicitação precisa ser iniciada do lado do usuário QEMU
.
QEMU
A criação de máquinas virtuais secundárias e KVM
a criação de máquinas virtuais: QEMU
use KVMState
estruturas para representar KVM
estruturas de dados relacionadas. KVM_INIT
A função primeiro abre /dev/kvm
o dispositivo para obter um fd
, chama a interface para criar uma máquina virtual kvm_ioctl(s, KVM_CREATE_VM)
no nível intermediário e também chama para completar alguns inicialização relacionada à arquitetura.KVM
kvm_init
kvm_arch_init
// qemu
static int accel_init_machine(AccelClass *acc, MachineState *ms)
{
//
ret = acc->init_machine(ms);
if (ret < 0)
{
...
}
return ret;
}
// kvm
static int kvm_init(MachineState *ms)
{
//
MachineClass *mc = MACHINE_GET_CLASS(ms);
ms = KVM_STATE(ms->accelerator);
ms->vmfd = -1;
ms->fd = qemu_open("/dev/kvm", O_RDWR);
do
{
ret = kvm_ioctl(s, KVM_CREATE_VM, type); // 创建一台KVM虚拟机
} while (ret == -EINTR);
}
VCPU
Criação de
VCPU
tipo
struct X86CPUDefinition {
const char *name;
uint32_t level;
uint32_t xlevel;
/* vendor is zero-terminated, 12 character ASCII string */
char vendor[CPUID_VENDOR_SZ + 1];
int family;
int model;
int stepping;
FeatureWordArray features;
char model_id[48];
};
static X86CPUDefinition builtin_x86_defs[] = {
// 各种cpu型号和特性
{
.name = "pentium",
.level = 1,
.vendor = CPUID_VENDOR_INTEL,
.family = 5,
.model = 4,
.stepping = 3,
.features[FEAT_1_EDX] =
PENTIUM_FEATURES,
.xlevel = 0,
},
// ......
}
Ao chamar KVM
a função de criação virtual , CPU
uma função é passada kvm_vcpu_ioctl
e um parâmetro é passado para representar o cpu
status de criação, como segue
int kvm_cpu_exec(CPUState *cpu)
{
do
{
...
run_ret = kvm_vcpu_ioctl(cpu, KVM_RUN, 0);
} while ()
}
Tecnologia de contêiner Docker
A tecnologia de virtualização tradicional pode ser implementada por meio de hardware ou sistemas operacionais, por exemplo KVM
, para permitir que aplicativos virtuais alcancem resultados semelhantes aos de máquinas físicas, Hypervisor/VMM
permite que vários sistemas operacionais compartilhem um ou mais sistemas operacionais CPU
, mas traz muitos sobrecarga. Como a máquina virtual inclui um conjunto completo de máquinas virtuais OS
, o agendamento e o uso de recursos são muito pesados.
A tecnologia Container ( Container
) é uma tecnologia de virtualização de sistema operacional mais leve. Ela empacota aplicativos, pacotes dependentes, arquivos de biblioteca, etc. em imagens padronizadas, fornece isolamento de processos por meio do mecanismo de contêiner e pode limitar recursos. Permite que o ambiente separe aplicativos OS
do plataforma e hardware subjacente.
Aqui deve ser mencionado um comando: chroot
, ou seja change root
, sua função é alterar a localização do diretório raiz referenciado quando o programa é executado, o que pode aumentar a segurança do sistema e limitar o que o usuário pode fazer.
Mecanismo de gerenciamento de contêineres
Inclui principalmente vários módulos, como processo daemon, imagem, driver e gerenciador de contêiner.
Daemon Docker
Este processo é um processo daemon que reside em segundo plano. Ele é responsável por monitorar as solicitações do cliente, executar a lógica correspondente subsequente e gerenciar Docker
objetos. Ele consiste principalmente em três partes:
Server
: Responsável por receber solicitações do cliente, após receber a solicitação, encontraServer
a solicitação de execução correspondenteHandler
por meio de roteamento e agendamento de distribuição, interage com o armazém espelho do contêiner e retorna o resultado paraDocker Client
.Engine
: Ligue o motor. Este módulo desempenhaDocker container
o papel de um armazém de armazenamento.Engine
Cada trabalho pode ser dividido em múltiplas ações mínimasJob
, que são suas unidades de execução de trabalho mais básicas.Job
:Docker
cada operação interna pode ser abstraída em uma e será concluídaJob
usando o driver subjacente .Driver
Driver Docker
Docker
No driver, a camada do driver de design é desacoplada, que separa a lógica de execução de imagem, rede e isolamento do gerenciamento de contêineres da Docker Daemon
lógica do contêiner.
Na implementação a médio prazo, os impulsionadores podem ser divididos nas três categorias seguintes:
graphdriver
: Responsável pelo gerenciamento de imagens de contêiner, principalmente pelo armazenamento e aquisição de imagens.Quando a imagem é baixada, a imagem será armazenada persistentemente em um diretório local especificado.networkdriver
: Responsável pelaDocker
configuração do ambiente de rede do contêiner, como alocação de mapeamentos de portasDocker
em tempo de execuçãoIP
e criação de pontes de rede e placas de rede virtuais na inicialização.execdriver
: Driver de execução, por meio de operaçãoLxc
oulibcontainer
isolamento de recursos. É responsável por criar e gerenciar o namespace de execução do contêiner, gerenciar a alocação de recursos e a execução dos processos reais dentro do contêiner.
libcontainer
Fornece acesso ao kernel relacionado ao contêiner API
e é responsável por operações específicas no contêiner.
Principalmente usando o kernel
namespace
ecgroup
duas tecnologias.
Énamespace
responsável pelo isolamento do processo ecgroup
limitação de recursos.
Sistemas de arquivos virtuais visíveis (sistemas de arquivos sem armazenamento persistente), tomando como exemplos proc e sysfs Cgroup
.
Se você estiver interessado, pode dar uma olhada neste projeto, que tem bash
mais de cem linhas simples escritas à mão docker
: bocker