Binder e mudar a natureza da cópia de memória

Falando cópia de memória Binder, eu acredito que a maioria das pessoas já ouviu falar de "copiar uma vez": Em comparação com as tradicionais duas cópias do IPC, Binder aparecer maior eficiência na transmissão de dados.

Na verdade, muitas pessoas na entrevista pode responder a frase acima, mas se ele pediu mais detalhes, estimativas e sem palavras.

Na verdade, o conceito de memória cópia de ambos simples e complexa. Simplesmente porque ele possui um único, complexo situa-se um monte de gente para a memória virtual, memória física, o espaço do usuário e espaço do kernel não é suficiente compreensão. O chamado instabilidade fundação, arranha-céus difícil de estabelecer.

Este trabalho pretende revelar a natureza de cópia de memória Binder, o outro vai também introduzir algumas mudanças na nova versão da aplicação correspondente.

1. Visão de cópia de memória

Antes de fazer qualquer coisa, o primeiro propósito claro. Eu acredito que os desenvolvedores da pasta que originalmente projetados deve ser cuidadosamente considerada esta questão. De acordo com o meu entendimento, a finalidade da transmissão de dados Binder pode ser resumido em estas palavras:

Um processo pode acessar os dados de outro processo através de seu próprio espaço de endereço virtual do usuário.

Para entender completamente esta frase, a necessidade de chegar a algum consenso sobre o básico.

1.1 Relações endereço virtual e dados

Todos os dados são armazenados na memória física, e o processo só pode ser acessado através de um endereço de memória virtual. Então, se quer ter que ter uma visita bem sucedida para a premissa:

Estabelecer o mapeamento entre endereço de memória física e virtual

Se esta relação de mapeamento camada não é estabelecida, a visita vai dar errado. sinal MAPERR 11 (SIGSEGV) foi projetado para descrever o erro.

Entre o endereço virtual e relação de mapeamento endereço físico estabelecido por mmap concluída. Aqui nós não consideramos o mapeamento do arquivo-back e considerar apenas o mapeamento anônimo. Quando mmap é chamado (flag = MAP_ANONYMOUS), na verdade, ele vai fazer duas coisas:

  1. Alocar um espaço de endereço virtual contíguo.
  2. Atualização PTE (Página Table Entry) correspondente a esses endereços virtuais.

Depois mmap feito essas duas coisas, ele irá retornar para o endereço inicial do espaço de endereço virtual contíguo. No final da chamada mmap, de fato, não aloca páginas físicas imediatamente. Se neste momento não aloca página física, em seguida, haverá as duas questões seguintes:

  1. Nenhuma nova alocação de página física, então o PTE ter atualizado o quê?
  2. Se um endereço virtual posterior retornado pela memória de acesso mmap O que acontece para produzi-lo?

1.1.1 qualquer nova atribuição página física, então o PTE é actualizado o conteúdo?

Que a entrada PTE tabela de página, seu conteúdo reflete a relação de mapeamento entre um endereço virtual para um endereço físico. Se nenhuma nova alocação de página física, e que esses novos endereços virtuais e endereços físicos entre os quais estabelecemos relações de mapeamento? A resposta é todos os endereços virtuais são as mesmas e uma página de zero (o conteúdo da página são todos 0), a relação de mapeamento.

1.1.2 Se um acesso posterior usando o endereço de memória virtual retornado por mmap O que acontece para produzi-lo?

Obter o endereço virtual retornado por mmap, não terá uma nova alocação de página física. Neste momento, se o valor lido diretamente o endereço virtual, que irá ser atribuída a apenas estabelecer o mapeamento zero página por PTE, portanto, ler os valores são 0.

Se neste momento para gravar dados para o endereço virtual, ele irá acionar um mecanismo normal copy-on-write no manipulador de falha de página. Quantas páginas necessidade de escrever, quanto será a nova alocação página física. Assim, podemos ver que a página física real está em consonância com os princípios de alocação preguiçosos (on-demand). Este garantir grandemente a alocação racional e uso dos recursos físicos.

1.2 processo de utilizador entre o espaço de espaço / núcleo é isolado?

Deixe-me falar sobre as conclusões, o espaço do usuário entre diferentes processos estão completamente isoladas, espaço do kernel é compartilhado.

Então o "isolamento" e "share" neste contexto é o que isso significa?

Do ponto de vista da implementação, meios "quarentena" diferentes para diferentes tabelas de páginas processos, "partilhar" significam a mesma coisa em diferentes tabelas de páginas processos, e nada mais. Sabemos que a tabela de páginas reflete o mapeamento entre endereços virtuais e endereços físicos. Então, o que uma gestão de endereço virtual da tabela de página? Todo o espaço de endereço virtual de todo o endereço dele?

Claro que não. Linux espaço de endereço virtual para o espaço do usuário e espaço do kernel, gerenciar tabela de páginas espaço de endereço virtual diferente não é o mesmo.

Como se mostra acima, o processo utilizando a tabela de utilizador espaço Uma página 1, o espaço B do processo de utilizador utilizando a tabela de página 2, o processo de espaço de núcleo de A / B utiliza a tabela página 3. A / B usando o mesmo endereço virtual espaço de usuário para acesso a memória, devido à mesa de página diferente, de modo que o mapeamento de página física final é diferente, este é o chamado "isolamento do processo." E porque o espaço do kernel A / B usa o mesmo processo uma tabela de páginas, contanto que eles usam o mesmo endereço virtual (no espaço do kernel), então deve haver acesso à mesma página física.

1.3 Dois modos de transmissão de dados

1.3.1 Memória Compartilhada

endereços virtuais para acesso à memória apenas para a interface camada de encapsulamento, e os dados está sempre presente na memória física. Assim, se um quer acessar o processo de dados, processo B (espaço do usuário) endereço virtual, a forma mais eficiente é modificar o PTE A / B processo algum endereço virtual, de tal forma que esses endereços virtuais para mapear uma área física . Portanto, não há cópia, os dados em apenas um espaço físico.

cópia 1.3.2 memória

Embora a memória compartilhada eficiente, mas apenas uma memória física, de modo que, em última análise, considerar vários mecanismos de sincronização. Assim que os processos diferentes considerar a sincronização de dados, que é um desafio para termos Android. Porque, como uma plataforma de sistema, ele é obrigado a querer reduzir o esforço de desenvolvimento para desenvolvedores, permitindo que os desenvolvedores para usar apenas a melhor gerir as suas coisas. Então, vamos desenvolvedores considerar inter-processo muitas vezes não problemas de sincronização de dados uma boa escolha.

Em vez de memória método de copiar. Esse método garante que processos diferentes têm uma das sua própria área de dados, que não consideram a sincronização de dados entre processos.

Devido a processos de espaço do kernel são compartilhados (somente para completar a transferência de ações ou somente outro lado do rio), por isso é natural para considerá-lo como uma estação de retransmissão de dados. As abordagens convencionais exigem duas cópias, uma cópia é enviada pelo espaço do usuário para kernel processos espaciais do processo de envio, e uma vez que a cópia é recebido pelo espaço do kernel para processos do espaço do usuário do processo de recepção. Estas duas cópias meio há uma relação de conversão implícita, que o espaço do kernel e no espaço do kernel do processo de envio recebendo processo é compartilhado, e, portanto, manter o mesmo endereço virtual irá acessar o mesmo pedaço de área física.

Duas cópias da intuitiva método comparativo, mas em termos de eficiência, bem como para optimizar o espaço.

Desde duas cópias ter ocorrido entre o espaço do usuário e do kernel espaço de um processo, então, de fato, implica uma premissa:

espaço de usuário virtual endereço e ponto espaço kernel para diferentes páginas físicas.

É por causa de ponto para diferentes páginas físicas, por isso precisa ser copiado. Que não há nenhuma possibilidade de fazer ambos apontam para a mesma página física? Se você puder, isso não é para salvar uma cópia do mesmo?

Na verdade, Binder fez exatamente isso.

copiar 2. Binder memória perceber de

As versões anteriores 2.1 (P) ≤Android

Para reduzir o tempo de copiar, processar os dados recebidos devem atender aos seguintes três condições:

  1. Dispensando uma região A contínua (somente alocados endereço virtual) no espaço do usuário.
  2. Dispensando uma região contínua do mesmo tamanho no espaço do kernel B (o mesmo endereço virtual só alocado).
  3. Quando os dados para cada comunicação, aloca uma página física, de acordo com as necessidades reais e a página física mapeada para a A / B no mesmo local de deslocamento.

1 foi concluído quando a condição de pasta mmap chamada de função no processo, e condição 3 efectuada em cada comunicação de dados em tempo.

2 é assumido para receber dados após o processo de transmissão de dados 1, processo, analisamos a cópia de memória no final ocorre quando (após a execução ocorreu em um processo, mas desta vez a unidade está a executar o código [em modo kernel]).

  1. Desde a chamada através da função mmap (chamado apenas uma vez) antes do processo de 2, por isso tem área A e da área do kernel B espaço do usuário espaço (somente alocar um endereço virtual não está mapeada página física).
  2. Que o tamanho dos dados a serem enviados, ea alocação real com base no tamanho da página física.
  3. Um processo mapeados para a região de 2 / B imediatamente dispensado página física (uma vez que o processo é um modo de núcleo, é possível operar o processo de TEP 2).
  4. Transmissão de dados copiados para o espaço do usuário através de um B copy_from_user área kernel.
  5. Desde A / B é mapeado para a mesma página física, os dados B pode ser lido fora do endereço Um é.

Durante todo o processo, apenas o passo 4, houve uma cópia dos dados.

Versão atual 2.2 (Android Q, R)

Do ponto de vista do desempenho, a versão anterior de realização é quase impecável. Mas tem uma estabilidade falha fatal, que é um engenheiro do Google que insuportável. Então, a partir do Android Q, cópia de memória perceber de Binder tem uma nova mudança.

Pode saber pela análise anterior, depois de dirigir a função mmap executado, o processo será atribuída uma área no espaço de endereço virtual do kernel B. Para o processo de aplicação Android, o tamanho padrão B é 1M-8K. Enquanto este processo não sair, este endereço virtual 1M-8K terá sido atribuído a ele.

Normalmente, ele não criar problemas para um longo período de ocupação do endereço virtual, mas, infelizmente, Binder desta ocupação tem um problema.

2.2.1 cópia máquina de 32 bits da memória defeituosa Binder

Endereçamento de 32 bits do espaço de máquina 4G, em que alta como o núcleo 1G espaço de endereço, como diminuir o espaço de endereço do utilizador 3G, que é o conceito de endereço virtual.

1G do kernel espaço de endereço é dividido em quatro áreas diferentes:

  • área directa de mapeamento (região de memória direta), pouca memória nos endereços físicos e virtuais na região do mapeamento direto, então a diferença é sempre um deslocamento fixo entre os endereços virtuais e endereços físicos. Kmalloc bloco de atribuição de endereços está localizado nesta região.
  • área vmalloc, o endereço virtual pode ser mapeada para a região no endereço físico de memória superior. Uma vez que o intervalo de endereços é muito maior do que a área gama vmalloc endereço de memória superior, e, portanto, não pode usar o mapeamento entre os dois mapeamento linear, mapeamento dinâmico somente. Vmalloc bloco de atribuição de endereços está localizado nesta região.
  • área temporária de mapeamento (região kmap), de tamanho fixo 4M, principalmente para a primeira página e, em seguida, as necessidades físicas de seu espaço de endereçamento do kernel. Kmap só pode ser chamado uma vez um mapeamento, o mapeamento de cenários comuns em um curto espaço de tempo.
  • região mapeamento fixo (região mapeamento fixo)

área Tamanho vmalloc com diferentes versões do Kernel mudanças também ocorreram. Começando Kernel 3,13, área vmalloc aumentou a 128M 240M. 240M não parece ser um número pequeno, mas a aplicação vai começar no problema de telefone excessiva. O que dizer?

Com o lançamento de projectos Agudos Android (Android O introduzido) é, aglutinante hardware entrou oficialmente na opinião pública. Por um lado, mais e mais serviço HAL uso hwbinder para comunicação entre processos, por outro lado, simplesmente atribuir o processo de aplicação original 1M-8K agora necessário atribuir mais de uma área para comunicações hwbinder. Assim, aglutinante exponencialmente crescente unidade ocupando o espaço de área vmalloc kernel. Quando muitas aplicações lançar, a área endereço vmalloc virtual provavelmente será esgotado. Note-se que esta refere-se ao endereço virtual está esgotado, em vez de endereços físicos estão esgotados.

Quando a região endereço vmalloc virtual está esgotado, o kernel e o uso de determinado código vmalloc VMAP será erro, porque a nova atribuição de endereço virtual desta vez eles não podiam.

Para aliviar este problema, uma ideia simples é aumentar a área vmalloc natural. No entanto, o espaço de kernel 1G é fixo, esta espessura deve ser fina Ele. aumentos da área vmalloc, significa área mapeamento menos directa. A maior vantagem é a área directa eficiente-mapeado (porque a utilização de mapeamento linear), ele não pode ser reduzido, sem limitação. Assim, o aumento abordagem regional vmalloc só pode ser considerado como uma manobra dilatória, não é a melhor estratégia.

2.2.2 A nova implementação

Voltemos ao propósito original, pensar cuidadosamente sobre o significado da existência do espaço de endereço virtual do kernel.

Na verdade, é apenas o espaço de kernel que está procurando apenas a entrada de acesso da página física, nenhum valor foi tanto mais necessário, não haverá uso posterior. Uma vez que a transferência de dados estiver concluída, a entrada será sentido perdido.

Sendo esse o caso, por que não adotar uma forma mais dinâmica para alocar a entrada antes de cada transferência, a transferência é concluída após o lançamento desta entrada?

Na verdade uma nova versão do Binder fez.

 

 

 

Texto à direita da figura mostra o processo de transmissão de dados completa experientes. As versões anteriores dos dados pasta por uma cópia geral copy_from_user estiver concluída, a nova versão da cópia Binder da página de dados pela página através do copy_from_user chamada do ciclo será concluída. A seguir estão o código principal para mostrar a diferença:

versão Android ≤ P:

/drivers/staging/android/binder.c

1501	if (copy_from_user(t->buffer->data, (const void __user *)(uintptr_t)
1502			   tr->data.ptr.buffer, tr->data_size)) {
1503		binder_user_error("%d:%d got transaction with invalid data ptr\n",
1504				proc->pid, thread->pid);
1505		return_error = BR_FAILED_REPLY;
1506		goto err_copy_data_failed;
1507	}
1508	if (copy_from_user(offp, (const void __user *)(uintptr_t)
1509			   tr->data.ptr.offsets, tr->offsets_size)) {
1510		binder_user_error("%d:%d got transaction with invalid offsets ptr\n",
1511				proc->pid, thread->pid);
1512		return_error = BR_FAILED_REPLY;
1513		goto err_copy_data_failed;
1514	}
复制代码

versão Android ≥ Q:

/drivers/android/binder_alloc.c

1108 	while (bytes) {
1109 		unsigned long size;
1110 		unsigned long ret;
1111 		struct page *page;
1112 		pgoff_t pgoff;
1113 		void *kptr;
1114 
1115 		page = binder_alloc_get_page(alloc, buffer,
1116 					     buffer_offset, &pgoff);
1117 		size = min_t(size_t, bytes, PAGE_SIZE - pgoff);
1118 		kptr = kmap(page) + pgoff;
1119 		ret = copy_from_user(kptr, from, size);
1120 		kunmap(page);
1121 		if (ret)
1122 			return bytes - size + ret;
1123 		bytes -= size;
1124 		from += size;
1125 		buffer_offset += size;
1126 	}
复制代码

Pode ser visto na nova versão da aplicação, o conteúdo de cada cópia da página é chamado uma vez kunmap irá alocar do kernel espaço de endereço virtual libertados. Isto já não é o caso durante muito tempo ocupou o espaço de endereço virtual do kernel não ocorre.

Publicado 755 artigos originais · Louvor obteve 464 · Visualizações 2,47 milhões +

Acho que você gosta

Origin blog.csdn.net/u010164190/article/details/105351437
Recomendado
Clasificación