GigaHttpd 开发环境



本文最近更新:2009-03-28



我们的路还很长。


* 前言

  本文主要介绍如何搭建一个 GigaHttpd 的开发环境。

  本文其实是边搭建,别记录在这里的,所以会持续增加,也可能遇到错误然后返工。有兴趣的朋友一起慢慢看吧。

  解释个小问题:为什么文章内的段落标题用一个星号 *  来表示?答:长期使用 emacs 形成的习惯。

  本文后面有很多[唠叨],指可以忽略不看的东西。


* 预备知识

  开始玩 GigaHttpd 之前,你最好已经玩过如下的东西:

  1. 编译 Linux 内核,基本了解 Linux 内核的运行机制。
  2. gdb,用 gdb 调试过 C 程序。


* 一台 PC

  到目前为止(这篇文档最近更新时),开发环境还在一台 PC 上面。

  [唠叨]当然以后会需要多台 PC 来测试 GigaHttpd 的运行及性能,不过现在开发的初级阶段,还只需要一台 PC。


* 2/4 核 CPU

  我在用 4 核的 CPU,Intel(R) Core(TM)2 Quad CPU  Q6600  @ 2.40GHz。

  在开始的阶段,Core 2 双核的 CPU 应该也可以吧,或者在 qemu 里面可以模拟出来很多 CPU。现在还没到这一步呢。

  至少多加一块网卡。

  [唠叨]2007 年底,Intel 4 核 CPU 刚出来的时候,为了开发 GigaHttpd ,去中关村拼了一台,配华硕的主板,8G 内存,多加了一块 D-Link 的网卡,加上显示器,1TB 的硬盘,当时 1 万块大洋啊。现在双核的应该是市场的主流了,价钱也比较便宜了。


* FC10(x86 64位版)

  开发测试平台选 Redhat 的 Fedora Core 10,x86_64 版本。

  安装过程中请选择虚拟机,也就是后续要用到的 qemu-kvm。

  如果硬盘足够大,在硬盘尾部给 GigaHttpd 预留几十 GB 的空闲空间,将来可能会用到的。

  把 FC10 的 DVD iso 文件放到某个目录下面,后面的虚拟机安装时要用。

  [唠叨]我之前一直用 FC8,很好很稳定,GigaHttpd 真正开始前打算开始用 FC10,结果发现 FC10 不太好用,花了一个星期又试用了 Ubuntu 8、Debian 5,结果都不理想,最后还是凑合用 FC10 吧,安装好后狂打补丁 yum update 。。。

  [唠叨]因为我工作、上网、玩、等等都在这个机器上,所以安装的时候几乎把能选的都选上了。

  [唠叨]FC 自己带的 ADSL 拨号上网程序 pppoe 一直不好用,所以去下载了 rp-pppoe,手工编译安装。还有一个恶心问题,我配套的是华为的猫,EchoLife HG522,网络总是不稳定,rp-pppoe 总是丢包,并且在 /var/log/message 里可以看多很多报警信息,说什么东西超长,解决办法是在 rp-pppoe 的源代码中找到那些报警的行,注释掉,就好了。还有,好像 rp-pppoe 自带的 MASQ 模式的防火墙的设置也不太好,自己还修改了防火墙的设置,有需要的请给我发邮件。

  [唠叨]我的硬盘里有不止一个 Linux 系统,FC8、FC9、FC10 等等,都是历史遗留下来的,另外硬盘上保留了所有的安装 DVD iso 文件,这样安装起来就很方便。注意一下,下载下来的 iso 文件最好校验一下,sha1sum 之类的,曾经发生过不一致的情况。

  FC10

* linux-2.6.28.7

  开发所用的内核选 linux-2.6.28.7

  [唠叨]没什么特殊的原因,当时下载的时候这个是最新的,大家用其他的版本当然也可以,只是后续要读大量的内核代码,会有一些配套的讲解,所以建议大家也选这个版本。

  [唠叨]从2.6.25 开始,Linux 内核内置了 kgdb,所以这个可以不用再去找了。


* 虚拟机

  启动 FC10 自带的 "Virtual Machine Manager" 程序,在里面再安装一个 FC10(以下称虚拟 FC10),虚拟机设定成 2 个 CPU,硬盘大小 15GB。FC10 只要最基本的系统,但要包括开发工具和基本库,不要 X Window 的任何东西。

  把 linux-2.6.28.7 复制到虚拟 FC10 中,从 /boot 下拷贝过来 .config,make menuconfig,注意 kgdb 选中。编译 make,安装 make modules_install; make install。修改虚拟 FC10 中的 /boot/grub/grub.conf,让新编译的 linux 内核作为默认启动项。

  [唠叨]其实有时候传统操作系统也是免不了的,所以另启动了一个虚拟机,安装了一个,随便用的。


* 熟悉 Linux 内核代码

  把虚拟 FC10 里面的 Linux 内核代码、vmlinuz、initrd、System.map 拷贝出来,阅读并熟悉源代码,参考 Linux 内核的启动过程,从中参考 GigaHttpd 启动时要做那些事情。

  阅读源代码时,可以把虚拟 FC10 启动到调试状态,便于理解内核里面所有的数据分布。

  [唠叨]本段落以下全都是唠叨,很多。你需要启动两个 gnome-terminal 终端(以下简称 gt终端A、B),每个终端打开 5 个 Tab 下的 Shell 窗口(以下简称 Tab)。

  先说 gt终端A。

  gt终端A 的 Tab-1:启动虚拟的 Linux,并且激活 kgdb(netstat -natp 可以看到 1234 端口已经打开),命令如下:

  [root@...]# qemu-kvm -s -kernel /你的目录/你的vmlinuz-2.6.28.7 -initrd /你的目录/你的initrd-2.6.28.7.img -m 1024 -smp 2 -monitor pty -boot c -drive file=/var/lib/libvirt/images/你的虚拟FC10的硬盘文件.img,if=virtio,index=0,boot=on -serial pty

  TabA-1

  gt终端A 的 Tab-2:在 linux-2.6.28.7 的目录下,运行 gdb vmlinux,然后连接到虚拟的 Linux,自动进入断点模式,可以很方便的查看运行中内核的内存数据,以及函数等等。

  [root@... linux-2.6.28.7]# gdb vmlinux
  GNU gdb Fedora (6.8-29.fc10)
  Copyright (C) 2008 Free Software Foundation, Inc.
  License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
  This is free software: you are free to change and redistribute it.
  There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
  and "show warranty" for details.
  This GDB was configured as "x86_64-redhat-linux-gnu"...
  tar(gdb) target remote 127.0.0.1:1234
  Remote debugging using 127.0.0.1:1234
  native_safe_halt () at /usr/src/linux-2.6.28.7/arch/x86/include/asm/irqflags.h:45
  45    /usr/src/linux-2.6.28.7/arch/x86/include/asm/irqflags.h: No such file or directory.
      in /usr/src/linux-2.6.28.7/arch/x86/include/asm/irqflags.h
  (gdb) bt
  #0  native_safe_halt () at /usr/src/linux-2.6.28.7/arch/x86/include/asm/irqflags.h:45
  #1  0xffffffff810184bb in raw_safe_halt () at /usr/src/linux-2.6.28.7/arch/x86/include/asm/paravirt.h:709
  #2  default_idle () at arch/x86/kernel/process.c:111
  #3  0xffffffff81010242 in cpu_idle () at arch/x86/kernel/process_64.c:130
  #4  0xffffffff81335dbd in rest_init () at init/main.c:484
  #5  0xffffffff81629ccd in start_kernel () at init/main.c:697
  #6  0xffffffff816292ba in x86_64_start_reservations (real_mode_data=<value optimized out>) at arch/x86/kernel/head64.c:143
  #7  0xffffffff816293c5 in x86_64_start_kernel (real_mode_data=0x13310 <Address 0x13310 out of bounds>) at arch/x86/kernel/head64.c:116
  #8  0x0000000000000000 in ?? ()
  
  TabA-2

  gt终端A 的 Tab-3:打开 System.map 文件,方便查找内核的符号表,以及内存地址。不过这个实际用的比较少。

  TabA-3

  gt终端A 的 Tab-4:运行 readelf -s vmlinux > vmlinux.elf; vim vmlinux.elf,也可以查找内核符号表。这个比 Tab-3 用得更多一些。

  TabA-4

  gt终端A 的 Tab-5:打开 .config 文件,可以很方便地查看任一个宏定义。

  TabA-5

  再说 gt终端B。

  gt终端B 的 Tab-1:linux-2.6.28.7 的目录,打开 init/main.c,查看 start_kernel(),这是 Linux 的开始(head_64.S 部分待续)。

  TabB-2

  gt终端B 的 Tab-2:打开目标文件中 start_kernel 的汇编代码,可以对应 C 代码,看到哪些函数在编译中被忽略了,还可以看到变量的地址。命令: cd init; objdump -rdl main.c > main.elf; vim main.elf

  TabB-2

  gt终端B 的 Tab-3、4、5:与 Tab-1/2 类似,用来追踪函数。

  所以,gt终端A 主要用于查看内核的整体,gt终端B 主要用于查看单个文件,或深入追踪单个函数。



* 开始写 GigaHttpd 的最初代码

  按照目前的设计,GigaHttpd 是 Linux 的一个内核模块,加载后创建若干个内核线程(kernel_thread)。

  每个内核线程得到 CPU 开始运行时,先保留现场,然后转化成 GigaHttpd 的 CPU,进入 GigaHttpd 的初始化以及后续的主程序。

  这样做的目的是,GigaHttpd 调试或者运行结束后,还可以回到 Linux 中。对 Linux 来说,就像是某个内核线程长时间的占用了 CPU,运行结束后又恢复正常了。


* emacs

  [唠叨]对 emacs 没兴趣的请跳过本段。

  [唠叨]去下载 emacs-23.0 的源代码(好像是 cvs co),编译 make,安装 make install。

  [唠叨]为了让 emacs 输入中文更方面,开始用 ibus 吧,yum install ibus。FC10 中 scim 支持 emacs 好像总有问题。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值