O hardware de vídeo para PC moderno suporta o modo de texto VGA em HW ou o BIOS o emula (com o Modo de Gerenciamento do Sistema)?

10

O que realmente acontece no hardware moderno do PC inicializado no modo BIOS MBR herdado de 16 bits quando você armazena um byte como '1'(0x31) no buffer de quadros de texto VGA (modo 03) no endereço linear físico B8000? Quão lenta é uma mov [es:di], eaxloja com o MTRR para essa região definida como UC? ( Os testes experimentais em um laptop Kaby Lake iGPU indicam que o clflushopt no WC era aproximadamente a mesma velocidade que a UC para a memória VGA. Mas, sem o clflushopt, os movarmazenamentos na memória do WC nunca saem da CPU e nem atualizam a tela, rodando super rápido .)

Se não for um SMI para todas as lojas, existe alguma maneira de aproximar esse custo em um pedaço de memória WB no espaço do usuário, para experiências de desempenho sem realmente reiniciar no modo real? (por exemplo, usando uma página BSS como um fingidor de moldura que na verdade não é exibido em lugar algum).

O glifo de fonte correspondente aparece na tela na próxima atualização, mas a digitalização de hardware está realmente lendo o caracter ASCII do VRAM (ou DRAM para um iGPU) e mapeando para os glifos de fonte de bitmap em tempo real? Ou existe alguma interceptação de software em cada loja ou uma vez por vblank, para que o hardware real precise lidar apenas com um buffer de quadro de bitmap?


Sabe-se que a inicialização do BIOS herdado usa o SMM (System Management Mode) para emular o kbd / mouse USB como um dispositivo PS / 2. Gostaria de saber se também é usado para o framebuffer de modo de texto VGA. Suponho que seja usado para portas de E / S VGA para configuração de modo, mas é plausível que um buffer de quadro de texto possa ser suportado por hardware. No entanto, a maioria dos computadores passa o tempo todo no modo gráfico, deixando de fora o suporte de HW para o modo de texto como algo que os fornecedores podem querer fazer. (OTOH neste blog sugere que um controlador VGA de homilrew verilog pode implementar o modo de texto de maneira bastante simples.)

Estou especificamente interessado em sistemas que usam o iGPU no Intel Skylake, mas estaria interessado em iGPUs anteriores / posteriores da Intel e AMD e em GPUs discretas novas ou antigas.

(Incluindo fornecedores que não são AMD e NVidia; existem algumas placas-mãe Skylake com slots PCI, e não PCIe. Se os drivers de firmware GPU modernos emulam o modo de texto, presumivelmente existem algumas placas de vídeo PCI antigas com o modo de texto VGA de hardware. E talvez essa placa poderia tornar as lojas apenas uma transação PCI em vez de uma SMI.)

Minha própria área de trabalho é um i7-6700k em um mobo Asus Z170 Pro Gaming, sem placas adicionais, apenas iGPU com um monitor 1920x1200 na saída DVI-D. Não conheço os detalhes do sistema Kaby Lake i5-7300HQ que o @Eldan está testando, apenas o modelo da CPU.


Encontrei a patente US20120159520 da Phoenix BIOS de 2011 , Emulando vídeo legado usando uefi . Em vez de exigir que os fornecedores de hardware de vídeo forneçam drivers UEFI e ROM nativos opcionais de modo real de 16 bits, propõem um driver VGA em modo real ( int 10hfunções e assim por diante) que chama um driver de vídeo UEFI fornecido pelo fornecedor por meio de ganchos SMM.

Resumo
A ROM da opção de vídeo genérico notifica um driver SMM de vídeo genérico da solicitação de serviços de vídeo. Essa notificação pode ser realizada usando uma interrupção de gerenciamento de sistema de software (SMI). Após a notificação, o driver SMM de vídeo genérico notifica um driver de vídeo UEFI de terceiros sobre a solicitação de serviços de vídeo. O driver de vídeo de terceiros fornece os serviços de vídeo solicitados ao sistema operacional. Dessa maneira, um driver gráfico UEFI de terceiros pode suportar uma ampla variedade de sistemas operacionais, mesmo aqueles que não oferecem suporte nativo aos protocolos de exibição UEFI.

Grande parte da descrição abrange o manuseio de int 10hchamadas e coisas do tipo que obviamente já interceptam o IVT, portanto, podem executar facilmente códigos personalizados que acionam um SMI de propósito. A parte relevante é o que eles descrevem para armazenamentos diretos no buffer de quadros em modo de texto, que precisam funcionar mesmo para códigos que não acionam interrupções de software ou hardware. (Além de HW acionar o SMI nessas lojas, eles dizem que podem usar se houver suporte.)

Suporte de buffer de texto

[0066] Em certas modalidades, os aplicativos podem manipular diretamente o buffer de texto do VGA . Em tal modalidade, o driver SMM de vídeo genérico 130 suporta isso de duas maneiras, dependendo se o hardware fornece captura SMI no acesso de leitura / gravação à região de memória de 740 KB a 768 KB (onde os buffers de texto estão localizados).

[0067] Quando o trapping SMI está disponível, o hardware gera um SMI em cada acesso de leitura ou gravação. Usando o endereço de interceptação da interceptação SMI, a coluna e a linha exatas do texto podem ser calculadas e a linha e a coluna correspondentes na tela de texto virtual acessada.

Como alternativa, a memória normal é ativada para essa região e, usando um SMI periódico, o driver SMM de vídeo genérico 130 verifica alterações no buffer de texto de hardware emulado e atualiza a tela de texto virtual correspondente mantida pelo driver de vídeo. Nos dois casos, quando uma alteração é detectada, o caractere é redesenhado na tela de texto virtual.

Esta é apenas a patente de um fornecedor de BIOS e não nos diz de que maneira a maioria dos hardwares realmente funciona, ou se outros fornecedores fazem coisas diferentes. Essencialmente, confirma que existe algum hardware que pode prender nas lojas desse intervalo. (A menos que seja apenas uma possibilidade hipotética que eles decidiram cobrir em sua patente.)

Para o caso de uso que tenho em mente, capturar apenas a atualização na tela seria muito mais rápido que capturar em todas as lojas, por isso estou curioso para saber qual hardware / firmware funciona dessa maneira.


Motivação para esta pergunta

Otimizando um contador decimal ASCII incremental na RAM de vídeo no Intel Core de 7ª geração - armazenando repetidamente novos dígitos para um contador de texto ASCII nos mesmos poucos bytes de RAM de vídeo.

Testei uma versão do código no espaço do usuário de 32 bits no Linux, na memória WB, na esperança de aproximar a situação movntie diferentes maneiras de fazer com que a CPU sincronize seu buffer WC com a RAM de vídeo após cada armazenamento (ou talvez ocasionalmente em interrupção do temporizador). Mas isso não é realista se a situação do carregador de inicialização em modo real não estiver apenas armazenando na DRAM, mas ativando uma SMI.

Na memória WB, a descarga de movntilojas com a lock xor byte [esp], 0é um pouco mais rápida do que a descarga de clflushopt. Mas o @Eldan não relata melhora na velocidade para aqueles na memória VGA depois de programar um MTRR para torná-lo WC. (E a mesma velocidade do original que faz armazenamentos normais, indicando que, por padrão, o buffer de quadros VGA era UC. Alguns BIOS mais antigos tinham uma opção para tornar o WC da memória VGA , que eles chamavam de USWC = Uncached Speculative Write Combining.)

Não é um problema do mundo real, então não estou procurando soluções alternativas ; embora seja interessante saber se o armazenamento manual de bytes de pixel em um modo de gráficos VGA pode ser muito mais rápido.


Sumário

  1. Algum / todos os sistemas modernos reais acionam um SMI em todas as lojas no buffer de quadros em modo de texto?
  2. Se não, podemos aproximar uma loja de WC + descarga ao framebuffer, usando um movnti + algo no espaço do usuário na memória WB? Assim, podemos criar um perfil fácil perfpara contadores de desempenho.
  3. Se diferentes BIOS e / ou hardware usam estratégias diferentes, quais são essas estratégias? (Não quero detalhes, apenas um alto nível como "SMI every vblank para sincronizar o buffer de quadros VGA com o buffer de hardware real")
  4. Uma placa de vídeo PCIe ou PCI com modo de texto VGA de hardware seria mais rápida do que as GPUs integradas realmente fazem? Suponho que uma transação de gravação PCIe real seria mais lenta do que esperar uma loja atingir a DRAM, mas que uma gravação PCIe seria mais barata que uma SMI em todas as lojas. Uma comparação entre estimativa e ordem de magnitude seria interessante.

Todas essas questões são altamente relacionadas, mas posso dividir isso se não houver tanta sobreposição quanto espero.

Peter Cordes
fonte
Não existe um contador de desempenho para as SMIs?
prl 30/04
@prl: sim, acho que sim. Se eu realmente escrevesse um gerenciador de inicialização que programava os contadores de desempenho e os colecionasse + os imprimisse após uma execução de teste e reiniciasse minha área de trabalho para executá-la, poderia encontrar uma resposta para minha própria área de trabalho. Obviamente não pode ser usado perfporque o Linux ainda não foi inicializado. A avaliação da latência SMI (System Management Interrupt) na máquina Linux-CentOS / Intel tem alguns detalhes sobre como contar SMIs.
Peter Cordes
11
@prl: na verdade, é mais fácil contar as SMIs: aparentemente há um MSR, não um contador de perf, então apenas RDMSR para MSR_SMI_COUNT=0x34sem ter que programar um contador primeiro.
Peter Cordes
Isso é muito mais fácil do que minha outra idéia, que é usar as técnicas descritas na seção 34.15 para detectar SMIs.
prl 30/04
@prl: 34.15 do vol.3 SDM da Intel, acho que você quer dizer? O xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/… parece estar descrevendo casos de contagem em que o SMM causa ou está envolvido em um VMEXIT, não apenas qualquer SMM antigo no "bare metal". (Ou o falso metal nu que a inicialização do BIOS herdada apresenta por meio de traps SMM ...) De qualquer forma, sim, se tiver tempo da próxima vez que não me importo de reiniciar minha área de trabalho, posso escrever um gerenciador de inicialização de 16 bits e testá-lo no meu sistema ... Ou espero que outra pessoa esteja se sentindo interessada e teste para mim.
Peter Cordes

Respostas:

7

Algum / todos os sistemas modernos reais acionam um SMI em todas as lojas no buffer de quadros em modo de texto?

Para placas de vídeo, duvido muito. Os fabricantes de placas de vídeo têm a lógica "obter dados de pixel do atributo char +" incorporada no hardware desde os anos 80 (ela antecede o VGA e não mudou muito desde o CGA), e apenas recortam e colam essa lógica em cada design mais recente, sem se importar muito com isso. .

Para coisas que não são placas de vídeo (por exemplo, ferramentas de gerenciamento remoto do sistema usando LAN), eu não sei, mas desconfio (geralmente elas usam uma CPU de gerenciamento especial em vez da (s) CPU (s) principal (s), para que funcione mesmo que o computador esteja ligado. desligado").

Se não, podemos aproximar uma loja de WC + descarga ao framebuffer, usando um movnti + algo no espaço do usuário na memória WB?

Se você não estiver no espaço do usuário, poderá alterar os MTTRs (em todas as CPUs - os MTRRs devem corresponder e há uma sequência especial envolvida) para tornar uma área da RAM "sem cache"; ou use PAT nas tabelas de páginas (muito mais fácil do que mexer com MTRRs, especialmente se você estiver usando paginação de qualquer maneira, mas um comportamento ligeiramente diferente devido à necessidade de coerência de cache). Se você estiver no espaço do usuário, precisará confiar no que o SO / kernel fornecer e (dependendo de qual SO for), o SO / kernel poderá não fornecer nenhuma maneira de fazer isso.

Contudo; mesmo que você encontre uma maneira de fazer (uma área de) RAM desanexada, ela ainda não será muito parecida, porque você estará gravando diretamente em algo conectado a um controlador de memória embutido na CPU (que a CPU pode gravar extremamente rapidamente ) em vez de falar com algo na outra extremidade de um link PCI (que terá maior latência e menor largura de banda do lado da CPU). Mesmo para vídeo integrado (onde tecnicamente são os mesmos chips de RAM no final), as gravações no VRAM passam por um caminho muito diferente (sujeito a remapeamento / GART / paginação na placa de vídeo, efetuado por um registro VGA "modo de gravação", efetuado por registros VGA de máscara de bit / plano, etc).

Uma placa de vídeo PCIe ou PCI com modo de texto VGA de hardware seria mais rápida do que as GPUs integradas realmente fazem?

Para gravações da CPU na VRAM; o vídeo normalmente integrado é significativamente mais rápido que as placas discretas (pelo menos para gravações simples da CPU para buffers de quadro linear, onde nenhuma das "lógicas de gravação" do VGA está envolvida).

Para estimativas extremamente aproximadas; Eu esperaria que uma única gravação na RAM tivesse cerca de 150 ciclos e uma única gravação no PCI estivesse perto de 1000 ciclos. Para o SMI, eu esperaria algumas centenas de ciclos de latência antes que o SMI chegasse à CPU, depois o custo do pipeline da CPU, depois cerca de 500 ciclos para salvar o estado da CPU (e o mesmo estado de carregamento no caminho de retorno); então o código do firmware teria que encontrar a causa do SMI (mais algumas centenas de ciclos?) antes que pudesse saber que era uma gravação para VRAM e não outra coisa; teria que examinar o estado da CPU salva e encontrar e decodificar a instrução que fez a gravação (porque não pode saber quais dados estavam sendo gravados, se era uma gravação de byte / word / dword, etc.) enquanto leva em consideração conta o estado anterior da CPU (em que modo a CPU estava, tamanho do código,XADDetc). Em seguida, teria que analisar o estado dos registros VGA (emulados) (modo de gravação, máscara de gravação, habilitação de avião, quaisquer controles que banco de 64 KiB seja mapeado na área herdada, altura da fonte, ...). Basicamente; para emulação SMI de um buffer de quadro de gravação no modo texto; Eu esperaria que demorasse dezenas de milhares de ciclos antes que o código do firmware negligencia um detalhe menor, porém importante, enterrado em uma enorme quantidade de complexidade, fazendo com que ele faça a coisa errada e seja inutilmente quebrado.

Outras notas

Encontrei a patente US20120159520 da Phoenix BIOS de 2011, Emulando vídeo legado usando uefi.

Duvido que isso já tenha sido implementado, porque duvido que possa funcionar. Há muitas coisas (comuns e obscuras) que você pode fazer com as interfaces herdadas (por exemplo, detectar atualização vertical, configurar modos de vídeo fora do padrão como "modo X", mexer com "exibir início" para implementar rolagem suave e / ou inversão de página) , use "informações CRTC" no VBE para alterar as temporizações do vídeo, etc.) que não são suportadas pelo UEFI e não podem ser feitas via. um driver de vídeo de terceiros para UEFI.

Em vez disso, os fabricantes de placas de vídeo não se preocuparam em fornecer drivers UEFI por cerca de 10 anos e o firmware UEFI usou a interface herdada para emular os serviços UEFI (geralmente interrompendo a inicialização segura enquanto eles estavam); até quase tudo estar UEFI de qualquer maneira.

Suponho que (SMM) seja usado para portas de E / S VGA para configuração de modo.

Eu presumo que não. A única coisa vagamente relacionada ao vídeo que eu suspeitaria que o SMM pode ser usado é controlar o brilho da luz de fundo da tela em laptops (especialmente para laptops mais antigos e especialmente para "eventos de abertura / fechamento de tampa") durante a inicialização antecipada (antes do SO) assume).

.. deixar de fora o suporte de HW para o modo de texto parece algo que os fornecedores podem querer fazer

Eu ainda acredito que a (eventual, após a já muito longa fase de transição "BIOS híbrido + UEFI") de mais de 30 anos de bagunça herdada acumulada (A20, VGA, PS / 2, PIT, PIC, ...) do hardware é uma das principais razões pelas quais os fabricantes de hardware (Intel) estão / têm pressionado pela adoção da UEFI.

Brendan
fonte
Aparentemente, a faixa de VGA herdada é decodificada pela fatia de cache L3 diretamente nos gráficos do processador, DMI ou um link PCIe com base nos bits de direção VGA nos registros de configuração. Não sei como o que os gráficos do processador fazem com esse intervalo, se não houver VGA; possivelmente apenas armazena em buffer e o converte em um buffer de quadro HDMI e o envia para o canal HDMI FDI, mas não tenho idéia
Lewis Kelsey
Obrigado, eu havia negligenciado a possibilidade de continuar com o suporte a HW, mas passando por um caminho mais lento no agente do sistema do que apenas diretamente nos controladores de memória. Isso, e derrotar o controlador de memória, cria uma coalescência, de modo que gargalos na taxa de transferência real da DRAM, não apenas o rendimento do barramento em anel central -> uncore -> do controlador de memória poderia explicar as gravações VGA dominando totalmente o tempo de execução e ocultando quaisquer diferenças entre clflushoptvs. lock xor byte [esp], 0para disparar disparos.
Peter Cordes
Seu ponto de vista em ter que emular o x86 em qualquer modo para obter os dados da loja é bom, o que o torna bastante implausível e o desempenho seria inaceitável ou pelo menos perceptível ao rolar em um console de texto que usava o modo de texto VGA em vez de o que o Linux faz por padrão hoje em dia com um console de framebuffer. Eu estava esquecendo que o modo de texto VGA precisa continuar funcionando mesmo depois que um sistema operacional apresenta todos os núcleos em um sistema com vários núcleos.
Peter Cordes
4

Lendo várias fichas técnicas modernas da CPU e do Platform Controller Hub (PCH) da Intel, não parece que o hardware necessário esteja implementado. Parece não haver nenhuma maneira de gerar uma SMI (System Management Interrupt) em resposta aos acessos do processador do buffer de quadro VGA (endereços físicos 0xA0000 - 0xBFFFF).

O controlador de memória na CPU direciona os acessos ao buffer de quadro VGA para o controlador gráfico integrado, a porta PCI Express conectada diretamente à CPU ou a interface DMI que conecta a CPU à PCH. Embora seja possível rotear partes do buffer de quadro VGA separadamente, isso parece servir apenas para suportar um dispositivo MDA (Monochrome Display Adapter) separado. O controlador gráfico integrado não está bem documentado, portanto, é possível que ele possa ser configurado para gerar um SMI nos acessos ao buffer de quadro VGA, mas isso parece improvável. De qualquer forma, não funcionaria com gráficos discretos.

Os PCHs da Intel também parecem não ter suporte para gerar SMIs em resposta a acessos de buffer de quadro VGA. Este seria o local mais natural para ele, pois já possui suporte para gerar SMIs em resposta a acessos de E / S ao controlador de teclado, controlador IDE e outros dispositivos herdados. É possível que exista algum recurso não documentado que faça isso, mas ele não está incluído nas listas de possíveis fontes SMI fornecidas nas folhas de dados da PCH.

Teoricamente, seria possível ao fabricante da placa-mãe conectar um dispositivo VGA falso à PCH por meio de uma porta PCI Express e gerar SMIs usando um pino GPH PCH. No entanto, não tenho certeza se isso funcionará na prática. No momento em que a CPU obtém o SMI, ele poderia ter executado outras instruções e não seria possível examinar o estado da CPU no momento do acesso ao buffer do quadro.

(Um problema semelhante aconteceu com a emulação do SoundBlaster 16 no SoundBlaster Live. Ele geraria um PCI SERR # quando as portas herdadas do SoundBlaster fossem acessadas, o que geraria uma NMI na CPU. Infelizmente, a emulação seria interrompida em muitas placas-mãe Pentium 4 porque o A MNI chegaria na instrução seguinte ou subsequente.)

Ross Ridge
fonte
Obrigado por verificar isso. Isso não descarta um manipulador SMI uma vez por vblank, sincronizando / renderizando o buffer de quadros de texto VGA em um buffer de quadros de pixel real (o outro mecanismo proposto pela patente), mas exclui um SMI por loja. Uma outinstrução é meio síncrona e serializada, mas uma loja de UC ainda passa pelo buffer da loja e se aposentará antes que a loja seja confirmada, eu acho. Se um outacesso à porta fosse um problema no P4, um armazenamento comum seria um desastre.
Peter Cordes
Se um sistema usasse um manipulador SMI para varrer o buffer de quadros de texto, isso implicaria que ele poderia ser armazenado em cache no WB e ainda atualizar a tela, mesmo com clias interrupções normais desabilitadas. Portanto, isso seria algo testável que poderíamos usar para descartar ou principalmente confirmar a outra possibilidade.
Peter Cordes