Linux核心的啟動簡述

2021-07-10 10:55:30 字數 3163 閱讀 1850

《linux核心分析》mooc課程

作業系統法寶:堆疊,中斷上下文切換,程序上下文切換

linux源**目錄 linux-3.18.6

arch

不同的cpu體系結構相關的**,主要研究x86目錄

documentation

相關文件

drivers

驅動相關**

fs檔案系統相關**

init

核心啟動相關**,其中main.c的start_kernel是系統啟動的入口

kernel

核心相關**

mm記憶體管理相關**

net網路相關** c

繼續執行(continue)

list

檢視**

break

設定斷點

qemu -kernel linux-3.18.6/arch/x86/boot/bzimage -initrd rootfs.img -s -s # 關於-s和-s選項的說明:

# -s freeze cpu at startup (use 』c』 to start execution)

# -s shorthand for -gdb tcp::1234 若不想使用1234埠,則可以使用-gdb tcp:***x來取代-s選項

(gdb)file linux-3.18.6/vmlinux # 在gdb介面中targe remote之前載入符號表

(gdb)target remote:1234 # 建立gdb和gdbserver之間的連線,按c 讓qemu上的linux繼續執行

(gdb)break start_kernel # 斷點的設定可以在target remote之前,也可以在之後

kernel_init中完成初始化操作

9

500asmlinkage __visible void __init start_kernel(void)

501629#endif

630 page_cgroup_init();

631 debug_objects_mem_init();

632 kmemleak_init();

633 setup_per_cpu_pageset();

634 numa_policy_init();

635 if (late_time_init)

636 late_time_init();

637 sched_clock_init();

638 calibrate_delay();

639 pidmap_init();

640 anon_vma_init();

641 acpi_early_init();

642#ifdef config_x86

643 if (efi_enabled(efi_runtime_services))

644 efi_enter_virtual_mode();

645#endif

646#ifdef config_x86_espfix64

647 /* should be run before the first non-init thread is created */

648 init_espfix_bsp();

649#endif

650 thread_info_cache_init();

651 cred_init();

652 fork_init(totalram_pages);

653 proc_caches_init();

654 buffer_init();

655 key_init();

656 security_init();

657 dbg_late_init();

658 vfs_caches_init(totalram_pages);

659 signals_init();

660 /* rootfs populating might need page-writeback */

661 page_writeback_init();

662 proc_root_init();

663 cgroup_init();

664 cpuset_init();

665 taskstats_init_early();

666 delayacct_init();

667668 check_bugs();

669670 sfi_init_late();

671672 if (efi_enabled(efi_runtime_services))

676677 ftrace_init();

678679 /* do the rest non-__init'ed, we're now alive */

680 rest_init();

681}

trap_init : 中斷向量的初始化工作

set_intr_gate : 設定中斷門

set_system_trap_gate : 系統呼叫中斷

393static noinline void __init_refok rest_init(void)

394

reset_init : 0程序初始化工作

kernel_init : 1號程序(使用者態)初始化

linux中1號程序是由0號程序來建立的,因此必須要知道的是如何建立0號程序,由於在建立程序時,程式一直執行在核心態,而程序執行在使用者態,因此建立0號程序涉及到特權級的變化,即從特權級0變到特權級3,linux是通過模擬中斷返回來實現特權級的變化以及建立0號程序,通過將0號程序的**段選擇子以及程式計數器eip直接壓入核心態堆疊,然後利用iret彙編指令中斷返回跳轉到0號程序執行。

簡述Linux開機啟動流程

計算機開機是乙個神秘的過程。我們只是按了開機鍵,就看到螢幕上的進度條或者一行行的輸出,直到我們到達登入介面。然而,計算機開機又是個異常脆弱的過程,我們滿心期望的登入介面可能並不會出現,而是乙個命令列或者錯誤資訊。了解計算機開機過程有助於我們修復開機可能出現的問題。最初始階段 當我們開啟計算機電源,計...

linux 核心 核心啟動流程

cs是 段暫存器,ip是指令指標暫存器 相當於偏移位址 儲存的是 指令的位址。cs ip共同作用生成了 位址,具體演算法是cs左移4位 ip即是 位址。例如cs 0xf000,ip 0xfff0,則 位址為0xffff0.global globl 命令 global symbol global 使得...

Linux的核心啟動引數

linux核心在啟動的時候,能接收某些命令列選項或啟動時引數。當核心不能識別某些硬體進而不能設定硬體引數或者為了避免核心更改某些引數的值,可以通過這種方式手動將這些引數傳遞給核心。如果不使用啟動管理器,比如直接從bios或者把核心檔案用 cp zimage dev fd0 等方法直接從裝置啟動,就不...