make i386_defconfig 生成x86体系结构的默认配置。此过程首先HOSTCC、SHIPPED、HOSTLD一些配置文件,然后进入 Linux Kernel Configuration,与 make config 的命令行界面相同,只是所有选项都被自动选择了(具体参见 arch/x86/configs/i386_defconfig)。
make 编译代码。由CC、LD、AR、AS、GEN、HOSTCC、OBJCOPY、BUILD等过程组成。其中有一些 warning,是因为代码不符合当前C标准,可以忽略。
BUILD arch/x86/boot/bzImage
Root device is (8, 2)
Setup is 10140 bytes (padded to 10240 bytes).
System is 2651 kB
CRC e3791c7
Kernel: arch/x86/boot/bzImage is ready (#1)
make menuconfig 进入终端下的菜单选择。相比完全命令行界面的 config,用起来更方便;而图形界面的 xconfig 或 gconfig 虽然比较直观,但不便于使用键盘。
设置完毕,保存到 .config
make 编译代码,生成的内核映像是 arch/x86/boot/bzImage
Root device is (8, 2)
Setup is 10140 bytes (padded to 10240 bytes).
System is 3063 kB
CRC aa68b290
Kernel: arch/x86/boot/bzImage is ready (#3)
Building modules, stage 2.
MODPOST 26 modules
由于我们是在虚拟机内运行而不是安装到本地系统,因此不需要 make install
具体设置参考:Linux 2.6.19.x 内核编译配置选项简介(金步国)
General Setup
为 local version 赋予一个惟一的自定义版本号(如boj1),以免不同的内核发生混淆
选中 Auditing Support,以方便以后试验 SELinux
要选中 Initramfs,现在 Linux 启动一般都用 initramfs(原来的 initrd)
需要选中 RAM block device support,initrd 需要用。
Menuconfig Help 中说
│ Saying Y here will allow you to use a portion of your RAM memory as
│ a block device, so that you can make file systems on it, read and
│ write to it and do all the other things that you can do with normal
│ block devices (such as hard drives). It is usually used to load and
│ store a copy of a minimal root file system off of a floppy into RAM
│ during the initial install of Linux.
Most normal users won't need the RAM disk functionality, and can thus say N here.
因此第一次配置时没有编译进内核,导致虚拟机无法启动:
[ 0.776881] Unpacking initramfs...<0>Kernel panic - not syncing: bad gzip magic numbers
ATA/ATAPI/MFM/RLL support
取消 Include IDE/ATA-2 DISK support
SCSI device support
选中 RAID Transport Class,将来可能折腾 RAID
Multiple devices driver support (RAID and LVM)
将 RAID support 及相关选项编译为模块,以使用软RAID。
选中 Device Mapper support,以使用 LVM。
取消 Macintosh device drivers
Multimedia devices
选中 Video for Linux,以便进行摄像头编程
Sound
选中 Advanced Linux Sound Architechture,计算机上的声卡需要用 ALSA。
取消 Open Sound System
选中 Real Time Clock,以便获取系统时间
选中 DMA Engine Support,以便使用 Direct Memory Access
Firmware Drivers
没有特殊固件,因此保留默认配置。
File Systems
ext2、ext3、ext4 都是 Linux 经典文件系统,经常需要用到,编译进内核
ReiserFS 对于小文件的处理效率很高,有个存放各种源代码的分区用这个文件系统,编译进内核
选中 Filesystem in Userspace Support,ntfs-3g 是基于 fuse 的,这样不用每次开机都加载 fuse 模块。
[ 4.270006] Freeing unused kernel memory: 244k freed
Hello World![ 4.326627] Kernel panic - not syncing: Attempted to kill init!
4 准备源码阅读环境
4.1 vim 基本设置
[boj@boj-laptop:~]$ cat ~/.vimrc
set encoding=UTF-8
set langmenu=zh_CN.UTF-8
language message zh_CN.UTF-8
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
set fileencoding=utf-8
sy on
set ai
set nu
set shiftwidth=2
set tabstop=4
set softtabstop=4
set ic "搜索时忽略大小写,以便在某些“骆驼”变量名风格的源码中查找
4.4 使用 taglist 显示 symbol 窗口
taglist 插件可以像 Source Insight 那样将当前文件中的宏、全局变量、函数等 tag 显示在 Symbol 窗口,用鼠标点上述 tag,就跳到该 tag 定义的位置;可以按字母序、该tag所属的类或scope,以及该 tag 在文件中出现的位置进行排序;如果切换到另外一个文件,Symbol 窗口更新显示这个文件中的 tag。taglist 依赖于 ctags。
打开 vim 的文件类型自动检测功能;
系统中装了 Exuberant ctags 工具,并且 taglist 能够找到此工具(因为 taglist 需要调用它来生成 tag 文件);
vim 支持 system() 调用;
在 ~/.vimrc 中加入
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" ctags setting
set tags=./tags,./../tags,./*/tags;
" Tag list (ctags)
filetype on "文件类型自动检测
if MySys() == "windows" "设定windows系统中ctags程序的位置
let Tlist_Ctags_Cmd = 'ctags'
elseif MySys() == "linux" "设定linux系统中ctags程序的位置
let Tlist_Ctags_Cmd = '/usr/bin/ctags'
endif
let Tlist_Show_One_File = 1 "不同时显示多个文件的tag,只显示当前文件的
let Tlist_Exit_OnlyWindow = 1 "如果taglist窗口是最后一个窗口,则退出vim
let Tlist_Use_Right_Window = 1 "在右侧窗口中显示taglist窗口
map <silent> <F8> :TlistToggle<cr> "在映射F8键打开tags窗口
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""