< Return to Video

Lec 6 | MIT 6.033 Computer System Engineering, Spring 2005

  • 0:00 - 0:00
    Então no caso você está todo preocupado que você pode não ser no direito
  • 0:04 - 0:04
    classe, está ainda em 6.033.
    Se você está se perguntando o que
  • 0:07 - 0:07
    aconteceu com o cara de indiano que normalmente palestras,
  • 0:09 - 0:09
    ele está sentado logo ali.
    Nós somos troca fora palestras
  • 0:13 - 0:13
    em toda a classe.
    Eu vou fazer sobre o próximo
  • 0:16 - 0:16
    oito palestras até spring break, e então será o [Hari?]
  • 0:19 - 0:19
    Voltar.
    Então, meu nome é Sam,
  • 0:21 - 0:21
    e sinta-se livre para abordar questões sobre a palestra a
  • 0:24 - 0:24
    me.
    Por isso hoje vamos manter
  • 0:26 - 0:26
    falando sobre este conceito de aplicação de modularidade que nós
  • 0:29 - 0:29
    começou a falar sobre a última vez.
  • 0:40 - 0:40
    Então a última vez que vimos como poderíamos usar esta noção da
  • 0:44 - 0:44
    modelo de serviço do cliente a fim de separar os dois módulos de cada
  • 0:49 - 0:49
    outros.
    Então a idéia foi executando o
  • 0:52 - 0:52
    cliente e o serviço em máquinas separadas,
  • 0:56 - 0:56
    nós pode isolar estas duas coisas uns dos outros.
  • 1:00 - 1:00
    Assim nós podemos o fazer assim, por exemplo,
  • 1:02 - 1:02
    Quando o cliente quer invocar alguma operação no servidor,
  • 1:07 - 1:07
    que o servidor pode verificar o pedido que o cliente faz,
  • 1:11 - 1:11
    e certifique-se de que o cliente não está pedindo para fazer algo
  • 1:15 - 1:15
    malicioso.
    Da mesma forma, então isso é o que nós
  • 1:17 - 1:17
    vi a última vez que foi este modelo de serviço do cliente.
  • 1:20 - 1:20
    E assim foi o outro benefício do modelo de serviço de cliente
  • 1:24 - 1:24
    significava que nós poderia dissociar o cliente do serviço.
  • 1:28 - 1:28
    Assim que ele quis dizer que quando o cliente emitiu um pedido contra
  • 1:32 - 1:32
    o serviço, isso não significa necessariamente que o
  • 1:36 - 1:36
    cliente, se o serviço falhou quando o cliente emitido o
  • 1:39 - 1:39
    solicitar, não era necessariamente o caso que o cliente
  • 1:44 - 1:44
    também não.
    Assim o servidor pode falhar
  • 1:48 - 1:48
    executar a solicitação e, em seguida, o cliente receberia um
  • 1:51 - 1:51
    tempo de espera e seria capaz de repetir.
  • 1:53 - 1:53
    E da mesma forma, se o cliente falhou,
  • 1:56 - 1:56
    o servidor poderia continuar solicitações em nome
  • 1:59 - 1:59
    de outros clientes.
    OK, então o que era um bom
  • 2:02 - 2:02
    separação, a capacidade de dividir o cliente e o servidor distante
  • 2:05 - 2:05
    uns dos outros.
    Isso é uma coisa boa.
  • 2:07 - 2:07
    Mas o problema com esta abordagem é que tínhamos que ter
  • 2:10 - 2:10
    duas máquinas separadas.
    Foi a maneira que apresentamos este
  • 2:13 - 2:13
    que o cliente estava executando em um computador,
  • 2:15 - 2:15
    e o servidor estava funcionando em outro computador.
  • 2:18 - 2:18
    E se você pensar sobre isso, isso não é exatamente o que nós
  • 2:20 - 2:20
    quer, certo?
    Porque isso significa que,
  • 2:22 - 2:22
    Suponha que nós queremos construir um sistema de computador grande, complicado
  • 2:25 - 2:25
    que é composto por vários módulos diferentes.
  • 2:27 - 2:27
    Se temos de executar cada um desses módulos em separado
  • 2:30 - 2:30
    computador, que não é realmente muito ideal, certo?
  • 2:34 - 2:34
    Para construir um grande serviço, nós vamos precisar de muito
  • 2:38 - 2:38
    de computadores.
    E, claramente,
  • 2:40 - 2:40
    que não é a maneira que o computador sistemas que nós
  • 2:43 - 2:43
    realmente interagir com o trabalho.
    Então, o que vimos até agora é
  • 2:47 - 2:47
    Esta noção: temos um módulo por computador.
  • 2:49 - 2:49
    OK, e o que vamos fazer hoje é ver como podemos
  • 2:53 - 2:53
    generalizar isso assim que, em vez de ter um módulo por
  • 2:57 - 2:57
    computador, em vez disso temos vários módulos executando dentro
  • 3:01 - 3:01
    um único computador.
    Mas quando fazemos isso,
  • 3:04 - 3:04
    Nós ainda queremos manter este bom tipo de benefícios de proteção
  • 3:08 - 3:08
    que tivemos entre o cliente e serviço quando estes dois
  • 3:11 - 3:11
    as coisas estavam em execução em computadores separados.
  • 3:14 - 3:14
    OK, então a maneira que nós vamos fazer isso é através da criação de algo
  • 3:17 - 3:17
    chamamos um computador virtual.
    Assim-
  • 3:29 - 3:29
    O que vamos fazer é o que vamos criar essa noção de
  • 3:32 - 3:32
    vários computadores virtuais.
    Eles estão executando em um
  • 3:35 - 3:35
    único computador.
    E, em seguida, vamos correr
  • 3:37 - 3:37
    cada um destes módulos dentro de um computador virtual.
  • 3:40 - 3:40
    OK, e vou falar mais sobre o que quero dizer com uma virtual
  • 3:43 - 3:43
    computador durante todo o próximo par de palestras.
  • 3:46 - 3:46
    Mas a idéia é que um computador virtual tem exatamente o mesmo,
  • 3:49 - 3:49
    para um programa que está sendo executado nele, parece um virtual computadores
  • 3:52 - 3:52
    como estes cliente ou servidor de computadores podem ter
  • 3:55 - 3:55
    olhou.
    Agora, em particular,
  • 3:57 - 3:57
    um computador virtual tem o mesmo tipo de abstrações que nós
  • 4:00 - 4:00
    estudou nas palestras anteriores à sua disposição que um real
  • 4:03 - 4:03
    computador tem.
    Para que um computador virtual tem uma
  • 4:07 - 4:07
    memória virtual-
  • 4:13 - 4:13
    - e um processador virtual.
    Então, hoje o que nós vamos
  • 4:18 - 4:18
    é esta noção de uma memória virtual.
  • 4:21 - 4:21
    E assim que vocês provavelmente já viram o termo virtual
  • 4:26 - 4:26
    memória 6.004.
    Assim, a palavra deve estar familiarizada
  • 4:30 - 4:30
    para você.
    E vamos usar exatamente
  • 4:33 - 4:33
    a mesma abstração que usamos em 6.004.
  • 4:35 - 4:35
    Portanto vamos apenas mostrar como essa abstração pode ser usada para
  • 4:38 - 4:38
    fornecer essa proteção entre o cliente e o servidor que nós
  • 4:41 - 4:41
    quer.
    OK, nós também vamos
  • 4:42 - 4:42
    apresentar hoje esta noção de algo chamado um kernel.
  • 4:45 - 4:45
    E um kernel é algo que está no comando,
  • 4:47 - 4:47
    Basicamente, de gerenciar todas essas diferentes virtual
  • 4:50 - 4:50
    computadores que estão executando em nosso um computador físico.
  • 4:53 - 4:53
    Então o kernel vai ser o tipo de sistema que vai
  • 4:56 - 4:56
    para ser a parte do sistema que realmente sabe que lá
  • 4:59 - 4:59
    são vários computadores virtuais rodando
  • 5:01 - 5:01
    Este sistema.
    OK, então eu quero começar por
  • 5:05 - 5:05
    primeiro apenas falando por que queremos uma memória virtualizada,
  • 5:10 - 5:10
    por que a virtualização de memória é uma coisa boa.
  • 5:13 - 5:13
    Então eu vou abreviar a memória virtual como VM.
  • 5:16 - 5:16
    Então por que nós quer virtualizar a memória?
  • 5:19 - 5:19
    Bem, vamos ver o que pode acontecer de se construir um computador
  • 5:24 - 5:24
    sistema com vários módulos executando ao mesmo tempo
  • 5:28 - 5:28
    que não tem uma memória virtualizada.
  • 5:32 - 5:32
    Assim suponha que nós temos algum microprocessador e nós temos alguns
  • 5:38 - 5:38
    memória.
    E dentro desta memória,
  • 5:41 - 5:41
    Nós temos o código e dados para um par de módulos diferentes é
  • 5:48 - 5:48
    armazenados.
    Portanto, temos, digamos,
  • 5:50 - 5:50
    módulo A e módulo B e esta é as coisas como o
  • 5:56 - 5:56
    código e os dados que estes módulos estão usando atualmente
  • 6:02 - 6:02
    Execute.
    Assim, neste ambiente,
  • 6:07 - 6:07
    Suponha que o módulo, A, executa algumas instruções.
  • 6:12 - 6:12
    Então, se você pensar nisso como memória, digamos que esse módulo A
  • 6:18 - 6:18
    começa no endereço um aqui e o módulo B começa no endereço
  • 6:24 - 6:24
    B aqui.
    Então, suponho que módulo A
  • 6:27 - 6:27
    executa algumas instruções de como armazenar algum valor,
  • 6:32 - 6:32
    R1, no endereço de memória, B.
  • 6:36 - 6:36
    OK, então o módulo A grava memória endereço B aqui.
  • 6:39 - 6:39
    Assim, esta pode ser uma coisa problemática, direita,
  • 6:42 - 6:42
    porque se o microprocessador só permite que isso aconteça,
  • 6:46 - 6:46
    se ele apenas permite A para gravar na memória do módulo B,
  • 6:49 - 6:49
    em seguida, módulo B não tem como ser isolado do módulo A no
  • 6:53 - 6:53
    Está bem?
    Módulo A pode,
  • 6:55 - 6:55
    por exemplo, escrever algum tipo de lixo em
  • 6:58 - 6:58
    a memória do módulo B.
    E, em seguida, quando tenta módulo B
  • 7:02 - 7:02
    ler a partir desse endereço de memória, ele vai
  • 7:05 - 7:05
    dizer, experimentar e executar uma instrução ilegal, ou ele vai ler em
  • 7:08 - 7:08
    alguns dados que não fazem qualquer sentido.
  • 7:11 - 7:11
    Assim perdemos a separação, o isolamento que tivemos
  • 7:14 - 7:14
    entre se módulo A e módulo B são um cliente e um serviço
  • 7:17 - 7:17
    tentando interagir uns com os outros.
  • 7:19 - 7:19
    Nós perdemos esse tipo de habilidade.
  • 7:21 - 7:21
    Nós perdemos a capacidade de separar e isolar uns dos outros,
  • 7:25 - 7:25
    isolá-los uns dos outros que tivemos quando eles foram
  • 7:28 - 7:28
    em execução em computadores separados.
    Além disso,
  • 7:32 - 7:32
    Este tipo de arranjo de memória virtual.
  • 7:35 - 7:35
    Assim que um problema com isso é um pode substituir a memória do B.
  • 7:39 - 7:39
    Mas temos outro problema, o que é que este tipo de
  • 7:43 - 7:43
    arranjo também é muito, muito difícil de depurar.
  • 7:46 - 7:46
    Assim, esses tipos de erros podem ser muito difícil de rastrear.
  • 7:50 - 7:50
    E realmente, quando nós estamos construindo sistemas de computador,
  • 7:54 - 7:54
    Nós gostaríamos de livrar-se deles.
    Assim, por exemplo,
  • 7:57 - 7:57
    Suponha que das lojas na memória do B, substitui um
  • 8:01 - 8:01
    instrução que em algum lugar uma espécie de arbitrariamente dentro do B
  • 8:05 - 8:05
    memória.
    E então, 10.000 instruções
  • 8:09 - 8:09
    mais tarde, B tenta carregar em que endereço de memória e executar que
  • 8:12 - 8:12
    instrução.
    E torna-se um ilegal
  • 8:14 - 8:14
    instrução.
    Agora, imagine que você tem que
  • 8:17 - 8:17
    Depure este programa.
    Assim você sorte de está sentado
  • 8:19 - 8:19
    lá e assim você correr para fora com paciente B, e funciona apenas
  • 8:23 - 8:23
    muito bem.
    E, em seguida, executar A aplicação,
  • 8:25 - 8:25
    e A substitui parte da memória do B.
  • 8:27 - 8:27
    E agora, quando programa B é executado às vezes muito tempo depois do programa A,
  • 8:30 - 8:30
    é talvez, já encerrado, B misteriosamente cai sobre você.
  • 8:35 - 8:35
    Então, como você vai rastrear o problema?
  • 8:38 - 8:38
    É muito complicado, e é o tipo de problema
  • 8:40 - 8:40
    Isso é extremamente difícil de depurar esses tipos de problemas.
  • 8:43 - 8:43
    Então nós realmente gostaríamos de torná-lo assim que A não é capaz de
  • 8:46 - 8:46
    simplesmente substitua coisas arbitrárias na memória do B.
  • 8:49 - 8:49
    Nós gostaríamos de proteger A de B. OK, e isso é o que esta
  • 8:52 - 8:52
    abstração de memória virtual que vamos falar hoje sobre
  • 8:56 - 8:56
    vai fazer por nós.
    Então, se você pensar sobre como você
  • 8:59 - 8:59
    pode proteger A de B, a solução que você classificar de
  • 9:02 - 9:02
    chegar depois pensando nisso e olhando isso
  • 9:05 - 9:05
    para um pouco é o que você deseja verificar se todos os
  • 9:08 - 9:08
    acessos de memória que A não é acessos de memória realmente válido
  • 9:12 - 9:12
    que A deve fazer, assim, por exemplo,
  • 9:14 - 9:14
    que se referem a objetos que são, na verdade, que A atribuiu ou
  • 9:18 - 9:18
    que A possui.
    OK, então, a fim de fazer isso,
  • 9:22 - 9:22
    o que vamos precisar fazer é colocar algum tipo de
  • 9:27 - 9:27
    software entre os acessos de memória que faz de cada módulo,
  • 9:32 - 9:32
    e o acesso de memória real.
    Assim, a idéia é a seguinte.
  • 9:38 - 9:38
    Portanto, esta é a abstração de memória virtual.
  • 9:44 - 9:44
    OK, então a idéia é a seguinte.
    Para cada um dos nossos módulos,
  • 9:52 - 9:52
    digamos A e B, vamos criar o que na
  • 9:57 - 9:57
    conhecido como um espaço de endereço, OK?
  • 10:02 - 10:02
    E este espaço de endereço vai ser, por exemplo,
  • 10:07 - 10:07
    em um computador de 32 bits, dois para o 32, menos um, é
  • 10:12 - 10:12
    vai ser um espaço de memória de 32 bits.
  • 10:15 - 10:15
    Assim, é o espaço de endereço virtual de, digamos,
  • 10:20 - 10:20
    um processo, A.
    Assim, o processo A pode usar qualquer
  • 10:23 - 10:23
    Endereço de memória que está sendo este dois para o intervalo de 32 bits,
  • 10:29 - 10:29
    Razoável?
    Mas isso vai ser uma
  • 10:33 - 10:33
    espaço de endereço virtual.
    E o que quero dizer com isto é quando
  • 10:40 - 10:40
    processo A refere-se a algum endereço no mesmo espaço de memória,
  • 10:47 - 10:47
    chamá-lo de endereço virtual BA.
    Esse endereço vai ser
  • 10:53 - 10:53
    mapeados pelo sistema de memória virtual em um endereço físico,
  • 11:01 - 11:01
    Razoável?
    Então é este endereço virtual aqui
  • 11:04 - 11:04
    vai ser mapeado em algum endereço físico-
  • 11:13 - 11:13
    -em algum lugar dentro a memória física do sistema,
  • 11:18 - 11:18
    Razoável?
    Assim esta memória física da
  • 11:21 - 11:21
    sistema é também um espaço de 32 bits.
    Mas o tipo de mapeamento de
  • 11:26 - 11:26
    Este endereço virtual na memória para o físico
  • 11:31 - 11:31
    vai ser manipulado por essa memória virtual espaço de endereço
  • 11:36 - 11:36
    sistema.
    Então, agora a idéia é que cada
  • 11:39 - 11:39
    coisa que, digamos, um processo A ou B pode querer
  • 11:43 - 11:43
    referência vai ser mapeado em algum outro local
  • 11:47 - 11:47
    dentro desta memória.
    Assim, por exemplo,
  • 11:50 - 11:50
    o código de processo A ou de módulo A pode ser mapeado em um
  • 11:55 - 11:55
    localização e o código do módulo B vai ser mapeado
  • 11:59 - 11:59
    em um local diferente no espaço de endereço físico.
  • 12:04 - 12:04
    OK, então temos esta noção de espaços de endereçamento.
  • 12:07 - 12:07
    Cada módulo que está em execução no sistema em uma memória virtual
  • 12:11 - 12:11
    sistema vai ser atribuído a um desses espaços de endereço.
  • 12:15 - 12:15
    Este espaço de endereço vai ser, e este espaço de endereço
  • 12:18 - 12:18
    virtual no sentido de que esses endereços são válidos em apenas o
  • 12:22 - 12:22
    contexto deste dado módulo, OK?
  • 12:24 - 12:24
    E, eles traduzem, cada endereço virtual
  • 12:28 - 12:28
    espaço traduz-se em algum endereço no espaço físico.
  • 12:32 - 12:32
    Agora, se você olhar para isso por um minuto, você poderia pensar,
  • 12:35 - 12:35
    bem, este é tipo de confusão, pois B e um tanto têm agora uma
  • 12:38 - 12:38
    espaço de endereçamento de 32 bits.
    E só o próprio computador
  • 12:41 - 12:41
    tem um espaço de endereçamento de 32 bits.
    Assim, há uma classificação de mais
  • 12:44 - 12:44
    endereços entre todos os módulos do que o próprio computador
  • 12:47 - 12:47
    fisicamente tem.
    E, se você se lembra de
  • 12:49 - 12:49
    6.004, a história que nós dissemos-lhe sobre o que foi que,
  • 12:52 - 12:52
    bem, alguns desses endereços virtuais realmente podem ser mapeado
  • 12:55 - 12:55
    no disco no computador.
    Então, em 6.004,
  • 12:57 - 12:57
    memória virtual foi apresentada como uma maneira de criar um computador que
  • 13:01 - 13:01
    parecia ter uma memória mais física do que,
  • 13:03 - 13:03
    na verdade, fez.
    E a maneira que o que foi feito
  • 13:07 - 13:07
    foi mapear alguns desses endereços para disco.
  • 13:10 - 13:10
    Assim você pode ter endereços de B mapeado para disco.
  • 13:13 - 13:13
    E então, quando B tenta fazer referência a um endereço que
  • 13:17 - 13:17
    mapeado para o disco, o sistema iria carregar dados
  • 13:20 - 13:20
    de memória, carregar os dados do disco e na memória.
  • 13:23 - 13:23
    Portanto, não vamos falar sobre esse aspecto do virtual
  • 13:27 - 13:27
    memória muito hoje.
    A coisa a lembrar é apenas
  • 13:31 - 13:31
    que estas virtual endereço espaços, lá pode ser partes de
  • 13:34 - 13:34
    Este espaço de endereço virtual em cada um dos módulos que não é
  • 13:37 - 13:37
    na verdade é mapeado para qualquer espaço de endereço físico.
  • 13:40 - 13:40
    Portanto, se um destes módulos tenta usar um desses
  • 13:43 - 13:43
    espaços de endereço virtual não mapeado, não é permitido fazer isso.
  • 13:46 - 13:46
    Este sistema de memória virtual vai sinalizar um erro quando se tenta
  • 13:49 - 13:49
    fazer isso.
    E no seu computador,
  • 13:51 - 13:51
    às vezes você verá programas que irão misteriosamente caiu
  • 13:54 - 13:54
    com as coisas que dizem coisas como, tentei acessar um ilegal
  • 13:58 - 13:58
    Endereço de memória.
    Quando ele faz isso,
  • 14:00 - 14:00
    Isso é porque o programa tentar acessar algum local de memória
  • 14:03 - 14:03
    que não foi mapeado pelo sistema de memória virtual.
  • 14:11 - 14:11
    OK, então vamos mergulhar um pouco mais na verdade como neste virtual
  • 14:17 - 14:17
    abstração de memória funciona assim podemos tentar entender um pouco
  • 14:23 - 14:23
    pouco mais sobre o que está acontecendo.
    Por isso vai ser uma
  • 14:29 - 14:29
    hardware simplificado do BM, OK?
  • 14:32 - 14:32
    Ele é um pouco simplificado mesmo do que você aprendeu sobre
  • 14:36 - 14:36
    em 6.004.
    Assim, a idéia neste simplificado
  • 14:39 - 14:39
    o hardware é que temos nosso processador.
  • 14:42 - 14:42
    OK, e então nós vamos ter esse sistema de BM,
  • 14:45 - 14:45
    que às vezes é chamado uma unidade de gerenciamento de memória,
  • 14:49 - 14:49
    MMU.
    E, isso é um pedaço de
  • 14:50 - 14:50
    hardware que vai nos ajudar a fazer esse mapeamento destes
  • 14:55 - 14:55
    endereços lógicos dos módulos lidar com espaços para o
  • 14:59 - 14:59
    memória física.
    E então, nós vamos ter
  • 15:03 - 15:03
    a memória física, OK?
  • 15:05 - 15:05
    Agora a idéia é que, quando uma instrução tenta aceder a algumas
  • 15:10 - 15:10
    Endereço virtual, assim, por exemplo, suponha que nós
  • 15:14 - 15:14
    executar a instrução load algum endereço virtual,
  • 15:18 - 15:18
    carregar em R1 algum endereço virtual, OK?
  • 15:21 - 15:21
    O que vai acontecer quando nós fazemos, ou seja, que o
  • 15:25 - 15:25
    microprocessador vai enviar este endereço virtual para a VM
  • 15:30 - 15:30
    sistema.
    E, em seguida, o sistema VM vai
  • 15:34 - 15:34
    para traduzir isso em algum endereço físico que pode ser
  • 15:38 - 15:38
    resolvidos dentro da própria memória.
  • 15:41 - 15:41
    OK, na forma que o sistema de memória virtual vai decidir
  • 15:45 - 15:45
    esse mapeamento entre um endereço virtual e um endereço físico
  • 15:50 - 15:50
    está usando algo que chamamos de um mapa de página,
  • 15:53 - 15:53
    Razoável?
  • 16:01 - 16:01
    OK, então esta tabela é um exemplo.
  • 16:03 - 16:03
    Assim, este é um mapa de página.
    E o que uma página mapa basicamente
  • 16:06 - 16:06
    tem é apenas uma tabela de endereço virtual para o físico
  • 16:09 - 16:09
    mapeamentos de endereço.
    Portanto, este é o endereço virtual
  • 16:12 - 16:12
    para o endereço físico.
    Então a idéia é que, quando alguns
  • 16:15 - 16:15
    Endereço virtual vem aqui, o Gerenciador de memória virtual
  • 16:18 - 16:18
    Olha esse endereço virtual nesse mapa da página,
  • 16:21 - 16:21
    localiza o endereço físico correspondente,
  • 16:23 - 16:23
    e, em seguida, procura o endereço físico na memória real.
  • 16:28 - 16:28
    OK, então agora há mais um detalhe que precisamos,
  • 16:31 - 16:31
    direito?
    Então, o que isso nos dá é nós
  • 16:33 - 16:33
    ter esta noção de uma página de mapa que é nada para nós.
  • 16:37 - 16:37
    Mas o que estamos perdendo um detalhe é que, OK, o que queríamos estava para
  • 16:41 - 16:41
    cada um destes módulos diferentes que está executando o
  • 16:44 - 16:44
    sistema para ter um espaço de endereço diferente associado
  • 16:48 - 16:48
    ele.
    Então o que nós queremos é o que nós queremos
  • 16:50 - 16:50
    tem mapas da página separada para cada um destes módulos diferentes,
  • 16:53 - 16:53
    Assim, para o A e B, OK, vamos ter uma
  • 16:56 - 16:56
    mapa de página diferente.
    E nós estamos indo para ter este
  • 16:59 - 16:59
    classificação da mesma, podemos ter várias cópias
  • 17:02 - 17:02
    de um endereço virtual particular em cada um destes página mapas.
  • 17:07 - 17:07
    E então o que vamos fazer é o que vamos alocar um
  • 17:11 - 17:11
    registo especial no hardware, no processador.
  • 17:13 - 17:13
    Vamos adicionar um pequeno cadastro que vai permitir que
  • 17:17 - 17:17
    -na manter-se a par de que um destes página mapas que estamos atualmente
  • 17:21 - 17:21
    olhando, OK?
    Portanto, essa coisa é chamada a
  • 17:23 - 17:23
    PMAR ou o registro de endereço de página mapa.
  • 17:35 - 17:35
    OK, e o endereço da página mapa registrar simplesmente pontos em uma das
  • 17:39 - 17:39
    Estas página mapas.
    OK, então o que acontece é que o
  • 17:42 - 17:42
    sistema de memória virtual, quando se quer resolver um
  • 17:45 - 17:45
    Endereço virtual, olha para este endereço de mapa da página
  • 17:48 - 17:48
    Cadastre-se e usa-os para encontrar um ponteiro para o início da
  • 17:52 - 17:52
    mapa da página que está atualmente em uso.
  • 17:55 - 17:55
    E, em seguida, ele usa o mapa da página que está atualmente em uso para
  • 17:58 - 17:58
    resolver, para obter o endereço físico corresponde a esta
  • 18:02 - 18:02
    endereço lógico.
    OK, então isso é realmente o núcleo
  • 18:06 - 18:06
    conceito de memória virtual.
    Então o que temos agora é que nós temos
  • 18:10 - 18:10
    Este registo de endereço de mapa de página que pode ser usado para selecionar quais
  • 18:15 - 18:15
    um desses espaços de endereço que estamos usando atualmente.
  • 18:19 - 18:19
    OK e então quando nós selecionamos, por exemplo,
  • 18:22 - 18:22
    o mapa de módulo A páginas e, em seguida, módulo um pode apenas referir-se
  • 18:26 - 18:26
    endereços virtuais que estão em seu mapa de página.
  • 18:30 - 18:30
    E esses endereços virtuais podem mapear apenas em certa física
  • 18:34 - 18:34
    endereços.
    Assim, por exemplo,
  • 18:35 - 18:35
    Suponha que este bloco aqui é o conjunto de endereços virtuais,
  • 18:39 - 18:39
    o conjunto de endereços físicos que correspondem a virtual
  • 18:43 - 18:43
    endereços na página mapa.
    OK, estas são apenas física
  • 18:46 - 18:46
    endereços que A falar.
    Por isso, se nós, por exemplo,
  • 18:50 - 18:50
    tenho um bloco diferente de endereços de memória que correspondem
  • 18:53 - 18:53
    para os endereços virtuais que B pode fazer referência,
  • 18:56 - 18:56
    podemos ver que não há nenhuma maneira para o módulo A ser capaz de
  • 18:59 - 18:59
    referência qualquer da memória que B usa.
  • 19:03 - 19:03
    Assim, somos capazes de separar totalmente a memória física,
  • 19:08 - 19:08
    pedaços de memória física que A e B podem falar usando
  • 19:13 - 19:13
    Esse mecanismo de mapa de página que a memória virtual nos dá.
  • 19:17 - 19:17
    Então, basicamente o que fizemos é que espécie de adicionamos este
  • 19:22 - 19:22
    camada extra de engano, este sistema de memória virtual,
  • 19:26 - 19:26
    que obtém para mapear endereços virtuais em físicos
  • 19:30 - 19:30
    endereços.
    Por isso o resto esta palestra é
  • 19:34 - 19:34
    realmente vai para ser detalhes sobre como podemos fazer este trabalho,
  • 19:39 - 19:39
    sobre como podemos realmente decidir, como podemos atribuir este PMAR
  • 19:43 - 19:43
    registo baseado em que um dos módulos é atualmente
  • 19:47 - 19:47
    execução sobre coisas como o que o formato deste mapa da página
  • 19:52 - 19:52
    tabela vai parecer, OK?
  • 19:54 - 19:54
    Assim, este é realmente o conceito-chave.
  • 19:57 - 19:57
    Então agora o que eu quero fazer é uma espécie de voltar para esta segunda
  • 20:01 - 20:01
    pergunta que fiz, que é, como funciona essa coisa de mapa da página
  • 20:06 - 20:06
    realmente funciona?
    Como ele realmente é representado?
  • 20:10 - 20:10
    Portanto, uma representação muito simples de um mapa de página
  • 20:13 - 20:13
    pode ser que simplesmente é um ponteiro para o mapa de página apenas
  • 20:18 - 20:18
    diz onde A memória começa no processador,
  • 20:21 - 20:21
    direito?
    Portanto, é apenas um valor.
  • 20:23 - 20:23
    Ele diz que A memória começa neste local no físico
  • 20:27 - 20:27
    memória e todos os endereços virtuais devem ser resolvidas
  • 20:31 - 20:31
    em relação a este local de início da memória.
  • 20:35 - 20:35
    O problema com essa representação é que não é
  • 20:39 - 20:39
    muito flexível.
    Assim, por exemplo,
  • 20:42 - 20:42
    Suponha que haja um terceiro módulo, C, que é colocado para fora na memória
  • 20:47 - 20:47
    ao lado a.
    Assim, o seu armazenamento é colocado direito
  • 20:50 - 20:50
    ao lado de A na memória.
    E agora, suponha que A quer
  • 20:54 - 20:54
    alocar alguma memória adicional que pode usar.
  • 20:58 - 20:58
    Agora, para isso, se o mapa da página é simplesmente uma
  • 21:02 - 21:02
    único ponteiro para o início do espaço, de endereço
  • 21:07 - 21:07
    Estamos tipo de problemas.
    Nós apenas não é possível adicionar memória para
  • 21:12 - 21:12
    parte inferior porque então nós iria se sobrepor C.
  • 21:14 - 21:14
    Então nós vamos ter que mover toda A memória em torno de
  • 21:17 - 21:17
    fim de ser capaz de fazer o espaço para isso.
  • 21:20 - 21:20
    OK, então isso parece como um pouco problemático simplesmente tê-lo
  • 21:23 - 21:23
    ser um ponteiro.
    A outra coisa que podemos fazer é
  • 21:26 - 21:26
    Suponha que poderia, em vez disso, temos um diferente
  • 21:28 - 21:28
    opção onde poderíamos dizer, por exemplo,
  • 21:30 - 21:30
    para cada endereço virtual em um espaço, de endereço
  • 21:33 - 21:33
    Então, para cada valor de 32 bits que A quer resolver,
  • 21:35 - 21:35
    pode haver uma entrada na tabela de mapa nesta página,
  • 21:38 - 21:38
    direito?
    Portanto, para cada 32 bits virtual
  • 21:40 - 21:40
    Endereço, haveria um correspondente físico de 32 bits
  • 21:43 - 21:43
    Endereço.
    E havia apenas um
  • 21:46 - 21:46
    mapeamento entre todas estas coisas.
  • 21:48 - 21:48
    Assim, se A poderia fazer referência a 1 milhão de blocos de memória,
  • 21:51 - 21:51
    haveria 1 milhão entradas nesta tabela de mapa de página.
  • 21:54 - 21:54
    Então, se você pensar sobre isso por um minuto, que soa como tipo
  • 21:57 - 21:57
    de uma má idéia, também, porque agora estas tabelas
  • 21:59 - 21:59
    são totalmente enorme, à direita e na verdade eles são
  • 22:02 - 22:02
    quase tão grande quanto a memória de si, certo,
  • 22:04 - 22:04
    porque se eu tenho 1 milhão de entradas, se fazer referência A um
  • 22:07 - 22:07
    milhões de blocos, então eu vou precisar de um
  • 22:09 - 22:09
    milhões de entradas na tabela.
    Assim, a tabela torna-se apenas como
  • 22:14 - 22:14
    grande como a própria memória.
    Para isso precisamos de alguns entre tipo
  • 22:19 - 22:19
    híbrido de alternativa entre estes dois extremos.
  • 22:24 - 22:24
    E a idéia, mais uma vez, é muito simples.
  • 22:27 - 22:27
    E você viu isso em 6.004.
    Então a idéia é aproveitar esta
  • 22:32 - 22:32
    Endereço virtual de 32 bits.
    Assim, suponho que este é o nosso 32 bits
  • 22:38 - 22:38
    Endereço virtual.
    Agora o que vamos fazer é
  • 22:41 - 22:41
    Vamos dividi-lo em dois pedaços, um número de página e um
  • 22:47 - 22:47
    deslocamento.
    OK, e vamos escolher
  • 22:50 - 22:50
    alguns tamanho para estas duas coisas.
    Por enquanto eu vou apenas arbitrariamente
  • 22:55 - 22:55
    escolher um número de página 20 bit e um bit 12 deslocamento.
  • 23:00 - 23:00
    OK, então o que isso vai fazer, então agora o que vamos
  • 23:05 - 23:05
    fazer é em vez de armazenar uma única palavra de memória em cada
  • 23:10 - 23:10
    entrada nesta tabela, vamos guardar uma página de
  • 23:15 - 23:15
    memória em cada entrada na tabela.
  • 23:18 - 23:18
    Assim-
  • 23:29 - 23:29
    Então, esta tabela vai olhar como um mapeamento entre uma página,
  • 23:35 - 23:35
    e um endereço físico.
    OK, assim que uma página é,
  • 23:40 - 23:40
    assim se o número da página é de 20 bits longos, então isso significa que
  • 23:46 - 23:46
    cada página vai ser dois para os bits 12 grandes,
  • 23:51 - 23:51
    que é igual a, digamos, 4.096 palavras,
  • 23:54 - 23:54
    Razoável?
    Então a idéia é que nós estamos indo
  • 23:58 - 23:58
    ter duas páginas XX dentro de cada espaço de endereço,
  • 24:04 - 24:04
    e cada página vai mapear um destes 4.096 bytes
  • 24:09 - 24:09
    blocos, OK?
    Então, se temos aqui a nossa memória
  • 24:16 - 24:16
    nesta página, digamos, página vai mapear em
  • 24:21 - 24:21
    algum endereço físico.
    E página dois vai mapear
  • 24:27 - 24:27
    em alguns outro bloco físico, OK, então cada uma dessas coisas
  • 24:35 - 24:35
    agora é 4.096 bytes, cada bloco aqui,
  • 24:40 - 24:40
    Razoável?
    E assim é esta,
  • 24:42 - 24:42
    Vamos apenas expandir isso.
    Por isso agora é uma página.
  • 24:46 - 24:46
    E vai ser usado a fim de procurar esse deslocamento de 12 bits
  • 24:50 - 24:50
    a palavra que queremos realmente olhar nesta página.
  • 24:55 - 24:55
    Assim, se o endereço virtual, digamos, por exemplo,
  • 24:59 - 24:59
    um deslocamento de página zero, o que vai fazer é
  • 25:02 - 25:02
    Vamos olhar para cima no mapa da página.
  • 25:05 - 25:05
    Nós vamos encontrar o número de página que corresponde,
  • 25:10 - 25:10
    Nós vamos encontrar um número de página.
  • 25:14 - 25:14
    Nós vamos encontrar o físico endereço que
  • 25:17 - 25:17
    corresponde a ele, nós estamos indo para ir para baixo aqui,
  • 25:20 - 25:20
    e olhar para este bloco de memória.
  • 25:22 - 25:22
    E então dentro desta memória 4.096 bloco,
  • 25:25 - 25:25
    Vamos tomar o endereço zero, a primeira palavra dentro desse
  • 25:29 - 25:29
    coisa, OK?
    Então agora o tamanho destas página
  • 25:32 - 25:32
    tabelas é muito menor, certo?
  • 25:34 - 25:34
    Eles já não são dois a 30 bits.
  • 25:37 - 25:37
    Agora são dois para 20 bits, que é um número pequeno
  • 25:42 - 25:42
    de megabytes grandes.
    Mas nós tenho evitado este problema
  • 25:45 - 25:45
    que temos.
    Temos alguma flexibilidade em
  • 25:49 - 25:49
    termos de como os mapas de cada página na memória física.
  • 25:53 - 25:53
    Assim eu pode alocar uma terceira página, a um processo.
  • 25:56 - 25:56
    E pode mapear que em qualquer bloco de 4.096 bytes que está em
  • 26:00 - 26:00
    memória que está atualmente não utilizado.
    OK, então eu tenho flexibilidade.
  • 26:06 - 26:06
    Eu não tenho esse problema, dizem, onde A e C foram
  • 26:09 - 26:09
    colidir uns com os outros.
  • 26:19 - 26:19
    OK, então este é o tipo de contorno de memória como virtual
  • 26:23 - 26:23
    obras.
    Mas o que eu não tenho ainda
  • 26:25 - 26:25
    descrevi-lhe é como é que podemos realmente ir
  • 26:30 - 26:30
    Criando estas diferentes resolver espaços que são alocados para o
  • 26:34 - 26:34
    módulos diferentes, e como nós pode alternar entre
  • 26:38 - 26:38
    diferentes módulos usando este registo PMAR.
  • 26:42 - 26:42
    Então que tipo de descrevi isso como, suponho que esses dados
  • 26:45 - 26:45
    existem estruturas, agora aqui é como podemos usá-los.
  • 26:48 - 26:48
    Mas ainda não contei para vocês como essas estruturas de dados, todos se
  • 26:51 - 26:51
    juntos e criado e definido acima para começar com.
  • 26:54 - 26:54
    E sugeri isso no início.
  • 26:56 - 26:56
    Mas para isso, o que vamos precisar é
  • 26:59 - 26:59
    algum tipo de um módulo de supervisão especial que pode
  • 27:02 - 27:02
    olhar para a página de mapas para todos estes diferentes,
  • 27:05 - 27:05
    que é capaz de criar novos mapas de página e olhar para os página de mapas
  • 27:08 - 27:08
    para todos os módulos diferentes que estão dentro do sistema.
  • 27:13 - 27:13
    E o módulo de supervisão vai ser capaz de fazer coisas
  • 27:17 - 27:17
    como adicionar memória nova a um mapa de página ou ser capaz de destruir,
  • 27:21 - 27:21
    Exclua um módulo específico e seu mapa de página associado.
  • 27:24 - 27:24
    Por isso precisamos de algum tipo de coisa que pode gerenciar tudo isso
  • 27:28 - 27:28
    infra-estrutura.
    Assim, este módulo de supervisão-
  • 27:37 - 27:37
    -é chamado o kernel.
    OK, e o kernel é realmente,
  • 27:41 - 27:41
    vai ser a única coisa que vai ser responsável de
  • 27:46 - 27:46
    gerenciar todas essas estruturas de dados para nós.
  • 27:49 - 27:49
    Assim-
  • 27:58 - 27:58
    Então, aqui está nosso microprocessador com seu PMAR Registe-se.
  • 28:03 - 28:03
    E, o que vamos fazer é o que vamos estender o
  • 28:07 - 28:07
    microprocessador com uma peça adicional de hardware,
  • 28:11 - 28:11
    e este é o bit de kernel do usuário, OK?
  • 28:14 - 28:14
    Assim, este é apenas um pouco especifica se estamos
  • 28:17 - 28:17
    um módulo de usuário que é apenas um programa em execução no momento que
  • 28:22 - 28:22
    execução no seu computador, ou se o kernel está
  • 28:26 - 28:26
    atualmente executado, OK?
  • 28:29 - 28:29
    E a idéia com este bit kernel é que quando este kernel bit
  • 28:35 - 28:35
    é definida, o código que está executando o vai ter especial
  • 28:40 - 28:40
    privilégios.
    Ele vai ser capaz de
  • 28:44 - 28:44
    Manipule coisas especiais sobre o hardware e o processador.
  • 28:50 - 28:50
    E, em particular, nós vamos ter uma regra que
  • 28:54 - 28:54
    diz-se que apenas o kernel pode alterar o PMAR,
  • 28:59 - 28:59
    Razoável?
    Assim o PMAR é a coisa que
  • 29:02 - 29:02
    Especifica qual processo está sendo executado,
  • 29:04 - 29:04
    e seleciona quais queremos ser usando do espaço de endereçamento.
  • 29:07 - 29:07
    E o que vamos usar é o que vamos usar,
  • 29:10 - 29:10
    então o que vamos fazer é ter o kernel a ser a coisa
  • 29:13 - 29:13
    que é responsável por manipular o valor do registo PMAR
  • 29:17 - 29:17
    para selecionar qual coisa atualmente está sendo executada.
  • 29:19 - 29:19
    E queremos e eles ficam para que apenas o kernel pode fazer isso
  • 29:23 - 29:23
    porque se nós, por exemplo,
  • 29:24 - 29:24
    permitido um destes outros programas para ser capaz de
  • 29:27 - 29:27
    manipular o PMAR, direito, então esse outro programa
  • 29:29 - 29:29
    pode ser capaz de fazer algo desagradável para o computador,
  • 29:32 - 29:32
    direito?
    Ele altera o PMAR para apontar para
  • 29:36 - 29:36
    alguns outros memória do programa.
    E agora, de repente, todos os
  • 29:39 - 29:39
    endereços de memória no sistema vai ser resolvido.
  • 29:42 - 29:42
    Então de repente, nós vamos ser o tipo de
  • 29:44 - 29:44
    resolução de endereços de memória em relação a algum outro módulo
  • 29:47 - 29:47
    mapa da página.
    E que é provável que seja um
  • 29:49 - 29:49
    coisa problemática.
    É provável que fazer com que outros
  • 29:52 - 29:52
    módulo para bater, por exemplo,
  • 29:53 - 29:53
    porque o processador está configurado para executar as instruções
  • 29:56 - 29:56
    o programa atual.
    Por isso queremos ter certeza que
  • 29:59 - 29:59
    apenas algo este kernel pode alterar o PMAR.
  • 30:03 - 30:03
    E este kernel vai ser esse tipo de módulo de supervisão
  • 30:07 - 30:07
    que todos os outros módulos vão ter a confiança para
  • 30:10 - 30:10
    tipo de fazer a coisa certa e gerenciar a execução do computador
  • 30:14 - 30:14
    Para você.
    E este kernel,
  • 30:15 - 30:15
    exceto para este uma diferença que um kernel pode alterar o
  • 30:19 - 30:19
    PMAR, o kernel é, em todos os outros aspectos,
  • 30:21 - 30:21
    essencialmente apenas vai para ser outro módulo que está sendo executado no
  • 30:25 - 30:25
    o sistema de computador.
    Assim, em particular,
  • 30:27 - 30:27
    o kernel também vai ter um destes 32 bits virtual
  • 30:31 - 30:31
    espaços de endereço associados a ele, OK?
  • 30:34 - 30:34
    Mas, o que vamos fazer é o que vamos dizer que o
  • 30:38 - 30:38
    núcleo no mesmo espaço de endereço tem todos os mapas de página de todos os
  • 30:42 - 30:42
    os outros programas que estão actualmente em execução no sistema
  • 30:47 - 30:47
    mapeado para o espaço de endereço.
    OK, então isso é um pouco
  • 30:51 - 30:51
    complicado porque apresentei isso como se A e B referenciado
  • 30:55 - 30:55
    peças totalmente diferentes de memória.
  • 30:57 - 30:57
    Assim, espécie de afirmei até agora apenas sobre os módulos que estão
  • 31:01 - 31:01
    fazendo referência a conjuntos disjuntos de memória.
  • 31:05 - 31:05
    Mas na verdade estes mapas da página, à direita, apenas residem em
  • 31:09 - 31:09
    memória em algum lugar.
    E ele é muito bem se eu,
  • 31:12 - 31:12
    por exemplo, tem vários módulos que são
  • 31:15 - 31:15
    capazes de referenciar, que têm o mesmo físico
  • 31:18 - 31:18
    endereços mapeados em seu espaço de endereço virtual.
  • 31:22 - 31:22
    Por isso, é muito provável que eu poderia querer ter algo
  • 31:25 - 31:25
    aqui na parte inferior que tanto A e B podem acessar.
  • 31:30 - 31:30
    Então, isso pode ser coisas que serão compartilhadas entre A e b.
  • 31:33 - 31:33
    Pode mapear que em ambos A e na B memória.
  • 31:36 - 31:36
    Da mesma forma, o que eu vou fazer é que eu sou
  • 31:39 - 31:39
    vai mapear esses mapas de página, que também são armazenados na memória
  • 31:42 - 31:42
    em todos os mapas da página no espaço de endereço do kernel.
  • 31:46 - 31:46
    Então o kernel vai ser capaz de fazer referência o endereço
  • 31:49 - 31:49
    espaços de todos os módulos.
    E o kernel também vai
  • 31:53 - 31:53
    manter uma Mesinha de todos a página mapas para todos os
  • 31:56 - 31:56
    programas atualmente em execução no sistema.
  • 32:00 - 32:00
    Estas são, por exemplo,
  • 32:01 - 32:01
    página de mapas para A e b.
    E esta é uma lista de todos os
  • 32:04 - 32:04
    mapas que estão actualmente em execução no sistema.
  • 32:07 - 32:07
    Então, o que vai acontecer, agora, o que pode acontecer é porque
  • 32:10 - 32:10
    o kernel é permitido alterar o PMAR, e ele sabe
  • 32:14 - 32:14
    sobre a localização de todos os outros espaços de endereço que está em
  • 32:18 - 32:18
    o sistema, quando se quer começar a correr um desses
  • 32:21 - 32:21
    programas que está em execução no sistema, ele pode alterar o valor
  • 32:24 - 32:24
    da PMAR ser sorte do PMAR para o A ou o PMAR para B.
  • 32:28 - 32:28
    E, ele pode manipular todos os valores de registradores na
  • 32:31 - 32:31
    sistema de modo que você pode iniciar a execução de código por um destes.
  • 32:35 - 32:35
    Você pode alternar entre um destes dois módulos.
  • 32:39 - 32:39
    Assim o processo de comutação entre qual módulo
  • 32:42 - 32:42
    está sendo executado.
    Vamos focar no que
  • 32:44 - 32:44
    mais da próxima vez.
    Assim, não se preocupe muito se você
  • 32:47 - 32:47
    não entendo os detalhes de como você realmente mudar de
  • 32:50 - 32:50
    execução de um programa para outro programa.
  • 32:52 - 32:52
    Mas, você pode ver que o kernel pode alternar qual endereço
  • 32:55 - 32:55
    espaço está ativo no momento, simplesmente manipulando o valor de
  • 32:58 - 32:58
    Este registo PMAR.
    Além disso,
  • 33:01 - 33:01
    o kernel pode fazer coisas como ele pode criar um novo mapa.
  • 33:04 - 33:04
    Então o kernel pode simplesmente alocar dentre estes novos
  • 33:07 - 33:07
    tabelas e ele podem criar um mapeamento de um conjunto de virtual
  • 33:11 - 33:11
    aborda-se a um conjunto de endereços físicos para que você possa criar
  • 33:15 - 33:15
    um novo espaço de endereçamento que um novo módulo pode iniciar a execução
  • 33:19 - 33:19
    dentro.
    Da mesma forma, o kernel pode fazer
  • 33:21 - 33:21
    coisas como alocam memória nova em um desses endereços.
  • 33:25 - 33:25
    Assim ele pode mapear alguns endereços virtuais adicionais em real
  • 33:29 - 33:29
    memória física para que quando um destes módulos,
  • 33:32 - 33:32
    digamos, por exemplo, solicitações de memória adicional para
  • 33:35 - 33:35
    executar, o kernel pode adicionar que a memória, adicione uma entrada para o
  • 33:39 - 33:39
    tabela assim que novo memória que o programa solicitou
  • 33:42 - 33:42
    na verdade mapeia para um endereço físico válido.
  • 33:47 - 33:47
    OK, então, é claro, então resta saber
  • 33:50 - 33:50
    assim você pode ver o valor de ter este módulo do kernel.
  • 33:54 - 33:54
    Mas a questão é, como nós nos comunicamos entre
  • 33:58 - 33:58
    Estes módulos que executam esses módulos de nível de usuário que
  • 34:02 - 34:02
    estão em execução e o módulo do kernel que os módulos de usuário
  • 34:07 - 34:07
    necessidade de chamar, por exemplo,
  • 34:09 - 34:09
    memória de novo pedido.
    Assim a maneira que nós estamos indo
  • 34:13 - 34:13
    fazer que isso é como nós fizemos tudo mais nesta palestra
  • 34:16 - 34:16
    até agora: adicionando um pouco de extra, por alterar a
  • 34:20 - 34:20
    processador só um pouco.
    Assim, em particular,
  • 34:22 - 34:22
    o que vamos fazer-
  • 34:37 - 34:37
    É o que vamos fazer é adicionar essa noção de uma
  • 34:42 - 34:42
    chamada de supervisor.
    Chame esse SDC.
  • 34:45 - 34:45
    Então chamar um supervisor é simplesmente uma instrução especial que está na
  • 34:50 - 34:50
    o processador que invoca o kernel.
  • 34:54 - 34:54
    Assim quando o supervisor chamar instrução se,
  • 34:58 - 34:58
    ele vai configurar o estado destes kernel PMAR e usuário
  • 35:04 - 35:04
    instruções de bit para que o kernel pode começar a execução.
  • 35:10 - 35:10
    Também vai chamar o supervisor.
  • 35:12 - 35:12
    Mas quando o supervisor chamar instrução é executada,
  • 35:16 - 35:16
    temos de ser um baixo, mas cuidado, porque nós também precisamos decidir
  • 35:21 - 35:21
    de alguma forma que o código dentro do kernel queremos começar
  • 35:25 - 35:25
    executando quando executa a instrução de chamada de supervisor,
  • 35:29 - 35:29
    direito?
    Assim que o supervisor call
  • 35:31 - 35:31
    instrução faz é que ele aceita um parâmetro que é o nome de um
  • 35:36 - 35:36
    função de chamada de portão.
    Assim, uma função de portão é um bem
  • 35:41 - 35:41
    definido o ponto de entrada em outro módulo que pode ser usado para
  • 35:46 - 35:46
    invoca um pedaço de código em outro módulo.
  • 35:49 - 35:49
    Assim, por exemplo, o kernel vai ter um
  • 35:53 - 35:53
    função de porta específica que corresponde à atribuição de
  • 35:57 - 35:57
    memória adicional para um módulo.
    Assim, quando executa um programa de usuário
  • 36:04 - 36:04
    uma instrução, chamada de supervisor,
  • 36:08 - 36:08
    para portão dizer por exemplo, isso pode ser alguma memória
  • 36:14 - 36:14
    código de alocação, esta instrução especial é
  • 36:19 - 36:19
    vai para fazer as seguintes coisas.
  • 36:23 - 36:23
    Primeiro ele vai definir o bit de kernel do usuário para o kernel.
  • 36:30 - 36:30
    Em seguida, vai definir o valor de registo para PMAR
  • 36:37 - 36:37
    o mapa de páginas do kernel.
    Ele vai salvar o programa
  • 36:44 - 36:44
    contador para a instrução atualmente em execução,
  • 36:48 - 36:48
    e, em seguida, ele vai definir o contador de programa para ser o
  • 36:53 - 36:53
    Endereço da função portão, OK?
  • 36:55 - 36:55
    Assim que introduzimos uma instrução de processador novo especial que
  • 37:01 - 37:01
    leva estas etapas.
    Assim, quando esta instrução é
  • 37:05 - 37:05
    executado, que essencialmente mudar em execução dentro do
  • 37:10 - 37:10
    espaço de endereço do kernel.
    OK e este kernel,
  • 37:14 - 37:14
    N, podemos começar a execução dentro do espaço de endereço do kernel na
  • 37:20 - 37:20
    Endereço desta função de portão dentro de endereço do kernel
  • 37:25 - 37:25
    espaço.
    OK, então o que isso tem feito é
  • 37:28 - 37:28
    Este é um ponto de entrada bem definidas.
  • 37:32 - 37:32
    Se o programa tentar executar essa instrução com o nome
  • 37:35 - 37:35
    de uma função de portão que não existe, então, que o programa é
  • 37:38 - 37:38
    vai para obter um erro quando se tenta fazer isso.
  • 37:41 - 37:41
    Então o programa pode apenas nomear funções de portão que realmente
  • 37:44 - 37:44
    correspondem às coisas reais que o sistema operacional pode fazer,
  • 37:47 - 37:47
    que o kernel pode fazer.
    E, portanto, o kernel então
  • 37:50 - 37:50
    vai ser chamado e tomar a ação que foi solicitada
  • 37:53 - 37:53
    do mesmo.
    No retorno, essencialmente,
  • 37:54 - 37:54
    Assim, quando o kernel termina a execução desse processo,
  • 37:57 - 37:57
    quando ele termina a execução, a dizer, a alocação de memória
  • 38:00 - 38:00
    instrução, estamos apenas indo para reverter esta etapa.
  • 38:04 - 38:04
    Então vamos apenas definir o PMAR ser, vamos definir
  • 38:08 - 38:08
    o PMAR volta ao programa do usuário.
  • 38:10 - 38:10
    Vamos definir o bit de kernel do usuário de volta no modo de usuário.
  • 38:14 - 38:14
    E então, vamos voltar para o endereço de retorno salvo
  • 38:18 - 38:18
    que nós aqui, salvo o contador de programa memorizado
  • 38:21 - 38:21
    Endereço do programa do usuário.
    Assim, quando o programa termina,
  • 38:25 - 38:25
    Quando o kernel termina este serviço em execução
  • 38:28 - 38:28
    instrução, o controle retornará apenas voltar para o programa
  • 38:32 - 38:32
    no lugar onde o programa precisa para começar a execução.
  • 38:36 - 38:36
    OK, então agora usando esta porta, então usando esta noção
  • 38:40 - 38:40
    então o que temos visto até agora é a capacidade para o,
  • 38:44 - 38:44
    podemos usar a abstração de memória virtual para proteger
  • 38:49 - 38:49
    as referências de memória de dois módulos entre si.
  • 38:53 - 38:53
    E nós vemos quando temos essa noção do kernel que pode ser
  • 38:58 - 38:58
    usado para, por exemplo, que pode ser usado para gerenciar
  • 39:01 - 39:01
    Estes espaços de endereçamento para alocar memória nova para estes endereços
  • 39:06 - 39:06
    espaços e em geral, espécie de gerenciar esses endereços
  • 39:10 - 39:10
    espaços.
    Então este kernel também vai
  • 39:15 - 39:15
    nos permitir fazer exatamente o que definimos a tentar fazer,
  • 39:21 - 39:21
    que é agir como o intermediário chamado confiável
  • 39:26 - 39:26
    entre, digamos, por exemplo, um cliente e um servidor que executa o
  • 39:32 - 39:32
    na mesma máquina.
  • 39:40 - 39:40
    OK, então eu confio que intermediário é apenas um pedaço de
  • 39:43 - 39:43
    código.
    Assim, suponha que temos um cliente e
  • 39:45 - 39:45
    um servidor, à direita e estes são dois pedaços de
  • 39:47 - 39:47
    código escrito por dois programadores diferentes.
  • 39:49 - 39:49
    Talvez os dois desenvolvedores não necessariamente confiam que o outro
  • 39:52 - 39:52
    desenvolvedor tem escrito um pedaço de código que é 100% infalível
  • 39:55 - 39:55
    porque ele não tem quaisquer erros.
  • 39:57 - 39:57
    Mas ambos os desenvolvedores podem estar dispostos a dizer que eles
  • 40:00 - 40:00
    vai confiar que o kernel está escrito corretamente e não
  • 40:03 - 40:03
    tem algum bug nele.
    E assim eles estão dispostos a
  • 40:07 - 40:07
    permitir que o kernel sentar-se entre esses dois programas e
  • 40:12 - 40:12
    Certifique-se de que nenhum deles tem qualquer maus interações com
  • 40:17 - 40:17
    Um ou outro.
    Então vamos ver como podemos usar
  • 40:20 - 40:20
    Este kernel, o kernel combinado com memória virtual a fim de
  • 40:25 - 40:25
    ser capaz de fazer isso.
    Assim, suponho que este é nosso kernel.
  • 40:30 - 40:30
    Então, a idéia é que este kernel em execução tem, suponha que nós temos
  • 40:33 - 40:33
    [sue]? processos A e B que querem se comunicar com cada um
  • 40:37 - 40:37
    outros un de alguma forma.
    E, nós já dissemos que nós
  • 40:39 - 40:39
    não quero que esses dois processos para ser capaz de referenciar diretamente
  • 40:42 - 40:42
    em cada um dos outros do memória porque que se torna dependente
  • 40:46 - 40:46
    Um ou outro.
    Isso significa que se houver um bug
  • 40:48 - 40:48
    em A, que A pode substituir alguma memória no espaço de endereço do B e
  • 40:51 - 40:51
    causa B [OBSCURECE ruído].
    Então, isso ' uma coisa ruim.
  • 40:54 - 40:54
    Então, ao invés, o que vamos fazer é o que vamos criar,
  • 40:57 - 40:57
    bem, uma coisa que podemos fazer é criar um conjunto especial de estas
  • 41:01 - 41:01
    chamadas de supervisor que estes dois módulos podem usar para interagir com
  • 41:04 - 41:04
    Um ou outro.
    Assim, em particular,
  • 41:07 - 41:07
    talvez dentro do kernel mantemos uma fila de mensagens
  • 41:11 - 41:11
    que esses dois programas estão trocando uns com os outros,
  • 41:16 - 41:16
    uma lista das mensagens que eles estão trocando.
  • 41:19 - 41:19
    E, em seguida, suponha que A é, que vamos chamar esse cara,
  • 41:23 - 41:23
    A é um produtor.
    Ele está criando mensagens.
  • 41:26 - 41:26
    E B é um consumidor.
    Pode chamadas alguma função como
  • 41:30 - 41:30
    Posto que supervisionará a sua chamada como colocar que causará um
  • 41:34 - 41:34
    item de dados para ser colocado nessa fila.
  • 41:38 - 41:38
    E algum tempo depois, B pode chamar essa chamada de supervisor
  • 41:41 - 41:41
    Obter e puxar esse valor fora da fila, OK?
  • 41:43 - 41:43
    Então, em desta forma, o produtor e o consumidor
  • 41:46 - 41:46
    podem interagir uns com os outros.
    Eles podem trocar dados com
  • 41:49 - 41:49
    uns dos outros e porque temos essa interface de portão,
  • 41:51 - 41:51
    Esta interface de porta bem definidas com essas Put e Get
  • 41:54 - 41:54
    chamadas está sendo chamadas pelo kernel, o kernel pode ser muito
  • 41:57 - 41:57
    cuidado, assim como no caso do cliente e o servidor que executa o
  • 42:01 - 42:01
    em duas máquinas diferentes.
    Neste caso,
  • 42:04 - 42:04
    o kernel pode verificar cuidadosamente que estas colocar e receber comandos
  • 42:08 - 42:08
    que estes dois módulos diferentes estão chamando realmente são
  • 42:12 - 42:12
    formado corretamente, que os parâmetros são válidos,
  • 42:15 - 42:15
    que eles estão se referindo a locais válidos na memória.
  • 42:18 - 42:18
    E, portanto, o kernel pode classificar de garantir
  • 42:21 - 42:21
    que estes dois módulos não fazem coisas maliciosas uns aos outros
  • 42:25 - 42:25
    ou fazer com que os outros para quebrar.
    Eis aqui um exemplo de
  • 42:29 - 42:29
    algo que é como uma comunicação entre processos.
  • 42:33 - 42:33
    Assim que você viu, por exemplo, você já viu uma instância de
  • 42:36 - 42:36
    comunicação entre processos quando estudou o papel do UNIX.
  • 42:39 - 42:39
    Nós conversamos sobre tubos e uma abstração de tubulação,
  • 42:42 - 42:42
    e como isso funciona.
    Bem, os tubos são espécie de
  • 42:44 - 42:44
    algo que é implementado pelo kernel UNIX como um caminho para
  • 42:48 - 42:48
    dois programas para trocar dados entre si.
  • 42:50 - 42:50
    E, há muito esses tipos de serviços que nossos
  • 42:53 - 42:53
    as pessoas tendem a empurrar para o kernel que o kernel fornece
  • 42:57 - 42:57
    para outras aplicações, os módulos que estão em execução,
  • 43:00 - 43:00
    para que estes módulos podem, por exemplo,
  • 43:02 - 43:02
    interagir com o hardware ou interagir uns com os outros.
  • 43:06 - 43:06
    Então geralmente dentro de um kernel, você encontraria coisas como um arquivo
  • 43:09 - 43:09
    sistema, uma interface para a rede e você pode,
  • 43:12 - 43:12
    por exemplo, encontrar coisas como uma interface
  • 43:15 - 43:15
    para o hardware de gráficos.
    OK, há algum tipo de
  • 43:18 - 43:18
    Comentário por isso se você olhar para o que realmente é dentro de um kernel,
  • 43:21 - 43:21
    há uma enorme quantidade de código que está indo para essas sementes.
  • 43:24 - 43:24
    Então eu acho que falamos anteriormente sobre como operar o Linux
  • 43:28 - 43:28
    sistema é muitos milhões de linhas de código.
  • 43:31 - 43:31
    Se você vai olhar para o kernel do Linux, o kernel do Linux é
  • 43:34 - 43:34
    provavelmente hoje na ordem de cerca de 5 milhões de linhas de código,
  • 43:38 - 43:38
    dizer que a maioria dos quais, dois-terços,
  • 43:40 - 43:40
    está relacionado com esses drivers de dispositivo chamados que gerenciar este
  • 43:43 - 43:43
    hardware de baixo nível.
    Então este kernel ficou bastante
  • 43:46 - 43:46
    grande.
    E um dos efeitos colaterais da
  • 43:49 - 43:49
    o kernel ficando grande é que talvez seja mais difícil para confiar nele,
  • 43:52 - 43:52
    direito?
    Pode ser que você sorte de ter menos
  • 43:54 - 43:54
    confiança de que todo o código do kernel é realmente correto.
  • 43:58 - 43:58
    E você pode imaginar que, se você não confia o kernel então o
  • 44:02 - 44:02
    computador não vai ser tão estável como você gostaria de ser.
  • 44:06 - 44:06
    E este é um argumento para por que o Windows trava o tempo todo
  • 44:09 - 44:09
    é porque ele tem todos esses drivers nele e esses drivers
  • 44:13 - 44:13
    não são necessariamente escritos tudo perfeitamente.
  • 44:15 - 44:15
    Há dezenas de milhões de linhas de código no Windows,
  • 44:18 - 44:18
    e alguns deles falhar algumas vezes, e que faz com que o
  • 44:21 - 44:21
    computador inteiro para vir para baixo.
    Para que haja uma tensão
  • 44:24 - 44:24
    Comunidade de sistemas operacionais sobre se você deve executar
  • 44:27 - 44:27
    essas coisas, você deve manter essas coisas
  • 44:30 - 44:30
    olha o sistema de arquivos ou o sistema de elementos gráficos dentro do kernel ou
  • 44:33 - 44:33
    Se você deve movê-los fora como serviços separados,
  • 44:36 - 44:36
    que pode ser chamado da mesma forma, por exemplo,
  • 44:39 - 44:39
    que A e B interagem uns com os outros, fazendo com que alguns dados
  • 44:42 - 44:42
    estrutura que tem armazenado dentro do kernel que buffers a
  • 44:45 - 44:45
    solicitações entre, digamos, o serviço e este,
  • 44:47 - 44:47
    dizer, por exemplo, o serviço de gráfica e programas dos usuários
  • 44:51 - 44:51
    que querem interagir com ele.
    OK, então é basicamente isso para
  • 44:57 - 44:57
    hoje.
    O que eu mostrei a você é,
  • 44:59 - 44:59
    bem, na verdade, temos mais alguns minutos.
  • 45:03 - 45:03
    Desculpe.
    [RISOS] Eu sei que você é tudo
  • 45:06 - 45:06
    ficando até sair, mas assim, OK, eu só quero
  • 45:11 - 45:11
    rapidamente abordar um último tópico que é isso,
  • 45:16 - 45:16
    Então, o que eu mostrei-lhe até agora é como podemos usar a noção de
  • 45:22 - 45:22
    memória virtual a fim de proteger os dados,
  • 45:26 - 45:26
    proteger dois programas entre si, para que eles não podem
  • 45:31 - 45:31
    necessariamente interagir com uns dos outros dados.
  • 45:37 - 45:37
    Mas há algumas situações em que podemos realmente querer
  • 45:41 - 45:41
    tenho dois programas capazes de compartilhar alguns dados com os outros.
  • 45:44 - 45:44
    Então eu não sei se vocês se lembrar, mas quando foi de Hari
  • 45:47 - 45:47
    palestras anteriores, ele falou sobre como são
  • 45:50 - 45:50
    bibliotecas que ficar ligadas nos programas.
  • 45:52 - 45:52
    E uma das maneiras comuns que as bibliotecas são estruturadas estas
  • 45:56 - 45:56
    dias é uma biblioteca compartilhada chamada.
  • 45:58 - 45:58
    Assim, uma biblioteca compartilhada é algo que só é armazenado em
  • 46:01 - 46:01
    um local na memória física.
    Mas vários módulos diferentes
  • 46:06 - 46:06
    que está em execução em que o sistema pode chamar funções dentro
  • 46:09 - 46:09
    Essa biblioteca compartilhada.
    Portanto, para fazer este trabalho,
  • 46:12 - 46:12
    certo, temos de ter mapeado a memória para o compartilhada
  • 46:15 - 46:15
    biblioteca que tem todas as funções que essas outras
  • 46:18 - 46:18
    módulos querem chamar para os espaços de endereço para estes dois
  • 46:22 - 46:22
    módulos para que eles podem realmente executar o código que
  • 46:25 - 46:25
    lá.
    Assim o sistema de memória virtual
  • 46:27 - 46:27
    torna muito trivial de fazer isso.
  • 46:30 - 46:30
    Assim, suponha que eu tenho o meu espaço de endereço para alguma função,
  • 46:35 - 46:35
    A e eu tenho o meu espaço de endereço para alguma função,
  • 46:40 - 46:40
    B. e suponha que essa função uma
  • 46:43 - 46:43
    módulo B e biblioteca de referências, uma referência a bibliotecas
  • 46:48 - 46:48
    um e dois.
    OK, então, usando a memória virtual
  • 46:53 - 46:53
    sistema, suponha que nós temos, portanto, esta é a nossa memória física.
  • 46:58 - 46:58
    Assim, suponha que o módulo A, A, do programa é carregada.
  • 47:04 - 47:04
    E quando ele é carregado, o programa que executa outros
  • 47:08 - 47:08
    programas, o carregador neste caso, vai carregar isso
  • 47:13 - 47:13
    biblioteca compartilhada, um, como ele carrega para o programa A.
  • 47:17 - 47:17
    Então, ele vai carregar primeiro o código para A,
  • 47:20 - 47:20
    e, em seguida, ele vai carregar o código para um.
  • 47:24 - 47:24
    E, estas coisas vão sentar-se na memória em algum lugar.
  • 47:30 - 47:30
    Assim, dentro do espaço, vamos ter o código de endereçamento
  • 47:34 - 47:34
    A vai ser mapeado e o código para um vai ser
  • 47:37 - 47:37
    mapeado.
    Agora, quando executa B,
  • 47:39 - 47:39
    à direita, o que queremos evitar, para a finalidade de compartilhados
  • 47:43 - 47:43
    bibliotecas é fazer com que quando os dois programas estão executando
  • 47:46 - 47:46
    e ambos usam a mesma biblioteca não há duas cópias
  • 47:50 - 47:50
    de que biblioteca de memória usando o dobro de
  • 47:53 - 47:53
    a memória de, direito, porque há todos os
  • 47:56 - 47:56
    Essas bibliotecas que compartilham de todos os programas de computador.
  • 48:00 - 48:00
    Por exemplo, no Linux existe o [LIB C?]
  • 48:03 - 48:03
    funções de biblioteca que implementa todas as de padrão que
  • 48:07 - 48:07
    as pessoas usam em programas em C.
    Se houver 50 programas escritos
  • 48:10 - 48:10
    c em sua máquina Linux, você não quer ter 50
  • 48:14 - 48:14
    cópias desta biblioteca LIB C na memória.
  • 48:16 - 48:16
    Você quer ter apenas um.
    Por isso que queremos é que quando
  • 48:20 - 48:20
    módulo B obtém carregado, queremos mapear este código
  • 48:23 - 48:23
    que é já foi mapeado para o espaço de endereço da em seu
  • 48:28 - 48:28
    memória também, OK?
  • 48:30 - 48:30
    E então, naturalmente, vamos ter que carregar
  • 48:33 - 48:33
    memória adicional para B-se e para a biblioteca de dois que A
  • 48:36 - 48:36
    já não tenha carregado.
    Agora, aqueles que vão ser
  • 48:39 - 48:39
    carregado em alguns locais adicionais na memória na B,
  • 48:42 - 48:42
    vão ser carregados em alguns locais adicionais na
  • 48:45 - 48:45
    memória física e mapeados para A memória.
  • 48:48 - 48:48
    Então, isso é apenas mostrar que podemos realmente usar esta noção
  • 48:51 - 48:51
    de espaços de endereçamento, além de usá-lo para
  • 48:54 - 48:54
    isolar dois módulos, cada um com os outros para que eles não podem referir-se
  • 48:57 - 48:57
    memória de uns dos outros, também podemos usar isso como uma forma de
  • 49:00 - 49:00
    permitir que dois módulos compartilhar as coisas com os outros.
  • 49:04 - 49:04
    E, em particular, esta é uma boa idéia no caso
  • 49:07 - 49:07
    de coisas como bibliotecas compartilhadas, onde temos duas coisas,
  • 49:09 - 49:09
    ambos os programas precisam ser capaz de ler os mesmos dados.
  • 49:12 - 49:12
    Assim eles poderiam usar isso para fazer isso.
  • 49:14 - 49:14
    OK, então, o que vimos hoje foi esta noção de memória virtual
  • 49:17 - 49:17
    e espaços de endereçamento.
    Vimos como temos o kernel
  • 49:19 - 49:19
    que é um intermediário de confiança entre dois aplicativos.
  • 49:22 - 49:22
    O que vamos ver a próxima vez é como podemos tirar isso
  • 49:25 - 49:25
    noção de virtualizar um computador.
  • 49:27 - 49:27
    Vimos como virtualizar a memória hoje.
  • 49:30 - 49:30
    Da próxima vez, vamos ver como vamos virtualizar o processador
  • 49:33 - 49:33
    a fim de criar a abstração de vários
  • 49:35 - 49:35
    processadores rodando em apenas uma peça única, física de
  • 49:38 - 49:38
    hardware.
    Então vejo você amanhã.
Title:
Lec 6 | MIT 6.033 Computer System Engineering, Spring 2005
Description:

Virtualization and Virtual Memory

View the complete course at: http://ocw.mit.edu/6-033S05

License: Creative Commons BY-NC-SA
More information at http://ocw.mit.edu/terms
More courses at http://ocw.mit.edu

more » « less
Video Language:
English
Duration:
49:47
vacobs10 edited Portuguese subtitles for Lec 6 | MIT 6.033 Computer System Engineering, Spring 2005 Apr 15, 2013, 5:27 PM
vacobs10 added a translation Apr 15, 2013, 5:27 PM

Portuguese subtitles

Revisions