1. O documento ensina os passos básicos para criar um sistema operacional de 16 bits para x86, programado em Assembly. 2. É explicado como configurar a pilha, ler dados do disquete, alterar o modo de vídeo e criar um kernel simples que imprime uma mensagem na tela. 3. São fornecidas instruções para compilar os arquivos do loader e kernel, criar uma imagem para gravação no disquete e testar o sistema operacional.
Instalação e configuração apache Ubuntu ServerAparicio Junior
O documento descreve os passos para instalar e configurar o servidor Apache no Linux Ubuntu para hospedar a página inicial de um usuário fictício, incluindo a criação de um usuário, adição de diretórios e arquivos, configuração do virtual host e teste da página.
O documento fornece instruções passo a passo para instalar o Ubuntu Server 12.04, começando com a seleção da opção "Instalar o Ubuntu Server" e concluindo com a instalação bem-sucedida do sistema operacional.
O documento descreve os passos para instalar e configurar um servidor FTP usando o vsftpd no Ubuntu Server, incluindo a criação de usuários, configuração do arquivo vsftpd.conf para permitir uploads, downloads e enjaular usuários específicos dentro de seus diretórios home.
Este documento fornece instruções para resolução de problemas com computadores, incluindo problemas de arranque, vídeo, CMOS e memória RAM. Ele explica como verificar cabos e componentes para diagnosticar esses problemas e quais peças podem precisar de substituição. Além disso, fornece diretrizes para escolha adequada de memória RAM dependendo do uso pretendido.
O documento discute a inicialização do sistema em sistemas Linux, incluindo:
1) O processo de inicialização desde a BIOS até a execução dos scripts de inicialização e o sistema estar operacional;
2) A configuração e gerenciamento de serviços através de scripts no diretório /etc/init.d e links simbólicos nos diretórios /etc/rc?.d;
3) O utilitário Upstart no Ubuntu para gerenciar processos de forma baseada em eventos em substituição ao init tradicional.
O documento discute a instalação e configuração do servidor FTP Vsftpd no Linux, incluindo como restringir acessos de usuários, permitir uploads anônimos e realizar backups via FTP.
1. O documento descreve as principais interfaces e conectores encontrados em placas-mãe modernas, incluindo PCI Express, memória RAM, processadores e discos rígidos.
2. As ranhuras PCIe x16 são usadas para placas gráficas, enquanto PCIe x1 e PCI servem para outros periféricos.
3. Outros conectores importantes incluem SATA para discos, memória RAM, socket do processador e fonte de alimentação ATX.
Mudança de runlevels e desligamento do sistemaSoftD Abreu
Capítulo 1 resume como os sistemas Linux iniciam programas através de runlevels e scripts nos diretórios /etc/rc#.d. Capítulo 2 explica como desligar e reiniciar o sistema de forma segura usando comandos como shutdown e reboot. Capítulo 3 discute como gerenciar serviços, incluindo como tornar scripts iniciáveis no boot e removê-los.
Instalação e configuração apache Ubuntu ServerAparicio Junior
O documento descreve os passos para instalar e configurar o servidor Apache no Linux Ubuntu para hospedar a página inicial de um usuário fictício, incluindo a criação de um usuário, adição de diretórios e arquivos, configuração do virtual host e teste da página.
O documento fornece instruções passo a passo para instalar o Ubuntu Server 12.04, começando com a seleção da opção "Instalar o Ubuntu Server" e concluindo com a instalação bem-sucedida do sistema operacional.
O documento descreve os passos para instalar e configurar um servidor FTP usando o vsftpd no Ubuntu Server, incluindo a criação de usuários, configuração do arquivo vsftpd.conf para permitir uploads, downloads e enjaular usuários específicos dentro de seus diretórios home.
Este documento fornece instruções para resolução de problemas com computadores, incluindo problemas de arranque, vídeo, CMOS e memória RAM. Ele explica como verificar cabos e componentes para diagnosticar esses problemas e quais peças podem precisar de substituição. Além disso, fornece diretrizes para escolha adequada de memória RAM dependendo do uso pretendido.
O documento discute a inicialização do sistema em sistemas Linux, incluindo:
1) O processo de inicialização desde a BIOS até a execução dos scripts de inicialização e o sistema estar operacional;
2) A configuração e gerenciamento de serviços através de scripts no diretório /etc/init.d e links simbólicos nos diretórios /etc/rc?.d;
3) O utilitário Upstart no Ubuntu para gerenciar processos de forma baseada em eventos em substituição ao init tradicional.
O documento discute a instalação e configuração do servidor FTP Vsftpd no Linux, incluindo como restringir acessos de usuários, permitir uploads anônimos e realizar backups via FTP.
1. O documento descreve as principais interfaces e conectores encontrados em placas-mãe modernas, incluindo PCI Express, memória RAM, processadores e discos rígidos.
2. As ranhuras PCIe x16 são usadas para placas gráficas, enquanto PCIe x1 e PCI servem para outros periféricos.
3. Outros conectores importantes incluem SATA para discos, memória RAM, socket do processador e fonte de alimentação ATX.
Mudança de runlevels e desligamento do sistemaSoftD Abreu
Capítulo 1 resume como os sistemas Linux iniciam programas através de runlevels e scripts nos diretórios /etc/rc#.d. Capítulo 2 explica como desligar e reiniciar o sistema de forma segura usando comandos como shutdown e reboot. Capítulo 3 discute como gerenciar serviços, incluindo como tornar scripts iniciáveis no boot e removê-los.
As placas Mini-ATX são versões menores das placas ATX, com espaço para apenas 4 slots. O chipset controla quase todas as funções da placa-mãe e não pode ser trocado, pois a placa foi desenvolvida especificamente para aquele chipset. Durante o POST, o BIOS realiza testes e verifica os componentes antes de iniciar o sistema operacional.
O documento explica como configurar o servidor FTP ProFTPd através do arquivo de configuração /etc/proftpd.conf. O arquivo define contextos e diretivas que determinam o comportamento do ProFTPd para diferentes ações e diretórios. O exemplo de configuração mostra como permitir downloads na pasta PUB e uploads na pasta incoming.
Linux comandos gerais e servidores de redefernandao777
Este documento fornece instruções sobre comandos básicos do Linux, configuração de redes e serviços de rede como Samba, NFS, Apache, FTP e Squid. Ele também discute firewall, editores de texto e ferramentas de monitoramento de rede.
Teste de Intrusão Em Redes corporativasSoftD Abreu
O documento discute exploração de vulnerabilidades de buffer overflow, incluindo:
1) O que é um exploit e como funciona um buffer overflow;
2) Como sobrescrever o endereço de retorno da função usando um shellcode para desviar a execução do programa;
3) Um exemplo de programa vulnerável a buffer overflow usado para demonstrar a técnica.
1) O processador é o componente central responsável por executar operações de computação em um sistema.
2) Os processadores evoluíram drasticamente ao longo do tempo, com o número de transistores aumentando exponencialmente a cada geração de acordo com a Lei de Moore.
3) O processador é organizado em unidades funcionais responsáveis pelo processamento de dados e controle do fluxo de execução de instruções.
O documento discute problemas comuns de desempenho no PostgreSQL e soluções como melhorar a configuração do hardware, sistema operacional, parâmetros do PostgreSQL e banco de dados. Ele fornece recomendações para otimizar o I/O, memória, checkpoint, vacum e escalabilidade.
A placa-mãe é o componente central de um computador, responsável por conectar os principais itens de hardware. O documento descreve os principais componentes de uma placa-mãe, incluindo o local para o processador, memória RAM, slots de expansão, conectores para alimentação e periféricos. Além disso, explica termos como chipset e placas onboard.
O documento discute sobre memória cache e cooler de processadores. Explica que a memória cache armazena dados recentemente usados pelo processador para que ele não fique ocioso aguardando a memória RAM mais lenta. Também detalha que o cooler é necessário para dissipar o calor gerado pelo processador, sendo composto por ventoinha e dissipador de calor unidos por pasta térmica.
Este documento fornece instruções para configurar um servidor DHCP no Debian Squeeze para fornecer endereços IP dinâmicos para clientes na rede local e compartilhar a conexão com Internet. As etapas incluem instalar e configurar o serviço DHCP, definir os endereços IP das placas de rede, habilitar o compartilhamento usando iptables e controle de acesso com a tabela ARP.
1) O documento discute os conceitos básicos da estrutura de hardware e software de um roteador Cisco, incluindo o software Cisco IOS, componentes de hardware como CPU e memória, e o processo de inicialização e configuração do roteador.
2) É explicado que o Cisco IOS é o sistema operacional do roteador e controla suas funções internas, e que a configuração inicial pode ser feita via uma interface gráfica ou linha de comando.
3) São detalhados os vários modos de configuração da interface de linha de comando do roteador
Este documento fornece instruções para resolver problemas com computadores, incluindo quando eles não ligam, ligam parcialmente ou têm problemas de vídeo. Também discute questões relacionadas à memória RAM, como escolha, tipos e configuração.
O documento explica os principais tipos de barramentos e slots de expansão em computadores, incluindo ISA, PCI, AGP, e PCI-Express. Detalha as características e evoluções de cada um, como velocidade de transferência, largura de banda e compatibilidade. Também discute o papel do chipset e das placas de expansão para aumentar os recursos do computador.
O documento explica como o kernel Linux fornece serviços para aplicativos através de chamadas de sistema, gerencia hardware e permite a troca de módulos. O kernel cria uma "máquina virtual" abstraindo o hardware real e fornece informações sobre o sistema no diretório /proc. Parâmetros no /proc/sys podem ser usados para melhorar o desempenho.
[1] O documento discute configurações do BIOS, Setup e CMOS para melhorar o desempenho do hardware. [2] Explica que o BIOS inicializa o hardware, o Setup permite configurar opções do hardware, e o CMOS armazena as configurações do Setup. [3] Fornece detalhes sobre várias opções de configuração do BIOS e Setup para melhorar o desempenho do sistema.
O documento discute as configurações do BIOS e CMOS de um computador. Explica que o BIOS inicializa o hardware, realiza o boot e fornece informações básicas de funcionamento. O CMOS armazena as configurações do BIOS para que não sejam perdidas quando desligado. O Setup permite configurar opções do hardware para melhor desempenho.
Instalação e Configuração do Hipervisor xen pvmFernando Pessoa
O documento descreve a instalação e configuração do hipervisor Xen PVM no Ubuntu 12.04 LTS, incluindo a criação de máquinas virtuais e testes de desempenho com as ferramentas Iperf, Bonnie++ e Sysbench. Os resultados dos testes mostraram que a máquina física teve melhor desempenho em relação à máquina virtual na transmissão de pacotes de rede e cálculo de primos.
Este documento fornece instruções passo-a-passo para replicar um banco de dados Protheus de produção para um ambiente de teste, incluindo fazer backup do banco de dados de produção, restaurar o backup no banco de dados de teste, alterar configurações para apontar para o novo banco de dados de teste, e limpar índices para preparar o ambiente de teste.
O documento descreve os principais componentes de hardware de uma placa-mãe, incluindo chipset, BIOS, POST e Setup. O chipset é responsável pelo controle de itens da placa-mãe como acesso à memória e barramentos, e geralmente inclui os chips Ponte Norte e Ponte Sul. A BIOS armazena programas importantes e é responsável pelo boot inicial, enquanto o Setup e o POST permitem configurações e testes do hardware.
O documento fornece uma introdução sobre a linguagem de montagem Assembly. Em 3 frases:
A linguagem Assembly é uma linguagem de programação de baixo nível utilizada para programar diretamente a unidade central de processamento. Ela é compilada por um assembler para gerar código de máquina executável. O documento explica conceitos-chave como registradores, instruções, números binários e interrupções que são importantes para entender a arquitetura do processador e programar em Assembly.
Aula 2 programas e linguagens de programaçãoLCCIMETRO
O documento discute as características principais das linguagens de programação, incluindo: 1) a definição de linguagem de programação, programa e código fonte; 2) os tipos de instruções em uma linguagem de programação; e 3) a classificação de linguagens de programação em máquina, assembly, e de alto nível.
O documento apresenta o plano de aulas para a disciplina de LCC2 - Licenciatura em Ciências da Computação 2014. As principais matérias incluem arquitetura de microprocessadores, linguagens de programação, acesso à memória, instruções, interrupções, desenvolvimento de aplicações e avaliação.
As placas Mini-ATX são versões menores das placas ATX, com espaço para apenas 4 slots. O chipset controla quase todas as funções da placa-mãe e não pode ser trocado, pois a placa foi desenvolvida especificamente para aquele chipset. Durante o POST, o BIOS realiza testes e verifica os componentes antes de iniciar o sistema operacional.
O documento explica como configurar o servidor FTP ProFTPd através do arquivo de configuração /etc/proftpd.conf. O arquivo define contextos e diretivas que determinam o comportamento do ProFTPd para diferentes ações e diretórios. O exemplo de configuração mostra como permitir downloads na pasta PUB e uploads na pasta incoming.
Linux comandos gerais e servidores de redefernandao777
Este documento fornece instruções sobre comandos básicos do Linux, configuração de redes e serviços de rede como Samba, NFS, Apache, FTP e Squid. Ele também discute firewall, editores de texto e ferramentas de monitoramento de rede.
Teste de Intrusão Em Redes corporativasSoftD Abreu
O documento discute exploração de vulnerabilidades de buffer overflow, incluindo:
1) O que é um exploit e como funciona um buffer overflow;
2) Como sobrescrever o endereço de retorno da função usando um shellcode para desviar a execução do programa;
3) Um exemplo de programa vulnerável a buffer overflow usado para demonstrar a técnica.
1) O processador é o componente central responsável por executar operações de computação em um sistema.
2) Os processadores evoluíram drasticamente ao longo do tempo, com o número de transistores aumentando exponencialmente a cada geração de acordo com a Lei de Moore.
3) O processador é organizado em unidades funcionais responsáveis pelo processamento de dados e controle do fluxo de execução de instruções.
O documento discute problemas comuns de desempenho no PostgreSQL e soluções como melhorar a configuração do hardware, sistema operacional, parâmetros do PostgreSQL e banco de dados. Ele fornece recomendações para otimizar o I/O, memória, checkpoint, vacum e escalabilidade.
A placa-mãe é o componente central de um computador, responsável por conectar os principais itens de hardware. O documento descreve os principais componentes de uma placa-mãe, incluindo o local para o processador, memória RAM, slots de expansão, conectores para alimentação e periféricos. Além disso, explica termos como chipset e placas onboard.
O documento discute sobre memória cache e cooler de processadores. Explica que a memória cache armazena dados recentemente usados pelo processador para que ele não fique ocioso aguardando a memória RAM mais lenta. Também detalha que o cooler é necessário para dissipar o calor gerado pelo processador, sendo composto por ventoinha e dissipador de calor unidos por pasta térmica.
Este documento fornece instruções para configurar um servidor DHCP no Debian Squeeze para fornecer endereços IP dinâmicos para clientes na rede local e compartilhar a conexão com Internet. As etapas incluem instalar e configurar o serviço DHCP, definir os endereços IP das placas de rede, habilitar o compartilhamento usando iptables e controle de acesso com a tabela ARP.
1) O documento discute os conceitos básicos da estrutura de hardware e software de um roteador Cisco, incluindo o software Cisco IOS, componentes de hardware como CPU e memória, e o processo de inicialização e configuração do roteador.
2) É explicado que o Cisco IOS é o sistema operacional do roteador e controla suas funções internas, e que a configuração inicial pode ser feita via uma interface gráfica ou linha de comando.
3) São detalhados os vários modos de configuração da interface de linha de comando do roteador
Este documento fornece instruções para resolver problemas com computadores, incluindo quando eles não ligam, ligam parcialmente ou têm problemas de vídeo. Também discute questões relacionadas à memória RAM, como escolha, tipos e configuração.
O documento explica os principais tipos de barramentos e slots de expansão em computadores, incluindo ISA, PCI, AGP, e PCI-Express. Detalha as características e evoluções de cada um, como velocidade de transferência, largura de banda e compatibilidade. Também discute o papel do chipset e das placas de expansão para aumentar os recursos do computador.
O documento explica como o kernel Linux fornece serviços para aplicativos através de chamadas de sistema, gerencia hardware e permite a troca de módulos. O kernel cria uma "máquina virtual" abstraindo o hardware real e fornece informações sobre o sistema no diretório /proc. Parâmetros no /proc/sys podem ser usados para melhorar o desempenho.
[1] O documento discute configurações do BIOS, Setup e CMOS para melhorar o desempenho do hardware. [2] Explica que o BIOS inicializa o hardware, o Setup permite configurar opções do hardware, e o CMOS armazena as configurações do Setup. [3] Fornece detalhes sobre várias opções de configuração do BIOS e Setup para melhorar o desempenho do sistema.
O documento discute as configurações do BIOS e CMOS de um computador. Explica que o BIOS inicializa o hardware, realiza o boot e fornece informações básicas de funcionamento. O CMOS armazena as configurações do BIOS para que não sejam perdidas quando desligado. O Setup permite configurar opções do hardware para melhor desempenho.
Instalação e Configuração do Hipervisor xen pvmFernando Pessoa
O documento descreve a instalação e configuração do hipervisor Xen PVM no Ubuntu 12.04 LTS, incluindo a criação de máquinas virtuais e testes de desempenho com as ferramentas Iperf, Bonnie++ e Sysbench. Os resultados dos testes mostraram que a máquina física teve melhor desempenho em relação à máquina virtual na transmissão de pacotes de rede e cálculo de primos.
Este documento fornece instruções passo-a-passo para replicar um banco de dados Protheus de produção para um ambiente de teste, incluindo fazer backup do banco de dados de produção, restaurar o backup no banco de dados de teste, alterar configurações para apontar para o novo banco de dados de teste, e limpar índices para preparar o ambiente de teste.
O documento descreve os principais componentes de hardware de uma placa-mãe, incluindo chipset, BIOS, POST e Setup. O chipset é responsável pelo controle de itens da placa-mãe como acesso à memória e barramentos, e geralmente inclui os chips Ponte Norte e Ponte Sul. A BIOS armazena programas importantes e é responsável pelo boot inicial, enquanto o Setup e o POST permitem configurações e testes do hardware.
O documento fornece uma introdução sobre a linguagem de montagem Assembly. Em 3 frases:
A linguagem Assembly é uma linguagem de programação de baixo nível utilizada para programar diretamente a unidade central de processamento. Ela é compilada por um assembler para gerar código de máquina executável. O documento explica conceitos-chave como registradores, instruções, números binários e interrupções que são importantes para entender a arquitetura do processador e programar em Assembly.
Aula 2 programas e linguagens de programaçãoLCCIMETRO
O documento discute as características principais das linguagens de programação, incluindo: 1) a definição de linguagem de programação, programa e código fonte; 2) os tipos de instruções em uma linguagem de programação; e 3) a classificação de linguagens de programação em máquina, assembly, e de alto nível.
O documento apresenta o plano de aulas para a disciplina de LCC2 - Licenciatura em Ciências da Computação 2014. As principais matérias incluem arquitetura de microprocessadores, linguagens de programação, acesso à memória, instruções, interrupções, desenvolvimento de aplicações e avaliação.
O documento discute os conceitos de compiladores, interpretadores e linkagem no contexto da programação. Explica que compiladores transformam programas de alto nível em código de máquina, enquanto interpretadores fazem isso linha a linha. A linkagem une código objeto e bibliotecas para criar programas executáveis.
O documento discute simuladores do processador 8086 como TASM, MASM, Debug e EMU8086. Apresenta as vantagens do EMU8086 como visualização gráfica da memória, registradores e outras partes do processador. Também lista algumas desvantagens como limitações em comandos e interrupções. Exemplos de código assembly são fornecidos para ilustrar uso do EMU8086.
O documento descreve os principais componentes de um computador e conceitos relacionados à linguagem assembly, incluindo registradores, segmentos de memória, instruções e operações aritméticas básicas.
O documento resume as seguintes informações sobre Assembly:
1) Assembly é uma linguagem de baixo nível atrelada à arquitetura da CPU e dependente do hardware, não sendo portável.
2) Foi muito usada até os anos 80 e atualmente é usada para manipulação de hardware e sistemas que necessitam de performance crítica.
3) Contém instruções básicas de movimentação de dados, aritmética e lógica operando nos registradores e memória da CPU.
1. O documento descreve o conjunto de instruções MIPS e suas características. 2. As instruções MIPS possuem três operandos fixos e operam apenas em registradores. 3. É necessário transferir dados entre registradores e memória usando instruções de load e store.
A instrução MOV copia o segundo operando para o primeiro operando. Pode copiar valores entre registradores, da memória para registradores, de registradores para memória e valores imediatos. Suporta diversos tipos de registradores incluindo segmentos de registradores. O documento fornece detalhes sobre os operadores suportados e apresenta um pequeno programa de exemplo.
O documento fornece uma introdução sobre a linguagem de montagem Assembly. Em 3 frases:
A linguagem Assembly é uma linguagem de programação de baixo nível utilizada para programar diretamente a unidade central de processamento. Ela é compilada em um programa objeto pelo assembler e permite maior controle sobre as funções do computador através do uso de registradores, instruções mnemônicas e flags de estado. A linguagem depende do hardware e não é portável entre arquiteturas de processadores diferentes.
2. 2
SUMÁRIO
1. Introdução 3
2. Aplicativos 4
3. Processo de boot 5
4. Interrupts 6
5. Criando o Loader 7
6. Criando o Kernel 9
7. Gravando e testando 11
8. Considerações finais 13
3. 3
1. INTRODUÇÃO
Neste tutorial, vou ensinar os passos básicos para criar um mini sistema operacional de
16 bits para x86, inteiramente programado do zero, em Assembly. Não vou ensinar
nada sobre a linguagem de programação em si, então é recomendável ter algum
conhecimento sobre ela.
Vamos fazer algo bem básico, mas suficiente para você entender como é o
funcionamento de um SO. Faremos apenas uma mensagem de texto ser exibida na
tela. Parece pouco, mas verá que a coisa não é tão simples assim.
Veja os aplicativos necessários no próximo capítulo e boa sorte.
4. 4
2. APLICATIVOS
Para programar o sistema, vamos usar o Emu8086, um ótimo emulador de 8086, com
capacidade de compilar, fazer debug e, claro, emular o sistema ( para não ter que ficar
reiniciando o computador toda hora para testar ). Baixe-o endereço abaixo:
Emu086
http://www.emu8086.com
Ele não é gratuito, tem um prazo de 90 dias para testar, mas é suficiente para o nosso
tutorial. Em seguida, baixe mais 2 aplicativos, que vamos usar para gravar nosso SO em
um disquete e dar o boot por ele:
Fergo RawImage Maker
http://www.fergonez.net/download.php?file=frim.zip
RawWriteWin
http://www.chrysocome.net/rawwrite
O local de instalação desses aplicativos fica a sua escolha, não tem um local específico
para instalar. Vamos em frente, para uma breve explicação sobre o processo de boot.
5. 5
3. PROCESSO DE BOOT
Geralmente, após o término da checagem de Hardware, o computador busca pelos
512 bytes gravados no primeiro setor do disquete ( Cabeça: 0, Trilha: 0, Setor: 1 ). Caso
não encontre, ele busca por um sistema operacional na MBR ( Master Boot Record ) do
seu HD.
É importante que, para testar o SO, você configure a BIOS para “bootar” o disquete
antes de qualquer outro dispositivo ( HD, CDROM, USB, etc... ).
Se ele encontrar algum sistema nesses 512 bytes do disquete, ele o carrega na
memória no endereço 0000:7C00h. Vamos ver como funciona esses endereços de
memória.
Quando se usa o formato xxxx:yyyy, você está trabalhando com endereços relativos,
sendo que a primeira seqüência representa o que chamamos de Segment e a segunda,
Offset. Para calcular o endereço físico, real, é feito o seguinte cálculo ( lembre-se que
estamos trabalhando com números hexadecimais, indicado pelo ‘h’ após o último
algarismo ):
Segment * 16h + Offset = Endereço físico
Tomando como exemplo o local onde a BIOS carrega o sistema operacional, podemos
calcular o endereço físico real através do cálculo:
0000h * 16h + 7C00h = 7C00h
Nosso sistema é carregado no endereço físico da memória 7C00h. É bom lembrar que
diferentes segments e offsets podem gerar o mesmo endereço físico. Por exemplo:
0000:7C00h = 07C0:0000h
Qual a importância de saber sobre esses endereços? Bom, é por eles que você vai
controlar seu programa. Você pode usar endereços físicos diretamente, mas usando
no formato de segment/offset você consegue organizar melhor as posições de
memória.
O endereço físico também é importante para saber onde eu posso e onde eu não
posso gravar os dados na memória. A BIOS reserva um trecho de memória baixa (
640KB ) para que você use-o livremente. Esse trecho vai do endereço físico 00500h até
A0000h. Ou seja, você não deve gravar nada antes do endereço 00500h e nem após
A0000 ( são locais reservados para memória de vídeo, bios, vetores de interrupts ( veja
adiante ), etc... ).
Voltando ao boot. Eu mencionei que ele carrega os 512 bytes do primeiro setor na
memória. Certo, e se meu SO tiver mais de 512 bytes? Aí nos vamos precisar de um
Loader, que é basicamente uma seqüência de instruções ( com no máximo 512 bytes
para caber no primeiro setor ), que é responsável por carregar o Kernel do disco para a
memória. Vamos usar um para o nosso SO ( apesar de não precisar nesse caso ).
6. 6
4. INTERRUPTS
Eu disse na introdução que não iria explicar sobre a linguagem Assembly, mas acho que
Interrupts é algo importante para ressaltar.
Interrupt, no caso do Assembly, é uma instrução que paralisa o código atual para que
alguma ação seja realizada ( chamamos isso de IRQ – Interruption Request ). Se for
para comparar com algo nas linguagens de alto nível, podemos comparar ele com uma
função, que é chamada, executa suas instruções, e depois retorna para o código onde
ela foi chamada.
Todo computador na arquitetura x86 possui diversos interrupts, controlados pela BIOS.
Os interrupts são compostos por uma função e uma subfunção. Por exemplo, para
trabalhar com o vídeo, é usado o interrupt 10h. E a operação a ser realizada no vídeo (
subfunção ), depende do valor de algum registrador ( normalmente AH ). Veja o
exemplo abaixo que imprime um caractere na tela:
mov ah, 0Eh ;subfunção que indica para imprimir texto
mov al, ‘A’ ;caractere a ser impresso
int 10h ;interrupção de vídeo
Como eu sei o que cada interrupt faz, quais os argumentos e quais registradores estão
envolvidos? Eu uso este site:
http://www.htl-steyr.ac.at/~morg/pcinfo/hardware/interrupts/inte1at0.htm
Vamos usar Interrupts para imprimir caracteres na tela, para buscar por teclas
pressionadas, para alterar o modo de vídeo, etc. Dá pra notar que entender o seu
funcionamento é fundamental para prosseguir com este tutorial.
Vamos por a mão na massa agora.
7. 7
5. CRIANDO O LOADER
O Loader basicamente consiste num conjunto de instruções que devem caber no
primeiro setor do disquete ( 512b ) e que lê os outros setores do disquete ( onde está o
Kernel e o resto do código ) para a memória.
O nosso código precisa configurar algumas coisas básicas para que tudo funcione
corretamente. Precisamos ter uma pilha de dados ( Stack ). Se você programa em
Assembly, deve saber o que é uma pilha, como ela funciona, e para que é usada.
Os registradores envolvidos com a pilha são os seguintes:
SS -> Stack Segment -> Aponta para o segmento onde está a pilha
SP -> Stack Pointer -> Aponta para determinada região da pilha ( normalmente o topo )
Além da pilha, é necessário indicar onde está o nosso segmento de dados
DS -> Data Segment -> Aponta para a base de dados ( usado sempre que for acessar
algum endereço de memória ).
Vamos organizar nossa memória da seguinte maneira:
Memória Descrição
07C0:0000 até 07C0:01FF Local onde foi carregado o bootloader
07C0:0200 até 07C0:03FF Pilha
0800:0000 em diante Nosso Kernel
Essa estrutura da memória é a mesma utilizada no site do Emu8086, pois é bem
didática e segue uma seqüência lógica. Claro que vai ficar um bom trecho sobrando (
de 0500 até 7C00 ), mas por enquanto é suficiente.
Então eis a seqüência que vamos usar no nosso Loader
• Determina a pilha e seus registradores
• Indica o segmento de dados
• Altera o formato de vídeo para 80x25 ( 80 colunas, 25 linhas )
• Lê o setor do disquete onde está o Kernel
• Escreve os dados lidos no endereço 0800:0000
• Pula para este endereço e passa o controle para o Kernel
Abra o Emu8086, selecione ‘New’ e marque a opção ‘Empty Workspace’. Em seguida,
cole o código da página seguinte ( vou fazer os comentários sobre o que cada instrução
faz no próprio código )
8. 8
org 7C00h ;organiza o offset
;inicialização da pilha
mov ax, 07C0h
mov ss, ax ;seta o SS para 07C0h
mov sp, 03FEh ;aponta para o topo da pilha
;seta segmento de dados
xor ax, ax ;zera AX
mov ds, ax ;seta o segmento de dados par 0000h
;altera o modo de vídeo
mov ah, 00h ;subfucao para setar modo de vídeo
mov al, 03h ;03h = 80x25, 16 cores
int 10h ;interrupt de vídeo
;le dados do disquete
mov ah, 02h ;subfunção de leitura
mov al, 1 ;numero de setores para ler
mov ch, 0 ;trilha ( cylinder )
mov cl, 2 ;setor
mov dh, 0 ;cabeça
mov dl, 0 ;drive ( 00h = A: )
mov bx, 0800h ;ES:BX aponta para o local da memória_
mov es, bx ;onde vai ser escrito os dados_
mov bx, 0 ;0800:0000h ( ES = 0800h, BX = 0000h )
int 13h ;interrupt de disquete
jmp 0800h:0000h ;pula para o local onde está o kernel
;e passa a execução para ele
Observações:
O número de setores a serem lidos varia com o tamanho do Kernel. Cada setor tem
512 bytes. Então se o Kernel tiver 512 bytes ou menos, basta ler 1 setor. Se tiver 700
bytes, precisa ler 2 setores e assim por diante.
Caso tenha surgido alguma dúvida quanto aos valores, vá até o site com a lista de
interrupts que eu indiquei e analise a Int em questão.
Salve este código e compile através do botão ‘compile’ na barra de ferramentas. Ele vai
perguntar onde você deseja salvar o arquivo ( que vai ter a extensão .bin ). Dê um
nome qualquer ( algo como loader.bin ) e salve no diretório que desejar.
9. 9
6. CRIANDO O KERNEL
Nosso Kernel vai ser o mais simples possível. Vai apenas escrever um texto na tela e
aguardar que o usuário pressione alguma tecla para reiniciar o computador. Parece
pouco, mas é suficiente pra você entender como um sistema básico funciona. Se
precisar que o Kernel faça algo mais ( claro que vai querer ), você já vai ter
conhecimento suficiente para poder usar outros interrupts e trabalhar melhor com a
memória, etc.
org 0000h ;organiza o offset
push cs ;CS = endereço do programa atual
pop ds ;DS = CS
call clearscreen ;chama procedure de limpar a tela
lea si, Mensagem ;SI = endereço da mensagem
mov ah, 0Eh ;subfuncao para imprimir caractere
repetição:
mov al, [si] ;move para AL o caractere em SI
cmp al, 0h ;compara com 0 ( fim da string )
jz terminou ;caso terminou, pule para ‘terminou’
int 10h ;interrupção de video
inc si ;próximo caractere
jmp repetição ;repete o processo ate achar o 0
terminou:
mov ah, 0h ;subfuncao de aguardar tecla
int 16h ;interrupção de teclado
mov ax, 0040h ;método de reboot consiste em setar_
mov ds, ax ;o valor do endereço 0040:0072h_
mov w.[0072h], 1234h ;para 1234h e pular para o endereço_
jmp 0FFFFh:0000h ;FFFF:0000h
clearscreen proc ;procedure de limpar a tela
pusha ;coloca todos os reg na pilha
mov ah, 06h ;subfuncao de rolar a tela pra cima
mov al, 0 ;limpa a tela
mov bh, 0000_1111b ;seta as cores ( fundo_texto )
mov ch, 0 ;linha do canto sup. esq.
mov cl, 0 ;coluna do canto sup. esq.
mov dh, 19h ;linha do canto inf. dir. ( 25 )
mov dl, 50h ;coluna do canto inf. dir. ( 80 )
int 10h ;interrupção de vídeo
popa ;repõe os valores dos registradores
ret ;retorna para o código
clearscreen endp
Mensagem db ‘Meu primeiro SO’,0 ;nossa string que vai ser exibida
10. 10
Novamente, se tiver alguma dúvida quando a esse código ( que não seja relativo a
sintaxe e os comandos do Assembly ), volte ao site com a lista de interrupts.
Depois de pronto, salve o arquivo e compile, da mesma forma como fez no Loader.
Claro, escolha outro nome ( kernel.bin talvez ). Procure manter os arquivos em uma
mesma pasta, pra manter organizado.
Nosso mini sistema operacional está pronto. Só falta grava-lo no disquete e testar.
11. 11
7. GRAVANDO E TESTANDO
Com os binários do Loader e do Kernel em mãos, vamos criar uma imagem para ser
gravada no disquete. Vamos usar uma ferramenta que eu programei, chamada Fergo
RawImage Maker.
OBS.: Se precisar, baixe as VB6 Runtime Libraries
Execute o programa. A interface é bem simples e intuitiva. Siga estes passos para criar
a imagem ( os números em parênteses fazem relação com a imagem ).
• Escolha o arquivo de destino ( 1 )
• Selecione o loader.bin na segunda caixa de texto ( 2 )
• Marque Head = 0, Cylinder = 0 e Sector = 1 ( 3 )
• Clique em Add ( 4 )
• Selecione o kernel.bin na segunda caixa de texto ( 2 )
• Marque Head = 0, Cylinder = 0 e Sector = 2 ( 3 )
• Clique em Add ( 4 )
• E em seguida clique em ‘Create File!’ ( 5 )
Preste bastante atenção nos setores que você for gravar. Verifique se o resultado final
ficou semelhante ao da lista na imagem.
Se tudo ocorreu bem, deve ter aparecido uma mensagem indicando que o arquivo foi
criado com sucesso.
12. 12
Agora temos que gravar a nossa imagem no disquete. Insira um disquete de 3.5” no
drive A: e abra o programa RawWriteWin. Configure o caminho para a imagem que
você acabou de criar ( tutorial.img no meu caso ) e clique em ‘Write’.
Se o disquete estiver em bom estado e você seguiu os passos corretamente, deverá
receber novamente uma mensagem indicando que a imagem foi gravada com sucesso
no disquete ( certifique de que ele não está protegido contra gravação ).
Agora basta testar. Coloque o disquete no drive, reinicie o micro, configure para que a
BIOS dê o boot pelo disquete e se deu tudo certo, você vai ver a seguinte mensagem
após o boot:
Se esta mensagem apareceu, parabéns, você fez tudo corretamente. Caso ela não
tenha aparecido, releia o tutorial que com certeza você encontrará o local onde está o
erro.
13. 13
8. CONSIDERAÇÕES FINAIS
É isso aí. Espero ter ajudado aqueles iniciantes ( assim como eu ) que sempre tiveram
vontade de saber como fazer um sistema operacional e como ele se comporta. Claro
que este foi o exemplo mais básico, apenas o ponta pé inicial, mas com certeza isso já
é suficiente para você avançar mais um pouco.
Sugiro tentar implementar agora alguns comandos no seu SO ( assim como eu fiz nos
meus experimentos ) como ‘Clear Screen’, ‘Reboot’, ‘Help’, etc.
Boa sorte e até a próxima!
Fernando Birck aka Fergo
Website: www.fergonez.net