Isso me ocorreu que, se você está escrevendo um sistema operacional, em que está escrevendo? Eu pergunto isso enquanto estou lendo um livro sobre fundamentos de microprocessadores de 1980 e essa pergunta me veio à cabeça:
Como foi programado o primeiro chip de microprocessador?
A resposta pode ser óbvia, mas está me incomodando.
microprocessor
reitor
fonte
fonte
Respostas:
Aceitarei sua pergunta literalmente e discutirei principalmente microprocessadores, não computadores em geral.
Todos os computadores possuem algum tipo de código de máquina. Uma instrução consiste em um código de operação e um ou mais operandos. Por exemplo, a instrução ADD para o Intel 4004 (o primeiro microprocessador) foi codificada como 1000RRRR, onde 1000 é o código de operação para ADD e RRRR representou um número de registro.
Os primeiros programas de computador foram escritos à mão, codificando manualmente os zeros e zeros para criar um programa em linguagem de máquina. Isso é programado no chip. Os primeiros microprocessadores usavam ROM (Read-Only Memory); este foi posteriormente substituído por EPROM (ROM programável apagável, que foi apagada pela luz UV); agora os programas geralmente são programados na EEPROM ( "Eletricamente ... - EPROM" , que pode ser apagada no chip) ou especificamente na memória Flash.
A maioria dos microprocessadores agora pode executar programas a partir da RAM (isso é praticamente o padrão para tudo, exceto microcontroladores), mas é preciso haver uma maneira de carregar o programa na RAM. Como Joby Taffey apontou em sua resposta, isso foi feito com os comutadores do Altair 8080, que era alimentado por um Intel 8080 (que seguia os 4004 e 8008). No seu PC, existe um pouco de ROM chamada BIOS que é usada para iniciar o computador e carregar o sistema operacional na RAM.
A linguagem de máquina torna-se entediante rapidamente, e por isso foram desenvolvidos programas assembler que pegam uma linguagem assembler mnemônica e a traduzem, geralmente uma linha de código de montagem por instrução, em código de máquina. Então, em vez de 10000001, escreveríamos ADD R1.
Mas o primeiro montador teve que ser escrito em código de máquina. Em seguida, ele poderia ser reescrito em seu próprio código assembler e a versão em linguagem de máquina usada para montá-lo pela primeira vez. Depois disso, o programa poderá se montar. Isso é chamado de inicialização e também é feito com os compiladores - eles geralmente são escritos primeiro em assembler (ou outra linguagem de alto nível) e depois reescritos em seu próprio idioma e compilados com o compilador original até que o compilador possa se compilar.
Como o primeiro microprocessador foi desenvolvido muito tempo após a instalação de mainframes e minicomputadores, e o 4004 não era realmente adequado para executar um assembler, a Intel provavelmente escreveu um assembler que rodava em um de seus grandes computadores e traduziu o código de montagem para o 4004 em uma imagem binária que pode ser programada nas ROMs. Mais uma vez, essa é uma técnica comum usada para portar compiladores para uma nova plataforma (chamada de compilação cruzada ).
fonte
Originalmente, os programas eram escritos em papel e depois transpostos para qualquer método de entrada que o computador tivesse disponível. Isso passou de botões, interruptores e fios de jumper nos primeiros computadores, a cartões perfurados e teclados / placas.
A ilustração abaixo mostra o que os programadores reais atuais usam:
fonte
Bem, eu estava lá quando os micros surgiram, escrevemos assemblies e compiladores cruzados em mainframes e minis, depois os inicializamos no hardware de 8 bits, as pessoas não se incomodaram em construir compiladores / montadores em micros até que tivessem armazenamento local suficiente para torná-lo útil
fonte
Uma forma antiga de memória somente leitura era uma grade em que o endereço selecionava uma linha (puxando-a para baixo) e as colunas representavam dados. Cada coluna teria um pull-up e cada interseção teria um diodo soldado para representar um "zero" ou nenhum diodo para representar um "um" [os níveis de bits poderiam ser invertidos, se desejado, nos casos em que isso reduziria a número de diodos necessários]. Qualquer padrão de bits desejado pode ser "programado" soldando nos diodos apropriados.
Esse projeto foi introduzido no mundo dos circuitos integrados na forma de um PROM de fusível. Essencialmente, um PROM de fusível era um circuito como o acima, construído em um chip, exceto que todos os diodos estavam preenchidos e todos os diodos tinham um fusível fraco em série com ele. Conforme enviado, um PROM exibia "0" em todos os locais. Pode-se, no entanto, remover seletivamente os diodos selecionando o endereço apropriado e dirigindo as linhas de dados apropriadas "fortemente" alto [nota: acho que cada bit pode ter seu próprio transistor, em vez de um diodo, mas o princípio é o mesmo].
PROMs programadas por fusíveis foram sucedidas por memórias semicondutoras, que armazenam bits implantando cargas nos capacitores internos. Essas memórias não são apenas mais compactas do que as PROMs de fusíveis, mas se forem alojadas em embalagens transparentes aos raios UV, poderão ser apagadas e reutilizadas. Observe que até as chamadas memórias "programáveis uma vez" quase sempre usam esse mesmo design, mas são simplesmente alojadas em pacotes opacos aos raios UV.
controle de matriz de diodos do MIT Whirlwind Computer de 1950
armazenamento de controle de matriz de transistor de 2005 a CPU MT15
fonte
Não tenho certeza de que alguém tenha respondido à verdadeira pergunta do OP, que parece ser "Como o computador sabe como começar?" , então eu vou dar um jeito nisso.
Comece com uma analogia. "Como um transistor sabe como começar?" É claro que não, apenas funciona de acordo com a física, e o engenheiro constrói o circuito para que ele comece em um estado conhecido.
Os computadores sabem como começar, porque são circuitos (muito complicados, é claro) e são construídos para iniciar em um estado específico. Em uma máquina moderna, esse estado pode ser aquele em que o barramento principal remapeia parte do espaço de endereço para usar uma ROM na placa-mãe como pouca memória (a ROM foi gravada com um BIOS). Em uma máquina de primeira geração, o estado inicial pode ter sido interrompido pela CPU, o contador do programa em zero e o subsistema de alternância de memória ativo.
fonte
Um sistema operacional é um programa de computador que roda diretamente no processador. Pode ser escrito em qualquer idioma que possa ser compilado ou montado de acordo com as instruções da máquina. Montagem e C são escolhas comuns.
O código é carregado nos processadores uma única instrução de cada vez em uma loja - uma ROM ou RAM.
O Z3 , o primeiro processador programável, foi construído a partir de relés eletromecânicos e leu as instruções do filme perfurado.
O Altair 8800, o primeiro computador pessoal, foi programado por interruptores.
Para saber como um processador é construído a partir da lógica digital, consulte https://electronics.stackexchange.com/questions/5516/a-fun-book-to-learn-computer-architecture-for-not-exactly-beginners
Para uma história, consulte http://en.wikipedia.org/wiki/History_of_computing_hardware
fonte
Aqui está um pouco sobre computadores realmente antigos:
Até onde eu sei, na época você tinha um grande painel frontal de computador usado para programá-los. Basicamente, cada célula de memória nesses computadores estava conectada aos comutadores. Você alimentaria a memória e usaria comutadores para definir dados em cada célula. Dessa forma, você inserirá o programa pouco a pouco na memória do computador. Então você definiria o ponto de partida do programa e iniciaria a execução.
À medida que a tecnologia avançava, os chamados programas do gerenciador de inicialização foram desenvolvidos. São programas curtos cujo objetivo é iniciar outro programa a partir da memória do computador. O problema ao entrar nos programas pouco a pouco (e mais tarde usando um número octal e depois números hexadecimais) era que era muito lento e havia uma grande chance de o operador cometer um erro ao carregar o programa. Programas curtos seriam usados para carregar programas maiores armazenados na memória do computador. À medida que o tempo avançava, parte do código que tinha que ser digitada manualmente diminuía e, nos computadores modernos, geralmente temos gerenciadores de inicialização escritos em algum tipo de ROM ou até mesmo em memória flash.
fonte
Há alguns anos, deparei-me com um programador de microcontrolador que tinha uma tela de quatro dígitos e sete segmentos e um teclado hexadecimal. Tenho certeza de que este não tinha um microcontrolador a bordo e permiti que você digite o código da máquina diretamente, um byte de cada vez.
Portanto, isso permitiria (dolorosamente) compilar uma lista de códigos de operação manualmente, um por um, e inseri-los no chip.
Não tenho idéia se você ainda pode obtê-los, mas acho que algo semelhante foi usado quando os microcontroladores eram relativamente novos.
fonte
Os primeiros microprocessadores teriam sido programados com a ajuda de computadores existentes que não eram baseados em microprocessadores. Antes da primeira CPU ser produzida em um chip, já existiam arquiteturas avançadas de computador que eram construídas a partir de componentes discretos, em vez de microprocessadores. Dê uma olhada, digamos, no IBM 360.
fonte