Processo de Startup do Linux

789 views

Published on

Palestra: Processo de Startup do Linux - Prof. Mauro Tapajós Santos

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
789
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
21
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • Firmware usually has provisions for loading some fixed, small amount of code. In the Intel world, that’s a 512 byte “boot sector”. Even the Linux hackers can’t fit an operating system into 512 bytes! The game is to load a series of increasingly larger and more capable code segments. The two-stage process seems sufficient, in theory. The first fixed-length piece of code loads a larger, arbitrary length code segment. Due to other constraints, it is often convenient to “bootstrap” a more capable loader which can then load the final target (or another, more capable loader). By “hardware bootstrap” I mean the mechanism that loads the first bit of code, the primary. Some authors just use the term “bootstrap”. Even if the firmware can boot your kernel directly, it is convenient to interpose a software loader for additional flexibility. Updating firmware is not easy when you need to do something slightly differently. Updating a software loader is much easier.
  • When you power-on the Intel, it reads a “start address” from location 0xfffffff0 and jumps to that location. In the standard PC configuration, this address is the BIOS entry point. Strangely, the location 0xfffffff0 is also part of BIOS (the high 64K of memory). This indirect mechanism allows Intel chips to be used in non-PC settings. Everything happens in real-mode so some memory mapping tricks are used to make the high BIOS addresses reachable in real-mode. After executing the POST, BIOS enters the bootstrap interrupt handler and tries to load a boot sector using the BIOS-defined order. For a floppy, BIOS always loads the first sector. For a hard disk, the first sector which is a Master Boot Record (MBR or mboot) containing some code and a partition table are loaded. The loaded code searches the partition table for the active (bootable) partition. If the MBR is from the active partition we are done. If the active partition is some other partition, the MBR code loads the boot sector of that partition. This is sometimes referred to as a partition boot sector or pboot. There are further complications for extended and logical partitions. Eventually the “correct” boot sector is loaded. Each boot sector contains a “magic number” to verify that it is, indeed, a boot sector. If the magic number is verified, then the boot sector code is executed.
  • The “map installer” is controlled by the text file lilo.conf which identifies the desired boot scenario and details available boot images. Rerun /sbin/lilo anytime boot-related files change! That includes lilo.conf, the kernel itself, the boot loaders, the disk partition structure, etc. Newer versions of LILO keep most files in /boot by default. Under RedHat 6.1 the compressed kernel image is called vmlinuz. The actual primary and secondary bootloaders (the “real” LILO) live in the file /boot/boot.b. You can generate your own if you are clever enough but most people use the supplied loaders. Certain boot scenarios require loading additional loaders (for example, to boot off a logical partition). LILO supports this via the concept of a “chain loader”. The default chain loader is available as /boot/chain.b. The file /boot/map contains the actual sector map with a variety of other information. See the Technical Overview for details. Finally, the /boot directory may also contain an initial ramdisk image (initrd) used during boot.
  • Processo de Startup do Linux

    1. 1. Startup do Kernel do Linux Prof. Mauro Tapajós
    2. 2. Objetivos <ul><li>Apresentar aos participantes do projeto Itautec vários aspectos do processo de startup dos sistemas Linux que poderão vir a ser usados na distribuição para as máquinas Itautec
    3. 3. Levantar as questões relevantes sobre o assunto para a pesquisa em andamento do projeto
    4. 4. Investigar as dúvidas que ocorrerem aos participantes e esclarecê-las para que a pesquisa siga adiante </li></ul>
    5. 5. Startup de Arquiteturas Intel <ul><li>Ao ser ligado, o sistema roda sua BIOS normalmente armazenada em EPROM
    6. 6. O programa de bootstrap da BIOS </li><ul><li>Executa auto-testes
    7. 7. Sonda o barramento para descobrir o dispositivo bootável
    8. 8. Lê o programa de boot do dispositivo bootável </li></ul><li>A BIOS permite configurações básicas como a ordem de procura dos dispositivos de armazenamento para disparo
    9. 9. O primeiro setor da mídia de boot é carregado em memória e executado
    10. 10. Este pequeno programa é responsável em carregar o SO. Aqui podem existir boot managers como o LILO (/etc/lilo.conf) ou o GRUB </li></ul>
    11. 11. Bootstrap Loader (Bootloader) <ul><li>Carrega o primeiro programa (kernel)
    12. 12. Normalmente carregado em dois estágios
    13. 13. Requer suporte firmware (“ hardware bootstrap ”) </li></ul>cpu firmware (PROM) kernel primary secondary memory primary secondary kernel net floppy cd-rom boot device? bootloader
    14. 14. Boot – Arquitetura Intel x86 Carrega o setor de boot (512 bytes) no endereço 0x7C00 e passa o controle em modo real (limite de 640K) <ul><li>Power On Self Test (POST)
    15. 15. Geração de INT 19h (bootstrap)
    16. 16. Seleção do boot device
    17. 17. Carga do setor de boot </li></ul><ul><ul><li>floppy: first sector
    18. 18. hard disk: MBR (mboot) or partition boot block (pboot) </li></ul></ul><ul><li>Executa o programa no setor de boot ( primary bootloader ) </li></ul>cpu memory boot sector BIOS_start
    19. 19. Boot Managers <ul><li>Permitem: </li><ul><li>Escolher dentre vários kernels (útil para nós!)
    20. 20. Definir parâmetros de boot
    21. 21. Boot de outros kernels (windows) </li></ul><li>Se localizam no setor de boot ou no setor de boot da partição
    22. 22. Não tem conhecimento prévio da estrutura de filesystem
    23. 23. Para encontrar os kernels tem que fazer uma “mapa” (block map) – arquivo /boot/map
    24. 24. /boot/boot.b é parte do loader (não sei se é a secundária do LILO ou a primária) </li></ul>
    25. 25. Exemplo: LILO /sbin/lilo (“map installer”) /etc/lilo.conf /boot/boot.b /boot/chain.b /boot/map /boot/vmlinuz
    26. 26. Startup do Kernel Linux <ul><li>O kernel indicado ( image ) é carregado
    27. 27. Como ele normalmente está comprimido, um pequeno código de descompressão é embutido no início da imagem do kernel para descomprimi-lo
    28. 28. O kernel então analisa o hardware e tenta configurá-lo carregando os drivers adequados
    29. 29. Depois ele tenta montar o filesystem root (/) – normalmente em modo read-only
    30. 30. Com o filesystem montado, ele roda o programa init (/sbin/init) que será o processo de número 1 e irá carregar os serviços configurados no sistema
    31. 31. O sistema então vem para o runlevel single-user e/ou multi-user </li></ul>
    32. 32. Startup do Kernel Linux
    33. 33. Startup do Kernel Linux <ul><li>Uma vez carregado, o kernel ocupa uma área fixa de memória e fica durante todo o tempo de operação do sistema
    34. 34. Ao ser carregado, ele indica quanta memória ainda está disponível
    35. 35. O primeiro código do kernel a ser rodado é o startup_32: (label Assembler) que chama a função start_kernel() </li></ul>Power on Power off Boot Kernel Init OS Init RUN! Shut down
    36. 36. Sequência start_kernel() <ul><li>lock_kernel – tranca o kernel para carregamento
    37. 37. trap_init - ?
    38. 38. init_IRQ – Inicializaçào das rotinas de manipulação de IRQs
    39. 39. sched_init – Inicialização do scheduler de processos
    40. 40. softirq_init - Inicializaçào das rotinas de manipulação de interrupções de software
    41. 41. time_init - ?
    42. 42. console_init - ?
    43. 43. init_modules - Inicialização dos módulos (se houverem)
    44. 44. kmem_cache_init – caches de memória
    45. 45. Sti - ?
    46. 46. calibrate_delay - ?
    47. 47. mem_init - ?
    48. 48. kmem_cache_sizes_init - ?
    49. 49. pgtable_cache_init - ?
    50. 50. fork_init – Suporte a forks
    51. 51. proc_caches_init - ?
    52. 52. vfs_caches_init – cache de VFS
    53. 53. buffer_init - ?
    54. 54. page_cache_init - ?
    55. 55. signals_init – Manipulação de sinais
    56. 56. proc_root_init – fs /proc
    57. 57. ipc_init – comunicação interprocesso
    58. 58. check_bugs - ?
    59. 59. smp_init – Suporte multiprocessamento?
    60. 60. rest_init – Dispara a thread init, destrava kernel e roda loop de execuçào infinito cpu_idle </li></ul>
    61. 61. Sequência init() <ul><li>Lock_kernel
    62. 62. Do_basic_setup </li></ul><ul><ul><li>mtrr_init
    63. 63. sysctl_init
    64. 64. pci_init
    65. 65. sock_init
    66. 66. start_context_thread
    67. 67. do_init_calls ((*call())-> kswapd_init ) </li></ul></ul><ul><li>prepare_namespace
    68. 68. free_initmem
    69. 69. unlock_kernel
    70. 70. execve </li></ul>
    71. 71. Programa init <ul><li>O programa init lê seu arquivo de configuração (/etc/inittab) e cria os runlevels </li></ul>0-halt 1-Single user mode 2-Multiuser, without NFS 3-Full multiuser mode 4-unused 5-X11 6-Reboot

    ×