Linux內核設計第三週——構造一個簡單的Linux系統

Linux內核設計第三週——構造一個簡單的Linux系統

1、知識點總結

1.Linux內核源代碼簡介

  • arch目錄:代碼量大,使咱們重點關注的(如其中的X86)。html

  • document:文檔;linux

  • fs:文件系統ios

  • init:內核啓動相關的代碼都在init目錄下(start_kernel函數至關於普通C程序的main函數。)web

  • ipc:進程間通訊;shell

  • kernel目錄:Linux內核的核心代碼在此目錄下緩存

  • lib:庫文件markdown

  • mm:內存管理網絡

  • net:網絡管理數據結構

2.簡單分析一下start_kernel

計算機三個法寶:socket

1. 存儲程序計算機
2. 函數調用堆棧
3. 中斷

操做系統兩把寶劍:

1.中斷上下文的切換
2.進程上下文的切換

跟蹤內核的啓動過程:

  1. 找到init目錄下的main.c

  2. init_task即手工建立的PCB,0號進程即最終的idle進程。

  3. 無論分析內核的哪一部分都會涉及到start_kernel,由於:全部的模塊都是初始化都是經過start_kernel調用完成的。

【trap_init:涉及到中斷的一些調用、陷阱門】
【mm_init:內存管理模塊】
【rest_init:是一個0號進程,建立了1號進程kernel_init當系統內有進程須要執行時就調度到idle進程】
enter description here

3.使用gdb跟蹤調試Linux內核的方法

命令:

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

  1. 編譯內核

  2. 製做根文件系統(init是第一個用戶態進程,是1號進程)

  3. 啓動MenuOS

2、實驗過程

1.打開shell

cd LinuxKernel/
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

2.使用gdb進行調試

3.將斷點設置到start_kernal

 

3、實驗分析及總結

1.實驗分析

本次實驗在作的時候並非特別明白,經過老師上課講解以後,對於實驗的過程和每部分的做用有了相對清晰地認識。

2.實驗總結

內核啓動過程:start_kernel內核啓動後,rest_init()做爲一個0號進程就一直存在;而後這個0號進程就建立了1號進程kernel_init,接下來還建立了其餘的一些服務類的內核線程。

在參考文件裏還有一些可參考的內容,列在這裏,以便查閱:

  1. 系統的啓動和初始化
    在基於Intel的系統上,當 loadlin.exe 或 LILO把內核裝入到內存並把控制權傳遞給內核時,內核開始啓動。關於這一部分,看arch/i386/kernel/head.S ,head.S進行特定結構的設置,而後跳轉到init/main.c的main()例程。

  2. 內存管理
    內存管理的代碼主要在/mm,但特定結構的代碼在arch/*/mm。缺頁中斷處理的代碼在mm/memory.c ,而內存映射和頁高速緩存器的代碼在mm/filemap.c。緩衝器高速緩存是在mm/buffer.c 中實現,而交換高速緩存是在mm/swap_state.c 和 mm/swapfile.c中實現。

  3. 內核
    內核中,特定結構的代碼在arch/*/kernel,調度程序在kernel/sched.c,fork的代碼在kernel/fork.c,task_struct 數據結構在 include/linux/sched.h中。

  4. PCI
    PCI 僞驅動程序在 drivers/pci/pci.c ,其定義在include/linux/pci.h。每一種結構都有一些特定的 PCI BIOS 代碼, Intel的在arch/alpha/kernel/bios32.c。

  5. 進程間通訊
    全部System V IPC 對象權限都包含在 ipc_perm 數據結構中,這能夠在 include/linux/ipc.h中找到。 System V 消息是在 ipc/msg.c中實現, 共享內存在 ipc/shm.c中,信號量在 ipc/sem.c中,管道在 ipc/pipe.c中實現。

  6. 中斷處理
    內核的中斷處理代碼是幾乎全部的微處理器所特有的。中斷處理代碼在 arch/i386/kernel/irq.c中,其定義子在 include/asm-i386/irq.h中。

  7. 設備驅動程序
    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
    這是全部聲卡驅動程序的所在地。

  1. 文件系統
    EXT2 文件系統的源代碼所有在 fs/ext2/ 目錄下,而其數據結構的定義在 include/linux/ext2_fs.h, ext2_fs_i.h 及 ext2_fs_sb.h中。 虛擬文件系統的數據結構在 include/linux/fs.h中描述,而代碼是在fs/*中。 緩衝區高速緩存與更新內核的守護進程的實現是在 fs/buffer.c中 。

  2. 網絡
    網絡代碼保存在/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下。

  3. 模塊
    內核模塊的代碼部分在內核中,部分在模塊包中,前者所有在kernel/modules.c中,而數據結構和內核守護進程kerneld的信息分別在include/linux/module.h和include/linux/kerneld.h 中。若是你想看ELF目標文件的結構,它位於include/linux/elf.h中。

4、參考文獻

  1. 深刻分析Linux內核源碼 http://www.kerneltravel.net/kernel-book/深刻分析Linux內核源碼.html

  2. Linux - Linux內核分析 - 實驗樓 https://www.shiyanlou.com/courses/195#

  3. Linux內核分析 - 網易雲課堂 http://mooc.study.163.com/learn/USTC-1000029000?tid=2001214000#/learn/hw?id=2001372006

相關文章
相關標籤/搜索