Linux學習筆記(七)-Linux內核分析

Linux內核分析

一. Linux內核版本

Linux內核版本號由3個數字組成,例: 2.6.18-128.Elsmp。其中,第一個數字: 2 表示主版本號,第二個數字6 表示次版本號,表示穩定版本(因爲有偶數)。而第三個數字 18 表示修訂版本號,即表示修改的次數。128表示微調次數。前兩個數字合在一齊可以描述內核系列。如穩定版的2.6.0,它是2.6版內核系列。而ELsmp指出了當前內核是爲ELsmp特別調校的 EL ,Enterprise Linux smp : 表示支持多處理器,即該內核版本支持多處理器

二. 內核源代碼的物理分佈

在redhat linux下有一個目錄,即/usr/src/kernels/目錄,裏面是linux系統的內核源文件,一般分爲3個目錄,其中:
- 2.6.9-11.EL-hugement-i686 for 大於4G memory 的內核.
- 2.6.9-11.EL-smp-i686 是for 多CPU的內核.
- 2.6.9-5.EL-i686 內核源代碼

目錄詳解:

  • include/ 子目錄包含了建立內核代碼時所需的大部分包含文件,這個模塊利用其它模塊重建內核。
  • init/ 子目錄包含了內核的初始化代碼,這是內核開始工作的起點。
  • arch/ 子目錄包含了所有硬件結構特定的內核代碼。arch/ 子目錄下有i386和alpha模塊等等。
  • drivers/ 目錄包含了內核中所有的設備驅動程序,如塊設備,scsi 設備驅動程序等等。
  • fs/ 目錄包含了所有文件系統的代碼,如:ext2, vfat模塊的代碼等等。
  • net/ 目錄包含了內核的連網代碼。
  • mm/ 目錄包含了所有的內存管理代碼。
  • ipc/ 目錄包含了進程間通信的代碼。
  • kernel/ 目錄包含了主內核代碼

源代碼閱讀方法(推薦網址源代碼導航器站點:http://lxr.linux.no/source):

    1. 系統的啓動和初始化 
    在基於Intel的系統上,當GRUB把內核裝入到內存並把控制權傳遞給內核時,內核開始啓動。關於這一部分,看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
   這是所有聲卡驅動程序的所在地。
   8. 文件系統
    EXT2 文件系統的源代碼全部在  fs/ext2/ 目錄下,而其數據結構的定義在  include/linux/ext2_fs.h, ext2_fs_i.h 及 ext2_fs_sb.h中。 虛擬文件系統的數據結構在 include/linux/fs.h中描述,而代碼是在fs/*中。 緩衝區高速緩存與更新內核的守護進程的實現是在 fs/buffer.c中 
    9. 網絡
    網絡代碼保存在/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下
    10. 模塊
    內核模塊的代碼部分在內核中,部分在模塊包中,前者全部在kernel/modules.c中,而數據結構和內核守護進程kerneld的信息分別在include/linux/module.h和include/linux/kerneld.h 中

三. 內核重編譯與配置
1. 爲什麼編譯內核

標準發行版本的內核可能不滿足需求
升級到新內核版本
體驗或開發內核
好玩

2 . 內核編譯的步驟

  1、獲取內核源代碼
  2、配置內核(創建配置文件 .config)
  3、編譯內核
  4、內核的安裝、配置grub
  5、重新起動計算機,使用該新內核

Step1: 獲取內核資源
先把linux-2.6.18.tar.bz2 (可從www.kernel.org或者其他渠道下載)複製到/usr/src/ 的下面,然後

#tar –jxvf  linux-2.6.18.tar.bz2
#cd linux-2.6.18.2
#make mrproper //把原來編譯產生的垃圾刪除

Step2:配置內核
在重編譯內核以前,你首先要了解你的機器的硬件。瞭解內核需要支持什麼。
配置信息在 /usr/src/kernels/linux-version目錄下的 .config 文件中,直接編輯是困難的
1)可以使用三條命令來進行配置:
- make config (字符界面方式,問答驅動)
- make menuconfig (字符界面方式,菜單驅動)
- make xconfig (圖形界面方式)
-
如果使用了make config,系統會給出很多問題,要求回答。一般有三種選擇,它們分別代表的含義如下:   
“Y”- 將該功能編譯進內核   
“N”- 不將該功能編譯進內核   
“M”- 將該功能編譯成可以在需要時動態插入到內核中的模塊。

進行配置時,大部分選項可以使用其缺省值,只有小部分需要根據用戶不同的需要選擇。例如,如果需要內核支持DOS分區的文件系統,則要在文件系統部分選擇FAT或DOS系統支持;系統如果配有網卡、PCMCIA卡等,需要在網絡配置中選擇相應卡的類型。

這些問題都回答完後,系統會給出一個信息;configuration written to .config

Step3:編譯內核
2)檢查相關依賴性:#make dep。如果缺乏依賴的模塊,則make dep會報錯。
3)清除臨時文件:#make clean
4)生成內核鏡像文件:#make bzImage
Compiles kernel
May take 5-60 minutes
在需要內核支持較多的外設和功能時,內核可能變得很大,此時可以編譯大內核(即b,而z表示壓縮)。
Creates kernel image (bzImage) in
/usr/src/linux-/arch//boot
5) 生成模塊:#make modules;
Compiles modules
May take 2-60 minutes
使用以上幾步,就可以生成內核鏡像文件bzImage,缺省的,這個文件放在 /usr/src/linux-version/arch/i386/boot 目錄下

Step 4:內核的安裝,及在grub中配置使用
6)將內核映像拷貝到/boot
#cp arch/i386/boot/bzImage /boot/bzImage-version
7)將System.map 和 .config文件拷貝到/boot 以便將來參考
#cp System.map /boot/System.map-version
#cp .config /boot/Config-version
8)Install modules
#make modules_install
9)配置GRUB以增加新的內核,例如
title new
root (hd0,0)
kernel /bzImage-2.4.18-Test ro root=/dev/hda3
mem=128M
Step 5: 重啓系統,啓用新內核
Ctrl-Alt-Delete or shutdown -r now
在引導菜單中選擇新內核
檢查內核的啓動消息,查看是否有錯誤
快捷鍵 Shift-PgUp
使用 dmesg命令
查看文件 /var/log/messages
檢查內核的功能
檢測出內存的容量
設備是否工作正常?
性能如何?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章