arch目錄:代碼量大,使咱們重點關注的(如其中的X86)。html
document:文檔;linux
fs:文件系統ios
init:內核啓動相關的代碼都在init目錄下(start_kernel函數至關於普通C程序的main函數。)web
ipc:進程間通訊;shell
kernel目錄:Linux內核的核心代碼在此目錄下緩存
lib:庫文件markdown
mm:內存管理網絡
net:網絡管理數據結構
計算機三個法寶:socket
1. 存儲程序計算機
2. 函數調用堆棧
3. 中斷
操做系統兩把寶劍:
1.中斷上下文的切換 2.進程上下文的切換
跟蹤內核的啓動過程:
找到init目錄下的main.c
init_task即手工建立的PCB,0號進程即最終的idle進程。
無論分析內核的哪一部分都會涉及到start_kernel,由於:全部的模塊都是初始化都是經過start_kernel調用完成的。
【trap_init:涉及到中斷的一些調用、陷阱門】
【mm_init:內存管理模塊】
【rest_init:是一個0號進程,建立了1號進程kernel_init當系統內有進程須要執行時就調度到idle進程】
命令:
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s-S
【s選項的說明:
-S:在CPU初始化以前凍結起來
-s:在-gdb tcp::1234端口上建立了一個gdb server。】
#構造一個簡單的linux系統MenuOS
編譯內核
製做根文件系統(init是第一個用戶態進程,是1號進程)
啓動MenuOS
cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img
本次實驗在作的時候並非特別明白,經過老師上課講解以後,對於實驗的過程和每部分的做用有了相對清晰地認識。
內核啓動過程:在start_kernel
內核啓動後,rest_init()做爲
一個0號進程就一直存在;而後這個0號進程就建立了1號進程kernel_init
,接下來還建立了其餘的一些服務類的內核線程。
在參考文件裏還有一些可參考的內容,列在這裏,以便查閱:
系統的啓動和初始化
在基於Intel的系統上,當 loadlin.exe 或 LILO把內核裝入到內存並把控制權傳遞給內核時,內核開始啓動。關於這一部分,看arch/i386/kernel/head.S ,head.S進行特定結構的設置,而後跳轉到init/main.c的main()例程。
內存管理
內存管理的代碼主要在/mm,但特定結構的代碼在arch/*/mm。缺頁中斷處理的代碼在mm/memory.c ,而內存映射和頁高速緩存器的代碼在mm/filemap.c。緩衝器高速緩存是在mm/buffer.c 中實現,而交換高速緩存是在mm/swap_state.c 和 mm/swapfile.c中實現。
內核
內核中,特定結構的代碼在arch/*/kernel,調度程序在kernel/sched.c,fork的代碼在kernel/fork.c,task_struct 數據結構在 include/linux/sched.h中。
PCI
PCI 僞驅動程序在 drivers/pci/pci.c ,其定義在include/linux/pci.h。每一種結構都有一些特定的 PCI BIOS 代碼, Intel的在arch/alpha/kernel/bios32.c。
進程間通訊
全部System V IPC 對象權限都包含在 ipc_perm 數據結構中,這能夠在 include/linux/ipc.h中找到。 System V 消息是在 ipc/msg.c中實現, 共享內存在 ipc/shm.c中,信號量在 ipc/sem.c中,管道在 ipc/pipe.c中實現。
中斷處理
內核的中斷處理代碼是幾乎全部的微處理器所特有的。中斷處理代碼在 arch/i386/kernel/irq.c中,其定義子在 include/asm-i386/irq.h中。
設備驅動程序
Linux內核源代碼的不少行是設備驅動程序。Linux設備驅動程序的全部源代碼都保存在/driver,根據類型可進一步劃分爲:
/block
塊設備驅動程序如ide(在ide.c)。若是你想看包含文件系統的全部設備是如何被初始化的,你應當看drivers/block/genhd.c中的device_setup(),device_setup()不只初始化了硬盤,當一個網絡安裝nfs文件系統時,它也初始化網絡。塊設備包含了基於IDE和SCSI的設備。
/char
這是看字符設備(如tty,串口及鼠標等)驅動程序的地方。
/cdrom
Linux的全部CDROM代碼都在這兒,如在這兒能夠找到Soundblaster CDROM的驅動程序。注意ide CD的驅動程序是 ide-cd.c,放在drivers/block,SCSI CD的驅動程序是scsi.c,放在drivers/scsi。
/pci
這是PCI僞驅動程序的源代碼,在這裏能夠看到PCI子系統是如何被映射和初始化的。
/scsi
在這裏能夠找到全部的SCSI代碼及Linux所支持的scsi設備的全部設備驅動程序。
/net
在這裏能夠找到網絡設備驅動程序,如DECChip 21040 PCI 以太網驅動程序在tulip.c中。
/sound
這是全部聲卡驅動程序的所在地。
文件系統
EXT2 文件系統的源代碼所有在 fs/ext2/ 目錄下,而其數據結構的定義在 include/linux/ext2_fs.h, ext2_fs_i.h 及 ext2_fs_sb.h中。 虛擬文件系統的數據結構在 include/linux/fs.h中描述,而代碼是在fs/*中。 緩衝區高速緩存與更新內核的守護進程的實現是在 fs/buffer.c中 。
網絡
網絡代碼保存在/net中,大部分的include文件在include/net下,BSD套節口代碼在net/socket.c中,IP 第4版本的套節口代碼在net/ipv4/af_inet.c。通常的協議支持代碼(包括sk_buff 處理例程)在net/core下,TCP/IP聯網代碼在net/ipv4下,網絡設備驅動程序在/drivers/net下。
模塊
內核模塊的代碼部分在內核中,部分在模塊包中,前者所有在kernel/modules.c中,而數據結構和內核守護進程kerneld的信息分別在include/linux/module.h和include/linux/kerneld.h 中。若是你想看ELF目標文件的結構,它位於include/linux/elf.h中。
深刻分析Linux內核源碼 http://www.kerneltravel.net/kernel-book/深刻分析Linux內核源碼.html
Linux - Linux內核分析 - 實驗樓 https://www.shiyanlou.com/courses/195#
Linux內核分析 - 網易雲課堂 http://mooc.study.163.com/learn/USTC-1000029000?tid=2001214000#/learn/hw?id=2001372006