1890-1950 - Operação inerente ao sistema
Os computadores mais antigos tinham o equivalente ao que um sistema operacional faz agora. Você (o operador) também fazia parte do sistema operacional. Você ligou os interruptores de registro (ou usou um cartão perfurado) e os fios de barramento fisicamente trocados (pense na antiga estação telefônica) e a memória foi conectada (através dos fios físicos) diretamente à lâmpada (o monitor do dia) e às impressoras ( armazenamento de longo prazo) de forma que a saída do programa acenda e imprima diretamente no dispositivo, à medida que ele é colocado no buffer de memória de saída. Não era necessário um driver para essas coisas porque (devido à maneira como esses fios físicos eram executados) "apenas funcionavam" (também não havia monitor nos dias de hoje). De fato, ainda demorariam algumas décadas até que um display numérico digital fosse inventado, para que você pudesse realmente ver os números que já havia inserido no registro e a saída como números decimais; as impressoras governaram toda essa época até os monitores. Eles foram conectados exatamente como precisavam para funcionar corretamente. Nada dessa parte realmente mudou muito com a mudança do mecânico (1890) para o analógico elétrico (1910) para o digital (1930). Essa arquitetura 'Plug N play' foi substituída pelo sistema de interrupção durante esse período e não voltaria à tona novamente até o final dos anos 90; é claro que até lá haveria muito menos entupimento. Com interrupções, os dispositivos podiam levar tempo de CPU, o que permitia arquiteturas que não eram ' t diretamente ligado ao hardware, mas levou várias gerações para que esse fosse realmente o processo simplificado que vemos no x86 arch (e mais recente); os primeiros sistemas frequentemente enfrentavam condições horríveis de corrida, problemas de compatibilidade / atraso de hardware e outros comportamentos estranhos no que diz respeito a interrupções. Porque cada máquina usou arquiteturas radicalmente diferentes (experimentais) nesse período; quase todos os dispositivos foram feitos sob medida para a máquina em que trabalhavam.
1950-1973 - Operação dentro de um sistema
Esta era viu o advento da maioria dos recursos que pensamos quando falamos sobre um verdadeiro sistema operacional. Depuração, linguagens de programação, multiusuários, multitarefas, terminais, unidades de disco, rede, padronização de componentes etc. foram todos introduzidos nesta era. Desta vez, houve um grande salto em direção à padronização de grande parte disso, o que significava que tínhamos dispositivos mais padronizados, mas ainda cada SO era criado manualmente para cada máquina, o que significava que a funcionalidade do SO era severamente limitada pelo que os engenheiros que projetaram esse sistema específico decidiram que precisavam. . Durante esse período, houve uma área cinzenta substancial no que era um sistema operacional, porque as diferentes arquiteturas lidam com as coisas de maneira muito diferente e uma máquina de uso geral precisará de muito mais SO do que uma máquina que inclui hardware para lidar com os mesmos trabalhos. O fato é que o hardware sempre será mais rápido que o software e praticamente tudo o que é feito em software pode ser teoricamente feito em hardware (é custo \ flexibilidade \ tamanho \ tempo \ etc, o que nos limita a criar versões quase puras de tudo. dia). Um sistema operacional foi criado para um computador ou tipo de computador específico; não funcionaria em outro lugar. Cada novo design de computador precisava que todos os softwares de baixo nível do SO fossem reescritos do zero para funcionar com um modelo de máquina específico. Perto do final desse período, surgiu um novo sistema operacional que em breve mudaria esse paradigma, o UNIX, escrito no Bell Labs por Ken Thompson e Dennis Ritchie.
1973 - Operação entre sistemas
Um único programa mudou tudo isso, mas não era o UNIX. Era o compilador C (que foi famoso em uma garagem por Ken Thompson e Dennis Ritchie depois que o Bell Labs o cortou). Até esse momento, sempre que você escrevia um código, ele era um código de máquina (código que a máquina entende diretamente, mas não é portátil) ou foi escrito em uma linguagem que compilava seu código em código de bytes (código que é interpretado por outro programa como corre). A enorme diferença para os sistemas operacionais que C trouxe com ele foi a capacidade de fazer o que é conhecido como compilação cruzada no código da máquina. Isso significava que o código poderia ser escrito uma vez e compilado para rodar em muitos tipos diferentes de máquinas nativamente, desde que um compilador tivesse sido escrito para essa máquina. Os sistemas operacionais devem ser escritos em código de máquina, porque o código de máquina é literalmente o único código que a máquina conhece.
Eu diria que não foi até Ken e Dennis compilarem o kernel UNIX pela primeira vez usando um compilador C que nasceu um verdadeiro sistema operacional no sentido moderno. Antes disso, um sistema operacional era um objeto físico ou simplesmente um pedaço de espaço de memória pré-inicializado, projetado especificamente para uma máquina específica. Adicionar novos dispositivos ao sistema literalmente exigia que o código do 'kernel' fosse reescrito. Agora, o sistema operacional UNIX que eles haviam projetado para uma máquina específica poderia ser recompilado e executado em outras máquinas sem reescrever TUDO (desde que essa máquina fosse capaz de compilar um compilador C a partir de um ambiente de inicialização, o restante do sistema operacional poderia ser escrito em o código C de nível relativamente alto).