AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 789175
Accepted
Yakog
Yakog
Asked: 2025-01-07 07:28:47 +0800 CST2025-01-07 07:28:47 +0800 CST 2025-01-07 07:28:47 +0800 CST

Onde exatamente a disciplina da linha tty está localizada "logicamente"?

  • 772

Recentemente comecei a aprender sobre sistemas operacionais e o kernel do Linux. Eu estava interessado em terminais, então comecei por lá, no entanto, rapidamente me deparei com um problema. Escrevi uma pergunta um pouco mais longa, porque queria que você visse exatamente onde o problema potencialmente surgiu no meu entendimento e soubesse exatamente o que não está claro para mim. Obrigado antecipadamente :)

Li os seguintes artigos e perguntas/respostas:

  1. O TTY desmistificado
  2. Um guia para o terminal, console e shell
  3. Resposta de Stéphane Chazelas

No entanto, estou tendo dificuldades para entender exatamente onde a disciplina da linha terminal (tty) está localizada logicamente porque encontrei uma inconsistência (como eu ingenuamente entendi) entre o 1º artigo e a resposta de Stéphane Chazelas.

O TTY desmistificado usa primeiro a seguinte imagem: insira a descrição da imagem aqui

Ele diz que o driver TTY é representado por tty_io.c, enquanto a disciplina de linha padrão é representada por n_tty.c. Processos (como bash) se comunicam com o driver TTY ( tty_io.c). Na verdade, na prática, com um arquivo que representa o dispositivo inteiro (driver UART + disciplina de linha + driver TTY). O driver UART é uma classe "serial" de driver que se comunica com a linha física (e terminal adicional) de um lado e a disciplina de linha do outro.

A próxima imagem do The TTY demystified é:

insira a descrição da imagem aqui

Tudo é o mesmo, exceto que agora temos um emulador e um terminal virtual. A única diferença é que o driver UART não será usado, mas o driver "console".

A última imagem mostra a situação pseudo-terminal. Nesse caso, temos um lado mestre e um lado escravo. O emulador de terminal é "empurrado" para o espaço do usuário. Além disso, temos dois arquivos onde o emulador interage com o arquivo mestre ( /dev/ptmx), enquanto os processos (shell) interagem com o arquivo escravo ( /dev/pts/..). Nesse caso, o driver pty é usado e eu diria que logicamente, como nos casos anteriores, está no lugar onde "PTY master side" está escrito na imagem.

insira a descrição da imagem aqui

Tudo estava funcionando para mim (ou pelo menos acho que estava), e então me deparei com uma resposta de Stéphane Chazelas :

Muita inteligência está na disciplina de linha tty. A disciplina de linha é um módulo de software (residindo no driver, no kernel) empurrado para cima de um dispositivo serial/pty que fica entre esse dispositivo e a linha/fio (o lado mestre para um pty).

De acordo com as imagens, temos um "dispositivo" serial/console/pty representado através do driver no kernel (driver UART na primeira, emulador na segunda e "lado mestre" na terceira imagem) e então disciplina de linha depois (como parte do driver, em cima dele). Entretanto, o próximo componente nas imagens é o driver TTY ( tty_io.c), não linha/fio como Stéphane Chazelas escreveu... Talvez Stéphane pense no driver TTY quando ele diz "dispositivo serial/pty", mas isso não faz sentido para mim, já que então teríamos, por exemplo, UART (serial) driver <-> line discipline <-> TTY driver/UART (serial) driver. Adicionalmente, nas imagens, o driver TTY não faz diferença entre eles, é apenastty_io.c

Estou muito confuso. O que estou esquecendo? Onde a disciplina da linha tty está exatamente "logicamente" localizada?

bash
  • 1 1 respostas
  • 49 Views

1 respostas

  • Voted
  1. Best Answer
    user10489
    2025-01-07T10:13:43+08:002025-01-07T10:13:43+08:00

    Então, na verdade, o primeiro caso é a configuração completa, e os dois segundos casos virtualizam partes do primeiro caso.

    Para os dois segundos casos, pense na UART como o centro das coisas, mas quando ela é virtualizada, ela desaparece e fica de fora do diagrama.

    No segundo caso, o terminal de hardware é virtualizado no emulador de terminal com o hardware vga e teclado atuando como o vídeo e teclado de um terminal real. O UART, se fosse representado, estaria entre a disciplina de linha e o emulador de terminal.

    No terceiro caso, o vídeo e o teclado também são virtualizados, pelo driver de pseudo terminal com software de nível de usuário (xterm, screen, o que for) virtualizando as mesmas coisas que o driver de console do kernel virtualiza no segundo caso. A UART, se fosse representada, estaria na verdade entre a disciplina de linha e o lado mestre PTY.

    Se você aumentasse o detalhe no primeiro diagrama, você realmente descobriria que o primeiro dispositivo dentro do terminal é outro UART, e se você aumentasse ainda mais, você descobriria que cada UART tem um driver de linha entre ele e a linha física. Então a primeira coisa a desaparecer quando o hardware é virtualizado é a conexão (uart<->line driver <->physical line <->line driver <->uart). O driver de linha pode até incluir dois modems com a linha sendo uma linha telefônica.

    Cave um pouco mais fundo e você verá que muitos terminais de hardware foram implementados com CPUs 6502. Qualquer coisa mais profunda do que isso pertence a https://retrocomputing.stackexchange.com/

    Não vejo nada de errado com a resposta de Stéphane Chazelas. Ele está apenas usando uma perspectiva unilateral, olhando apenas para o que está entre a uart local e o processo do usuário, em vez de todo o caminho. Dessa perspectiva, há pouca diferença entre a UART e a linha serial, está tudo na mesma caixa preta.

    Além disso, em um terminal tradicional, você não teria muito de um driver serial no terminal, porque ele não está rodando unix, é um sistema embarcado rodando um programa monolítico sem nenhum driver de software separado. Embora você possa ter duas UARTs, você não tem dois drivers seriais.

    Referi-lo como "dispositivo serial/pty" está correto...porque o pty está emulando/virtualizando as partes seriais do hardware. Lembre-se de que quando você virtualiza isso, tudo entre os dois UARTS, incluindo os uarts, evapora.

    • 1

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve