Como SO inicializa? Exemplo com PacMan num embarcado

แชร์
ฝัง
  • เผยแพร่เมื่อ 16 ก.ย. 2024
  • Quando fazemos um programa em C, é obrigatório termos uma função de entrada, a famosa main(). Mas quando estamos falando de sistemas operacionais, como é o ponto de entrada do SO? Será que ele também tem uma main? Ou isso daí é responsabilidade de outro programa? E será que podemos usar diferentes estratégias pra fazer essa inicialização?
    Nesse vídeo quero tentar responder algumas dessas perguntas e mostrar como isso é feito em um RTOS (real time operating system), uma classe especial de SO que é utilizada em embarcados. Além disso mostrar o jogo que fiz usando um RTOS e como é feita essa inicialização de sistema nele.
    LIVES: Toda terça e quinta às 21h
    SEJA MEMBRO: / @waine_jr
    Vídeos exclusivos, lives salvas e canal no Discord só para membros!
    REDES
    Site: www.wainejr.com/
    Instagram: / waine_jr
    TikTok: / waine_jr
    GitHub: github.com/wai...
    Discord: / discord
    LINKS
    Repositório com o PacMan: github.com/wai...

ความคิดเห็น • 33

  • @joserfjunior8940
    @joserfjunior8940 หลายเดือนก่อน +34

    Processo de Inicialização do Linux
    BIOS/UEFI: Quando o computador é ligado, o BIOS (Basic Input/Output System) ou UEFI (Unified Extensible Firmware Interface) realiza o Power-On Self Test (POST) para verificar o hardware do sistema. Em seguida, ele procura por um dispositivo de boot (como um disco rígido, SSD ou dispositivo USB) e carrega o primeiro bloco do dispositivo de boot, conhecido como MBR (Master Boot Record) em sistemas mais antigos, ou o primeiro setor da partição ativa em sistemas modernos com UEFI.
    Bootloader: O bootloader é um programa pequeno, mas crucial, que carrega o kernel do sistema operacional na memória e inicia sua execução. Em sistemas Linux, o bootloader mais comum é o GRUB (GRand Unified Bootloader). O GRUB permite selecionar entre diferentes sistemas operacionais instalados ou diferentes versões do kernel do Linux.
    Arquivo Principal: O arquivo de configuração do GRUB geralmente está localizado em /boot/grub/grub.cfg. Esse arquivo contém instruções sobre onde encontrar o kernel do sistema e como inicializá-lo.
    Kernel: Após o bootloader carregar o kernel do Linux, este assume o controle do sistema. O kernel é o núcleo do sistema operacional, responsável por gerenciar o hardware e fornecer serviços básicos para todos os outros programas.
    Arquivo Principal do Kernel: O kernel do Linux é geralmente encontrado em /boot/ com nomes como vmlinuz ou bzImage. Este é o arquivo principal que o bootloader carrega para iniciar o sistema operacional.
    Sistema de Init: Depois que o kernel é carregado e inicializado, ele executa o processo de init, que é o primeiro processo em espaço de usuário (user space) e, por isso, tem o PID 1. O sistema de init gerencia a inicialização de todos os processos do sistema.
    Systemd: Em muitas distribuições Linux modernas, systemd é o sistema de init padrão. O systemd inicia e gerencia os serviços do sistema e da rede, monta sistemas de arquivos e muito mais.
    Arquivo Principal do Systemd: Os arquivos de configuração e scripts de inicialização do systemd geralmente são encontrados em /etc/systemd/ e /lib/systemd/.
    Scripts de Inicialização e Serviços: O sistema de init executa scripts de inicialização e gerencia os serviços que devem ser executados durante o boot. Estes podem incluir serviços de rede, sistemas de arquivos adicionais, serviços de log e muito mais.
    Login e Shell: Finalmente, o sistema de init inicia o processo de login, permitindo que os usuários façam login no sistema. Após o login, o usuário tem acesso ao shell ou a uma interface gráfica, dependendo da configuração do sistema.

    • @coffee-is-power
      @coffee-is-power หลายเดือนก่อน +4

      no UEFI n é o primeiro setor da partição, ele procura um arquivo na partição de UEFI em /efi/boot/bootx64.efi, e roda o executavel. Engraçado que o formato do executavel é o mesmo formato do windows .exe, mas ele não roda no windows porque, bem, ele precisa de rodar no ring 0 antes de sair dos boot services

  • @gatogordo4131
    @gatogordo4131 หลายเดือนก่อน +22

    Muito legal, parece que tá surgindo canais BR que abordam temas mais avançados

    • @waine_jr
      @waine_jr  หลายเดือนก่อน +7

      Tem muito conteúdo de baixo nível em inglês, quero trazer esse tipo de conteúdo pra português também.

    • @flukerbr
      @flukerbr หลายเดือนก่อน

      @@waine_jr quais outros canais vc recomenda?

    • @oCarlos__
      @oCarlos__ หลายเดือนก่อน

      @@flukerbr low leven learning é o mais popular, mas tem varios menores com alguns videos super interessantes que se eu achar hoje a noite edito o comentario

    • @MuriWolf
      @MuriWolf หลายเดือนก่อน

      @@oCarlos__ Opa mano, se puder passar esses outros, agradeço, tmj

    • @waine_jr
      @waine_jr  หลายเดือนก่อน

      @@flukerbr em português tem o do Augusto Galego que curto bastante, em inglês tem pra todo gosto. Um que é muito bom é o Developers Voice, podcast semanal com pessoal da indústria de programação, focando em linguagens e sistemas, mas tem também Low Level Learning, Casey Muratori, The Coding Train, e por aí vai

  • @TheMathues123
    @TheMathues123 หลายเดือนก่อน

    Esse canal é bom demais ! Só gente boa nos comentários

    • @waine_jr
      @waine_jr  หลายเดือนก่อน

      Os comentários de baixo nível aqui são mt bons, sempre aprendo com vocês. E se acha o pessoal bom aqui, cola no discord que vai se impressionar, mt gente fod por lá

  • @Grm_1234
    @Grm_1234 หลายเดือนก่อน +5

    Vou deixar minha pequena contribuição aqui. Sobre a main:
    Toda vez que você compila, o compilador usa um linker script que define os endereços de todas as seções de código (.text, .bss, .data, stack, etc…), e baseado na arquitetura ArmV7, o endereço da função de entrada se encontra na memória 0x4.
    Se você reparar no código da vector table a primeira entrada eh o endereço da stack ( fornecido pelo linker script) e a segunda entrada é o endereço da primeira linha de código ( que normalmente eh o assembly que chama o main). E isso se dá pq a primeira coisa que a arquitetura armv7 faz eh carregar o endereço do stackpointer (0x0) e depois fazer o jump da memória localizada em 0x4.
    O assembly antes da main normalmente é para zerar a memória RAM e transferir a seção .data para a RAM ( a seção .data são as variáveis globais inicializadas).

    • @waine_jr
      @waine_jr  หลายเดือนก่อน +1

      Eu lembro de o professor ter falado algumas dessas palavras, mas nada além disso kkkkkk muito obrigado pelo esclarecimento, meu caro!

  • @ryonagana
    @ryonagana หลายเดือนก่อน +10

    eu fiz o basico do basico de um sistema operacional (x86) na verdade um boot que chama o "kernel_main()" que mostra o hello world
    basicamente o binario do boot tem que ser iniciado modo16 bits e iniciado na posicao 0x100000 e eleva pra protected mode (32 bits) e chama o main no boot e bota o processador em halt (hlt) . no linux usa esse espaço pra ler a partition table e carregar o GRUB e nao inicia imediatamente e a partir da partition table vai na partição correta e da particao le o initrd depois o kernel

  • @AlexCastroDev
    @AlexCastroDev หลายเดือนก่อน

    Feliz com a comunidade crescendo

  • @kozamekinas
    @kozamekinas หลายเดือนก่อน

    Vale lembrar que BIOS é software que controla placa mãe na arquitetura PC ... Em embarcados bootloader ... Lá tem apontamento para boot do SO em embarcados firmware é SO ... Como jogos normalmente temos loop para executar funções dos jogos ... Sistema operacional deve ser parecido....

  • @marcoaurelio4903
    @marcoaurelio4903 หลายเดือนก่อน

    eBati o olho no código e já vi que foi feito no IAR.. o IDE deles tem uma curva de aprendizado grande. Eu usei no curso técnico.
    Eu não sei se a dor de cabeça era mais com o debugger da texas instruments ou se era problema da IDE mesmo.. A gente usava o MSP430, vc deve estar usando a linha TMS...

    • @waine_jr
      @waine_jr  หลายเดือนก่อน

      Foi feito no IAR sim hahahaaha mas lembro que achei bem de boa pra usar, o prof tmb sempre ajudava quando precisava. A gente usou uma Tiva pra desenvolver, tem o modelo lá no Git desse projeto

  • @forencx
    @forencx หลายเดือนก่อน

    eu sempre tive essa duvida obrigado por responder.

  • @williamalvesroot
    @williamalvesroot หลายเดือนก่อน +1

    Muito bom!

  • @SAMUELLHENRIQUE
    @SAMUELLHENRIQUE หลายเดือนก่อน +1

    Bacana demais.

  • @AlexeiDimitri
    @AlexeiDimitri หลายเดือนก่อน +2

    Na verdade a resposta certa é: NÃO.
    Todo sistema operacional tem pedaços de código que são feitos para facilitar manutenção e/ou para abstrair código, de forma que aquele pedaço é mais ou menos igual em qq hardware, deixando as partes que são dependentes de hardware agrupadas.
    A BIOS da IBM simplesmente carrega o código presente na MBR e dá literalmente um JUMP para o primeiro byte daquele código. Isso por definição não é uma chamada de função seguindo o padrão C, logo, o sistema não inicia numa main.
    MAS, o que os SOs começaram a fazer para separar a parte de boot do sistema em si para suportar tipos diferentes de inicialização foi deixar o código que roda o boot (boot loader) rodar do jeito que a plataforma manda e ele se encarrega de respeitar o kernel do sistema, chamando ele respeitando a convenção em C. Então aí ele tem um main.
    MAS, vc pode ter um sistema monolítico. Os bootloaders por exemplo por si só já são sistemas linux monolíticos que servem para carregar o linux de fato da máquina. Ele não tem um main propriamente dito.
    Mesmo que o pessoal fale do UEFI, o código UEFI só substitui o bootloader, ele continua carregando o arquivo do kernel e chamando ele seguindo a convenção C, dali o resto é praticamente igual.

    • @waine_jr
      @waine_jr  หลายเดือนก่อน

      Em Linux ou SO pra desktop eu até entendo dizer que há uma "main" e a justificativa por trás, mas quando vamos pra embarcados e RTOS, começamos a escrever na mão o assembly de inicialização e forçar o jump pra função de entrada, como nesse projeto, ou só executar tudo ali, como no exemplo monolito que disse. Apesar de manjar mt pouco dessas coisas, acho mt interessante e quero começar a explorar mais

    • @AlexeiDimitri
      @AlexeiDimitri หลายเดือนก่อน

      @@waine_jr No final das contas vc sempre tem um código feito de forma a obedecer a plataforma e vai chamar um main depois, pq é muito mais fácil conseguir desenvolver em C se vc respeita as convenções de chamada de função dela.

    • @pboechat
      @pboechat หลายเดือนก่อน

      Meus 2c:
      Entry point function pro loader eh convencao do OS (eg, o __start do elf).
      Funcao "main" (ou qlqr outro nome) eh convencao d linguagem.
      Se nao me engano tem uma palestra do cppcon q da um passo a passo da execucao d um programa passando pelo codigo gerado pelo ld (gnu).

    • @pboechat
      @pboechat หลายเดือนก่อน

      Outra coisa sobre abstracoes d ponto d entrada: os bootloaders "modernos" iniciam em realmode (e o firmware opera em realmode se nao me engano) antes d passarem pra protected mode e chamar o kernel neh

  • @Prescott2400-my6di
    @Prescott2400-my6di หลายเดือนก่อน

    Essa é a main do Linux port x86, ela está em arch/x86/boot/main.c
    void main(void)
    {
    init_default_io_ops();
    /* First, copy the boot header into the "zeropage" */
    copy_boot_params();
    /* Initialize the early-boot console */
    console_init();
    if (cmdline_find_option_bool("debug"))
    puts("early console in setup code
    ");
    /* End of heap check */
    init_heap();
    /* Make sure we have all the proper CPU support */
    if (validate_cpu()) {
    puts("Unable to boot - please use a kernel appropriate for your CPU.
    ");
    die();
    }
    /* Tell the BIOS what CPU mode we intend to run in */
    set_bios_mode();
    /* Detectmemory layout */
    detect_memory();
    /* Set keyboard repeat rate (why?) and query the lock flags */
    keyboard_init();
    /* Query Intel SpeedStep (IST) information */
    query_ist();
    /* Query APM information */
    #if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE)
    query_apm_bios();
    #endif
    /* Query EDD information */
    #if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
    query_edd();
    #endif
    /* Set the video mode */
    set_video();
    /* Do the last things and invoke protected mode */
    go_to_protected_mode();
    }

  • @ariondeno
    @ariondeno หลายเดือนก่อน +1

    No Asm _start:

  • @anquelmartho
    @anquelmartho หลายเดือนก่อน

    Pelo visto mais gente assiste o Thor. 😊

    • @waine_jr
      @waine_jr  หลายเดือนก่อน +1

      O cara é um prefeito, além das lives e vídeo dá até trilha sonora pra gente

    • @anquelmartho
      @anquelmartho หลายเดือนก่อน

      @@waine_jr faltou umas capivara pixel art pulando na tela