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 / 406898
Accepted
Zephyr
Zephyr
Asked: 2017-11-25 17:41:28 +0800 CST2017-11-25 17:41:28 +0800 CST 2017-11-25 17:41:28 +0800 CST

bit de modo kernel

  • 772

Eu li o abaixo em sistemas operacionais e conceitos do livro Galvin

"Um bit, chamado bit de modo, é adicionado ao hardware do computador para indicar o modo atual: kernel(0) ou usuário(1). Com o bit de modo, somos capazes de distinguir entre uma tarefa executada em nome do sistema operacional e aquele que é executado em nome do uso"

Agora, se for um sistema multiprocessador, suponha que um processo execute uma chamada de sistema e altere o bit de modo de 1 para 0 .

Agora, pode haver alguns outros processos em execução no modo de usuário paralelamente, pois é um sistema multiprocessador, mas o bit de modo é definido como 0, indicando o modo kernel causando inconsistência.

Então, o número de registradores (necessários para armazenar o bit de modo) depende do número de processadores?

linux system-calls
  • 1 1 respostas
  • 2356 Views

1 respostas

  • Voted
  1. Best Answer
    jdwolf
    2017-11-25T20:06:57+08:002017-11-25T20:06:57+08:00

    Seu livro está simplificando demais as coisas. Na realidade, depende da CPU como o modo é definido e não é necessariamente um "bit" nem existem necessariamente apenas dois modos.

    Para o propósito da questão, vamos supor Linux, Intel x86 e multicore.

    A multitarefa é implementada com alternância de contexto, que no Linux é baseada em software. Uma troca de contexto apenas interrompe o que o processador está fazendo (um núcleo ou CPU), salva seu estado na RAM e o substitui por outro contexto.

    O x86 implementa anéis de proteção que podem ser definidos em cada processador antes que ocorra a execução no nível do processo. O kernel do Linux lida com isso configurando os processos para tocar 3 (sem privilégios) antes de iniciar a execução em seu espaço de memória. Por meio da implementação da troca de contexto mencionada anteriormente, o kernel mantém o conceito de um processo em execução em um thread específico (geralmente 2 threads por núcleo com intel) porque sempre que o código do programa está sendo executado, o kernel sempre define o anel de volta para 3, mesmo que o processador está vendo mudanças de contexto acontecendo muitas vezes por segundo para que muitos processos sejam executados no mesmo núcleo. Ele pode fazer isso essencialmente da mesma maneira com um ou mais núcleos.

    No Linux com x86, quando um thread deseja mudar do anel 3 para o anel 0 (supervisor), ele só pode fazer isso com uma interrupção de software. Nos anéis 1 e 2 também é possível com instruções especiais, mas o Linux não implementa isso. Como o Linux controla o manipulador de interrupção do software, ele pode garantir que, mesmo que o encadeamento esteja agora no anel 0, ele execute apenas o código no "espaço do kernel", o que significa código que faz parte do kernel, embora seja o mesmo encadeamento que estava executando o código do espaço do usuário. Na linguagem do sistema operacional, isso é chamado apenas de chamada do sistema, pois é o que realmente está fazendo. Se você deseja considerar isso como o "processo" está alternando para o modo kernel e vice-versa ou que o processo está efetivamente em espera porque apenas o código de espaço do kernel está sendo executado até que seja devolvido ao espaço do usuário, depende de você.

    Como o x86 permite que aqueles em anéis altos mudem para os mais baixos, ele pode voltar para 3 depois que o manipulador de interrupção for concluído. Isso é o que acontece com todas as chamadas de sistema, pois todas as chamadas de sistema da perspectiva do hardware podem fazer qualquer coisa no sistema. Ele poderia executar todas as instruções do seu programa ao contrário e, em seguida, excluir todo o seu código da memória, se quisesse. Ou pode ser alternar para o anel 0 e iniciar a execução no início do seu programa. Como você pode ver, esses exemplos quebram a ideia do modo "kernel/usuário", pois esse conceito não existe no hardware. No linux, no entanto, é sempre implementado como uma chamada para o espaço do kernel e um retorno ao espaço do usuário (memória efetivamente não protegida do anel 0 em x86).

    Portanto, a alternância de modo kernel/usuário é implementada usando um manipulador de interrupção de software que pode sair do anel de proteção de threads, mas é implementado de forma que a execução ocorra apenas no espaço do kernel e seja retornada ao espaço do usuário, especificamente o processo do espaço do usuário que executou o syscall, mas somente após retornar ao anel 3.

    • 4

relate perguntas

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

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

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

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

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +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
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +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