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