<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    談笑有鴻儒,往來無白丁

    在恰當的時間、地點以恰當的方式表達給恰當的人...  閱讀的時候請注意分類,佛曰我日里面是談笑文章,其他是各個分類的文章,積極的熱情投入到寫博的隊伍中來,支持blogjava做大做強!向dudu站長致敬>> > 我的微博敬請收聽

    ???本節說明如何在現有Linux系統(例如RedHat 9)上使用Bochs模擬運行環境和gdb工具來調試Linux 0.11內核源代碼。在使用這個方法之前,你的Linux系統上應該已經安裝有X window系統。由于Bochs網站提供的RPM安裝包中的Bochs執行程序沒有編譯進與gdb調試器進行通信的gdbstub模塊,因此我們需要下載Bochs源代碼來自行編譯。

    ? ?gdbstub可以使得Bochs程序在本地1234網絡端口偵聽接收gdb的命令,并且向gdb發送命令執行結果。從而我們可以利用gdb對Linux 0.11內核進行C語言級的調試。當然,Linux 0.11內核也需要進行使用-g選項重新編譯。

    14.13.1 編譯帶gdbstub的Bochs系統
    ? ?Bochs用戶手冊中介紹了自行編譯Bochs系統的方法。這里我們給出編譯帶gdbstub的Bochs系統的方法和步驟。首先從下面網站下載最新Bochs系統源代碼(例如:bochs-2.2.tar.gz):

    ? ?http://sourceforge.net/projects/bochs/

    ? ?使用tar對軟件包解壓后會在當前目錄中生成一個bochs-2.2子目錄。進入該子目錄后帶選項“--enable-gdb-stub”運行配置程序configure,然后運行make和make install即可,見如下所示:

    [root@plinux bochs-2.2]# ./configure --enable-gdb-stub
    checking build system type... i686-pc-linux-gnu
    checking host system type... i686-pc-linux-gnu
    checking target system type... i686-pc-linux-gnu
    ...
    [root@plinux bochs-2.2]# make
    [root@plinux bochs-2.2]# make install

    ? ?若在運行./configure時我們碰到一些問題而不能生成編譯使用的Makefile文件,那么這通常是由于沒有安裝X window開發環境軟件或相關庫文件造成的。此時我們就必須先安裝這些必要的軟件。


    14.13.2 編譯帶調試信息的Linux 0.11內核
    ? ?通過把Bochs的模擬運行環境與gdb符號調試工具聯系起來,我們既可以使用Linux 0.11系統下編譯的帶調試信息的內核模塊來調試,也可以使用在RedHat 9環境下編譯的0.11內核模塊來調試。這兩種環境下都需要對0.11內核源代碼目錄中所有Makefile文件進行修改,即在其中編譯標志行上添加-g標志,并去掉鏈接標志行上的-s選項:

    LDFLAGS = -M -x ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 去掉 -s 標志。
    CFLAGS ?=-Wall -O -g -fomit-frame-pointer \ ? ? ? ? ? ? // 添加 -g 標志。

    ? ?進入內核源代碼目錄后,利用find命令我們可以找到以下所有需要修改的Makefile文件:

    [root@plinux linux-0.11]# find ./ -name Makefile
    ./fs/Makefile
    ./kernel/Makefile
    ./kernel/chr_drv/Makefile
    ./kernel/math/Makefile
    ./kernel/blk_drv/Makefile
    ./lib/Makefile
    ./Makefile
    ./mm/Makefile
    [root@plinux linux-0.11]#

    ? ?另外,由于此時編譯出的內核代碼模塊中含有調試信息,因此system模塊大小可能會超過寫入內核代碼映像文件的默認最大值SYSSIZE = 0x3000(定義在boot/bootsect.s文件第6行)。我們可以按以下方法修改源代碼根目錄中的Makefile文件中產生Image文件的規則,即把內核代碼模塊system中的符號信息去掉后再寫入Image文件中,而原始帶符號信息的system模塊保留用作gdb調試器使用。注意,目標的實現命令需要以一個制表符(TAB)作為一行的開始。

    Image: boot/bootsect boot/setup tools/system tools/build
    ? ? ? ?cp -f tools/system system.tmp
    ? ? ? ?strip system.tmp
    ? ? ? ?tools/build boot/bootsect boot/setup system.tmp $(ROOT_DEV) $(SWAP_DEV) > Image
    ? ? ? ?rm -f system.tmp
    ? ? ? ?sync

    ? ?當然,我們也可以把boot/bootsect.s和tools/build.c中的SYSSIZE值修改成0x8000來處理這種情況。


    14.13.3 調試方法和步驟
    ? ?下面我們根據在現代Linux系統(例如RedHat 9)系統上和運行在Bochs中Linux 0.11系統上編譯出的內核代碼分別來說明調試方法和步驟。

    1 調試現代Linux系統上編譯出的Linux 0.11內核
    ? ?假設我們的Linux 0.11內核源代碼根目錄是linux-rh9-gdb/,則我們首先在該目錄中按照上面方法修改所有Makefile文件,然后在linux-rh9-gdb/目錄下創建一個bochs運行配置文件并下載一個配套使用的根文件系統映像文件。我們可以直接從網站下載已經設置好的如下軟件包來做實驗:

    ? ?http://oldlinux.org/Linux.old/bochs/linux-0.11-gdb-rh9-050619.tar.gz

    ? ?使用命令“tar zxvf linux-gdb-rh9-050619.tar.gz”解開這個軟件包后,可以看到其中包含以下幾個文件和目錄:

    [root@plinux linux-gdb-rh9]# ll
    total 1600
    -rw-r--r-- ? ?1 root ? ? root ? ? ? ?18055 Jun 18 15:07 bochsrc-fd1-gdb.bxrc
    drwxr-xr-x ? 10 root ? ? root ? ? ? ? 4096 Jun 18 22:55 linux
    -rw-r--r-- ? ?1 root ? ? root ? ? ?1474560 Jun 18 20:21 rootimage-0.11-for-orig
    -rwxr-xr-x ? ?1 root ? ? root ? ? ? ? ? 35 Jun 18 16:54 run
    [root@plinux linux--gdb-rh9]#

    這里的bochs配置文件與其他Linux 0.11配置文件的主要區別是在文件頭部添加有以下一行內容,表示當bochs使用這個配置文件運行時將在本地網絡端口1234上偵聽gdb調試器的命令:

    gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0

    運行這個實驗的基本步驟如下:

    (1).啟動X window系統后打開兩個終端窗口;
    (2).在一個窗口中,把工作目錄切換進linux-gdb-rh9/目錄中,并運行程序“./run”,此時該窗口中會顯示一條等待gdb來連接的信息:“Wait for gdb connection on localhost:1234”,并且系統會創建一個Bochs主窗口(此時無內容);
    (3).在另一個窗口中,我們把工作目錄切換到內核源代碼目錄中linux-gdb-rh9/linux/,并運行命令:“gdb tools/system”;
    (4).在運行gdb的窗口中鍵入命令“break main”和“target remote localhost:1234”,此時gdb會顯示已經連接到Bochs的信息;
    (5).在gdb環境中再執行命令“cont”,稍過一會gdb會顯示程序停止在init/main.c的main()函數處。

    下面是運行gdb和在其中執行的一些命令示例。

    [root@plinux linux]# gdb tools/system ? ? ? ?
    GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
    Copyright 2003 Free Software Foundation, Inc.
    GDB is free software, covered by the GNU General Public License, and you are
    welcome to change it and/or distribute copies of it under certain conditions.
    Type "show copying" to see the conditions.
    There is absolutely no warranty for GDB. ?Type "show warranty" for details.
    This GDB was configured as "i386-redhat-linux-gnu"...
    (gdb) break main ? ? ? ? ? ? ?
    Breakpoint 1 at 0x6621: file init/main.c, line 110.
    (gdb) target remote localhost:1234
    Remote debugging using localhost:1234
    0x0000fff0 in sys_mkdir (pathname=0x0, mode=0) at namei.c:481
    481 ? ? namei.c: No such file or directory.
    ? ? ? ?in namei.c
    (gdb) cont ? ? ? ? ? ? ? ? ? ? ? ?
    Continuing.
    Breakpoint 1, main () at init/main.c:110 ? ?
    110 ? ? ? ? ? ? ROOT_DEV = ORIG_ROOT_DEV;
    (gdb) list ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
    105 ? ? { ? ? ? ? ? ? ? ? ? ? ? /* The startup routine assumes (well, ...) this */
    106 ? ? /*
    107 ? ? ?* Interrupts are still disabled. Do necessary setups, then
    108 ? ? ?* enable them
    109 ? ? ?*/
    110 ? ? ? ? ? ? ROOT_DEV = ORIG_ROOT_DEV;
    111 ? ? ? ? ? ? drive_info = DRIVE_INFO;
    112 ? ? ? ? ? ? memory_end = (1<<20) + (EXT_MEM_K<<10);
    113 ? ? ? ? ? ? memory_end &= 0xfffff000;
    114 ? ? ? ? ? ? if (memory_end > 16*1024*1024)
    (gdb) next
    111 ? ? ? ? ? ? drive_info = DRIVE_INFO;
    (gdb) next
    112 ? ? ? ? ? ? memory_end = (1<<20) + (EXT_MEM_K<<10);
    (gdb) print /x ROOT_DEV ? ? ? ? ? ? ? ? ? ? ?
    $3 = 0x21d ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
    (gdb) quit ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
    The program is running. ?Exit anyway? (y or n) y
    [root@plinux linux]#
    posted on 2007-03-23 14:18 壞男孩 閱讀(10493) 評論(1)  編輯  收藏 所屬分類: 新知識學習

    FeedBack:
    # re: 利用GDB和Bochs調試內核源代碼
    主站蜘蛛池模板: 国产伦精品一区二区三区免费下载 | 免费黄色网址网站| 亚洲bt加勒比一区二区| 中文毛片无遮挡高清免费| 亚洲乱码无码永久不卡在线| 成人免费av一区二区三区| 亚洲乱码一区二区三区在线观看| 成人无码区免费A∨直播| 亚洲成AV人片在线观看WWW| 男人都懂www深夜免费网站| 亚洲理论片在线中文字幕| 亚欧免费视频一区二区三区| 久久精品国产亚洲AV忘忧草18| 丁香花免费完整高清观看| 亚洲熟女综合色一区二区三区 | 国产精品亚洲视频| 好男人资源在线WWW免费| 亚洲AV午夜福利精品一区二区 | 国产麻豆成人传媒免费观看| 久久亚洲AV成人无码电影| 四虎永久在线精品免费观看视频| 亚洲夂夂婷婷色拍WW47| 亚洲AV日韩精品一区二区三区| 美女无遮挡拍拍拍免费视频 | 一级毛片完整版免费播放一区| 亚洲精品第一国产综合精品99| 和老外3p爽粗大免费视频| 亚洲精品在线播放| 国产精品久久免费视频| 免费久久人人爽人人爽av| ww亚洲ww在线观看国产| 亚洲精品国产V片在线观看| 99在线免费观看视频| 中文文字幕文字幕亚洲色| 免费人成网站在线高清| 91久久精品国产免费一区| 狠狠综合亚洲综合亚洲色| 亚洲av无码成人黄网站在线观看| 成年美女黄网站18禁免费| 国产日韩AV免费无码一区二区三区| 亚洲激情视频在线观看|