bochs源碼分析
『壹』 Ubuntu bochs源碼安裝時出現: make: *** 沒有指明目標並且找不到 makefile。 停止。
用ubuntu中的ubuntu軟體安裝中心安裝的bochs不帶調試功能,所以我們要用源碼安裝bochs.
從http://sourceforge.net/projects/bochs/files/ 下載bochs-2.4.5.tar.gz
然後
tar vxzf bochs-2.4.5.tar.gz
cd bochs-2.4.5
./configure --enable-debugger --enable-disasm
make
sudo make install
結果出錯,解決的辦法是:
問題1:
checking for C compiler default output file name… configure: error: C compiler cannot create executables
解決辦法:
[thornbird@thornbird bochs-2.4]$ sudo apt-get install libc6-dev
問題2:
...
checking how to run the C++ preprocessor... /lib/cpp
configure: error: C++ preprocessor "/lib/cpp" fails sanity check
See `config.log' for more details.
解決方法:
[thornbird@thornbird bochs-2.4]$ sudo apt-get install build-essential
問題3:
[thornbird@thornbird bochs-2.4]$ make
make: *** 沒有指明目標並且找不到 makefile.停止。
解決方法:
[thornbird@thornbird bochs-2.4]$ sudo apt-get install build-essential
問題4:
...
checking for wxWidgets library version...
checking for default gui on this platform... x11
ERROR: X windows gui was selected, but X windows libraries were not found.
解決方法: 配置的時候加上"--with-nogui "
或者改成:[thornbird@thornbird bochs-2.4]$sudo apt-get install xorg-dev (建議)
問題5:
Package gtk+-2.0 was not found in the pkg-config search path.Perhaps you should add the directory containing `gtk+-2.0.pc'to the PKG_CONFIG_PATH environment variableNo package 'gtk+-2.0' foundERROR: pkg-config was not found, or unable to access the gtk+-2.0 package.Install pkg-config and the gtk+ development package,or disable the gui debugger, or the wxWidgets display library (whichever is being used).
解決方法:
[thornbird@thornbird bochs-2.4]$sudo apt-get install libgtk2.0-dev
問題6:
install: 無法獲取"./bochsdbg" 的文件狀態(stat): 沒有該文件或目錄
解決辦法:需要在make後,將bochs拷貝一份,命名為bochsdbg
[thornbird@thornbird bochs-2.4]$ cp bochs bochsdbg
『貳』 bochs 調試 為什麼不顯示寄存器
這說明你對單片機串口的結構不了解。
串口接收部分有一個移位寄存器和一個保持寄存器,每次讀操作都會導致移位寄存器的內容被移到保持寄存器里。悲催的是,只要你調試時監控接收寄存器,那麼模擬器是不停對串口進行讀操作的……
所以對串口進行硬體調試是有一定技巧的。一般應當在接收處理時將接收到的數據(連同各標志)全部移到一個調試用的緩沖區中,開發人員通過對緩沖區中數據和標志的情況進行分析,判定串口部分工作是否正常。
『叄』 內核調試工具 KGDB的原理
安裝KGDB調試環境需要為linux 內核加上 kgdb補丁,補丁實現GDB遠程調試所需要的功能,包括命令處理、陷阱處理及串口通信3個主要的部分。KGDB補丁的主要作用是在Linux 內核中添加了一個調試Stub。調試Stub是Linux 內核中的一小段代碼,是運行GDB的開發機和所調試內核之間的一個媒介。GDB和調試stub之間通過GDB串列協議進行通信。GDB串列協議是-種基於消息的ASCII 碼協議﹐包含了各種調試命令。當設置斷點時,KGDB將斷點的指令替換為一條 trap指令,當執行到斷點時控制權就轉移到調試 stub中去。此時,調試stub 的任務就是使用遠程串列通信協議將當前環境傳送給GDB,然後從GDB處接收命令。GDB命令告訴stub 下一步該做什麼,當stub收到繼續執行的命令時,將恢復程序的運行環境,把對 CPU的控制權重新交還給內核。KGDB補丁給內核添加以下3個部件:
(1 ) GDB stub
GDB stub被稱為調試插樁(簡稱為stub),是KGDB調試器的核心。它是Linux內核中的一小段代碼,用來處理主機上: GDB發來的各種請求;並且在內核處於被調試狀態時,控制目標機板上的處理器。
(2)修改異常處理函數
當這個異常發生時,內核將控制權交給KGDB調試器,程序進入KGDB提供的異常處理函數中。在裡面,可以分析程序的各種情況。
(3)串口通信
GDB和 stub之間通過GDB串列協議進行通信。它是一種基於消息的ASCII 碼協議,包含了各種調試命令。除串口外,也可以使用網卡進行通信。以設置內核斷點為例說明KGDB與GDB之間的工作過程。設置斷點時,KGDB修改內核代碼,將斷點位置的指令替換成一條異常指令(在ARM中這是一條未定義的指令)。當執行到斷點時發生異常,控制權轉移到stub 的異常處理函數中。此時,stub的任務就是使用GDB串列通信協議將當前環境傳送給GDB,然後從GDB處接收命令,GDB命令告訴stub下一步該做什麼。當stub收到繼續執行的命令時,將恢復原來替換的指令、恢復程序的運行環境,把對CPU的控制權重新交還給內核。
『肆』 bochs源代碼編譯不通過怎麼辦
下載最新的代碼
svn checkout https://svn.code.sf.net/p/bochs/code/trunk bochs-code
『伍』 bochs這是怎麼回事求助!
這不是我的方法,我的方法如下:Bochs源代碼:
適用於Bochs的WindowsXP系統鏡像
下載地址:
開始之前
你若嘗試過早期版本的Bochs,你可能還記得,那個時候的Bochs並沒有用戶界面,如果你想順利地在Bochs上運行Windows,則必須修改兩個配置文件:bochsout.txt和bochsrc.txt,並將其和Windows系統鏡像一起放置於手機內部存儲(或存儲卡)根目錄的SDL文件夾下。而現在,新版的Bochs已經有了圖形界面,你將可以在Bochs里更加直觀地配置硬體和修改參數。
開始安裝
首先,將apk格式的Bochs安裝包和img格式的Windows系統鏡像傳送到你的手機,放置於任何目錄下均可,前提是你可以找到它們。
安裝Bochs並打開它,你將看到硬體和參數的配置界面,
將ata0-master前面的復選框選中,然後點擊select;
選擇img格式的系統鏡像文件,答主這里的是Windows.img;
其他項無需更改;
點擊頂部的HARDWARE選項卡,按照以下設置方法完成設置:
CPUModel無需更改;
Chipset選擇i440fx;
內存的大小視你的手機的實際硬體配置而定,答主的手機內存為2GB,故在此項,答主將內存設置為517MB;
VGACard設置為cirrus_5446;
SoundCard設置為sb16;
EthernetCard設置為rtl8029;
PCI設置中,Slot1設置為cirrus,Slot2設置為ne2k,Slot3設置為es1370,Slot4設置為voodoo,Slot5設置為none。
設置完成後結果如下:
點擊頂部的MISC選項卡,
將Fullscreen前面的復選框選中以使Windows可以全屏運行;
點擊右上角綠色的Start按鈕以啟動Windows。
首次啟動將提示如下,請不要驚慌,這是正常現象,等待讀秒結束即可;
『陸』 學習嵌入式一定要買開發板嗎有模擬軟體嗎
1、用天目吧,呵呵,正好是滿足你的要求,網址:http://www.skyeye.org/index.shtml
2、arm9有MMU,arm7沒有,這問題具體建議到網上搜一下或者具體看書。
3、建議你到周立功網站上看一下,太廉價的不穩定不好用豈不是空耽誤時間。
以下是天目簡介:
1.SkyEye的起源和發展
2002年11月,一個偶然的機會,一群操作系統的愛好者在網上進行聊天,成立了一個TM-Linux興趣小組,希望要做一些感興趣的事情。當時在清華大學計算機系做博士後的陳渝提出做一個用軟體實現的嵌入式開發板硬體模擬器,可以在模擬器上運行各種操作系統,這樣就可以在沒有開發板的情況下學習和研究操作系統。一開始就陳渝一人做,首先他了解了當前國際上的一些類似的項目,發現著名的μCLinux組織實現了一個armulator模擬器軟體(在Linux系統上運行),可以模擬Ateml AT91(基於ARM7TDMI CPU)開發板,μCLinux可以在armulator(其網址為http://www.uclinux.org/pub/uCLinux/utilities/armulator/)上運行。於是陳渝以此為基點,借鑒armulator的實現,提出了SkyEye項目,其目標是讓SkyEye模擬多種主流的嵌入式開發板和外設,實現一個可擴展的硬體模擬框架,讓更多的嵌入式操作系統可以在SkyEye上運行。SkyEye項目於2002年12月1日正式建立後,陳渝完成的第一件工作是把armulator移植到了cygwin/windows環境下,其成果被μCLinux組織接收。接下來清華大學計算機系碩士生李明加入到SkyEye的開發中,8天後,SkyEye的第一個版本推出,再過了4天,μC/OS-II for SkyEye推出。在這期間,SkyEye的網站也建立起來了。緊接著,楊曄、王利明、尹首一等在校學生也加入到SkyEye的開發中,給SkyEye帶來了新的活力,SkyEye進入了新的發展階段,目前通過訪問SkyEye的網站(http://www.skyeye.org/)和在linux公社上的SkyEye論壇( http://www.linuxfans.org)可以了解到SkyEye的最新進展並對有關嵌入式系統開發方面的問題進行交流,還可以到 http://gro.clinux.org/projects/skyeye/ 下載最新的SkyEye相關軟體和文檔。
2.SkyEye的背景
如果你看過電影"黑客帝國"(又稱"matrix"),相信電影描述的虛幻世界會深深地吸引你,至少它是我們看過最有想像力的科幻電影之一。也許我們可以把SkyEye看作一個"matrix ",把運行在SkyEye上的各種程序看成是這個"matrix"中的芸芸眾生。我們創造SkyEye和編寫運行在SkyEye上運行的程序就是為了洞悉計算機的奧秘,嘗嘗當"造物主"的感覺。當看到各種軟體Linux、μCLinux、μC/OS-II...在SkyEye上"愉快"地運行時,那種感覺真是太奇妙了。
對於那些想進行嵌入式系統軟體開發和學習,或者想研究嵌入式Linux等操作系統和一些底層系統軟體(如TCP/IP等)的研究和開發人員來說,可能存在如下幾方面的問題:(1)經常苦於經費不足,缺少足夠的硬體開發板和完善的軟體開發環境,相關的書籍對一些最新軟體的分析還不夠全面,無法深入研究和開發嵌入式軟體。(2)高層次的軟體設計和開發一般不用太考慮底層硬體的實現細節,如果直接處於一個具體的硬體環境下,在開發和研究中可能會陷入硬體的具體細節中不能自拔,而不能把精力放到高層次的軟體設計和開發上。(3)如果硬體開發環境不太穩定(這種情況經常見到),且對具體的硬體不是很了解,則可能在排除問題上花費大量的不必要的時間。(4)如果你想自己嘗試設計一個操作系統,則先在一個提供源碼級調試的軟體模擬器上進行開發,可能會大大提高你的開發進度。
對於想了解、學習一般操作系統的實現原理,Linux/μCLinux操作系統或TCP/IP等系統級軟體的實現的人員,目前一般採用的方法是看書和讀源代碼,這是一種靜態的學習方法,效率較低,比較枯燥,缺少親自實踐的感覺。要想深入分析和開發軟體,就要動手編程,不能只是看看書,讀讀代碼,只有通過親手實踐才能夠掌握軟體設計的核心內容。上面所指出的問題和需求促使SkyEye項目的誕生。
3.SkyEye的目標和意義
SkyEye是一個開源軟體(OpenSource Software)項目,中文名字是"天目"。SkyEye的目標是在通用的Linux和Windows平台上實現一個純軟體集成開發環境,模擬常見的嵌入式計算機系統(這里假定"模擬"和"模擬"的意思基本相同);可在SkyEye上運行μCLinux以及μC/OS-II等多種嵌入式操作系統和各種系統軟體(如TCP/IP,圖形子系統,文件子系統等),並可對它們進行源碼級的分析和測試。
純軟體的模擬器有許多種,如模擬一個晶元時序邏輯的模擬器、只模擬CPU指令的模擬器、模擬整個硬體開發板的模擬器、模擬一個PDA的模擬器等。存在一些純軟體的模擬器或模擬器,如Stanford大學的SimOS模擬器,它模擬的是MIPS系列CPU和相關外設,可以在其上運行SGI公司的Irix操作系統和軟體,目前基本上停止了進一步的開發;PSIM是一個模擬PowerPC指令集的模擬器,目前只支持簡單的命令行應用程序;xcopilot是一個PDA模擬器,它是由Greg Hewgill出於個人喜好編寫的,它模擬的是M68K CPU,通過它可以給基於PalmOS的軟體開發者提供一個模擬開發環境。Bochs是一個模擬x86 CPU的開源項目,目前還支持AMD64 CPU,在它上面可以運行Linux操作系統。其它一些商業的模擬軟體如vmware和virtualPC可以模擬一個真實的x86計算機,而Virtutech Simics模擬器可以模擬多種CPU和硬體,功能強大,可用於硬體和系統軟體的評測。
SkyEye是一個指令級模擬器,可以模擬多種嵌入式開發板,可支持多種CPU指令集,在SkyEye上運行的操作系統意識不到它是在一個虛擬的環境中運行,而且開發人員可以通過SkyEye調試操作系統和系統軟體。由於SkyEye的目標不是驗證硬體邏輯,而是協助開發、調試和學習系統軟體,所以在實現上SkyEye與真實的硬體環境相比還是有一定差別的。SkyEye在時鍾節拍的時序上不保證與硬體完全相同,對軟體透明的一些硬體模擬進行了一定的簡化。這樣帶來的好處是SkyEye的執行效率更高。SkyEye的推出具有下面三方面的意義:
通過SkyEye模擬集成環境可以很方便地進入到嵌入式系統軟體學習和開發的廣闊天地中。尤其對於缺少嵌入式硬體開發環境和軟體開發環境的用戶來說,它將是一個非常有效的學習工具和開發手段,因為SkyEye的整個軟體系統都是Open Source的,且基於GPL協議(μCOS-II除外)。因此,如果要學習Linux操作系統或者進行嵌入式系統開發,但苦於沒有硬體支持,SkyEye模擬環境軟體是一個很好的選擇!
如果想研究與具體硬體無關的系統軟體(如TCP/IP協議棧等),採用SkyEye可以有效地提高工作效率,因為你可以直接在μCOS-II和μCLinux for SkyEye上進行開發和調試,而與具體硬體打交道的各種driver已經存在,且有源碼級調試環境,只需關心高層的邏輯設計和實現就可以了。
SkyEye本身作為一個開放式的項目體系,可以劃分為多個獨立的子項目系統。通過參與SkyEye的各個子項目,與大家共同交流、協作,可以進一步學習、分析、精通Linux內核,掌握ARM嵌入式CPU編程。
在32位嵌入式CPU領域中,ARM系列CPU所佔比重很大,而ARM7TDMI是其中最廣泛的一種ARM CPU核,因此SkyEye首先選擇了ARM7TDMI作為模擬的目標CPU核,當然將來SkyEye會支持更多種類的CPU。目前在SkyEye上可運行並進行源碼級調試ARM Linux、μCLinux、μC/OS-II操作系統和LwIP(一個著名的嵌入式TCP/IP實現)、MiniGUI(一個著名的嵌入式GUI系統)等系統軟體。SkyEye可用於學習,分析,開發這些系統軟體的實現,了解ARM嵌入式CPU編程。而這一切都可在一個純軟體的環境中完成。通過分析SkyEye本身實現,系統軟體開發人員對ARM,8019as(NE2000兼容)乙太網絡晶元等硬體的了解也會更深入。
SkyEye並不能取代開發板等硬體的功能,但通過它可以比較容易進入到嵌入式軟體的廣闊天地中。由於SkyEye建立在GDB基礎之上,使用者可以方便地使用GDB提供的各種調試手段對SkyEye模擬系統上的軟體進行源碼級的調試,還可以進行各種分析,如執行熱點分析、程序執行覆蓋度分析等。由於SkyEye提供了源代碼和相關文檔,有經驗的用戶完全可以修改和擴充
『柒』 Ubuntu中Bochs的調試功能如何開啟
$ sudo apt-get install vgabios bochs bochs-x bximage
敲入這樣一行命令,不一會兒就裝好了。缺點:沒有調試功能的,這顯然不能滿足我們的需要,所以最好的方法還是從源代碼安裝.
首先下載最新版本到Bochs: http://bochs.sourceforge.net/getcurrent.html
下載的版本是bochs-2.4.6.tar.gz,那麼安裝過程差不多是這樣的:
$ tar zxvf bochs-2.4.6.tar.gz
$ cd bochs-2.4.6.
$ ./configure --enable-debugger --enable-disasm
$ make
$ sudo make install
--enable-debugger 這個就是開啟調試功能
『捌』 怎麼用gdb和bochs調試內核
gdbstub可以使得Bochs程序在本地1234網路埠偵聽接收gdb的命令,並且向gdb發送命令執行結果。從而我們可以利用gdb對Linux 0.11內核進行C語言級的調試。當然,Linux 0.11內核也需要進行使用-g選項重新編譯。
14.13.1 編譯帶gdbstub的Bochs系統{.j,
Bochs用戶手冊中介紹了自行編譯Bochs系統的方法。這里我們給出編譯帶gdbstub的Bochs系統的方法和步驟。首先從下面網站下載最新Bochs系統源代碼(例如:bochs-2.2.tar.gz):U
使用tar對軟體包解壓後會在當前目錄中生成一個bochs-2.2子目錄。進入該子目錄後帶選項「--enable-gdb-stub」運行配置程序configure,然後運行make和make install即可,見如下所示:
[root@plinux bochs-2.2]# ./configure --enable-gdb-stubI0B%
checking build system type... i686-pc-linux-gnu7.tY.
checking host system type... i686-pc-linux-gnuQ
checking target system type... i686-pc-linux-gnu{
...©OldLinux論壇 -- 有關早期Linux內核代碼發展的論壇。M
[root@plinux bochs-2.2]# makeQ
[root@plinux bochs-2.2]# make installN?
©OldLinux論壇 -- 有關早期Linux內核代碼發展的論壇。ufVz
若在運行./configure時我們碰到一些問題而不能生成編譯使用的Makefile文件,那麼這通常是由於沒有安裝X window開發環境軟體或相關庫文件造成的。此時我們就必須先安裝這些必要的軟體。>1z<z
14.13.2 編譯帶調試信息的Linux 0.11內核"jmg
通過把Bochs的模擬運行環境與gdb符號調試工具聯系起來,我們既可以使用Linux 0.11系統下編譯的帶調試信息的內核模塊來調試,也可以使用在RedHat 9環境下編譯的0.11內核模塊來調試。這兩種環境下都需要對0.11內核源代碼目錄中所有Makefile文件進行修改,即在其中編譯標志行上添加-g標志,並去掉鏈接標志行上的-s選項:2
LDFLAGS = -M -x // 去掉 -s 標志。XJFU)Y
CFLAGS =-Wall -O -g -fomit-frame-pointer / // 添加 -g 標志。iMN
進入內核源代碼目錄後,利用find命令我們可以找到以下所有需要修改的Makefile文件:_6
[root@plinux linux-0.11]# find ./ -name MakefileSn^
./fs/Makefile-
./kernel/Makefile/"`p%
./kernel/chr_drv/Makefile(pyM
./kernel/math/MakefileV
./kernel/blk_drv/Makefiles/CDu
./lib/Makefile[x~
./Makefile980
./mm/Makefile/zb
[root@plinux linux-0.11]#S9/Q
另外,由於此時編譯出的內核代碼模塊中含有調試信息,因此system模塊大小可能會超過寫入內核代碼映像文件的默認最大值SYSSIZE = 0x3000(定義在boot/bootsect.s文件第6行)。我們可以按以下方法修改源代碼根目錄中的Makefile文件中產生Image文件的規則,即把內核代碼模塊system中的符號信息去掉後再寫入Image文件中,而原始帶符號信息的system模塊保留用作gdb調試器使用。注意,目標的實現命令需要以一個製表符(TAB)作為一行的開始。pP
Image: boot/bootsect boot/setup tools/system tools/build)=1
cp -f tools/system system.tmp=-&a
strip system.tmphQ6n0S
tools/build boot/bootsect boot/setup system.tmp $(ROOT_DEV) $(SWAP_DEV) > ImageA-)
rm -f system.tmpY3w[/@
sync9=P2n
©OldLinux論壇 -- 有關早期Linux內核代碼發展的論壇。KuEo
當然,我們也可以把boot/bootsect.s和tools/build.c中的SYSSIZE值修改成0x8000來處理這種情況。a?g4
14.13.3 調試方法和步驟;M]3!
下面我們根據在現代Linux系統(例如RedHat 9)系統上和運行在Bochs中Linux 0.11系統上編譯出的內核代碼分別來說明調試方法和步驟。
1 調試現代Linux系統上編譯出的Linux 0.11內核?E
假設我們的Linux 0.11內核源代碼根目錄是linux-rh9-gdb/,則我們首先在該目錄中按照上面方法修改所有Makefile文件,然後在linux-rh9-gdb/目錄下創建一個bochs運行配置文件並下載一個配套使用的根文件系統映像文件。我們可以直接從網站下載已經設置好的如下軟體包來做實驗:
使用命令「tar zxvf linux-gdb-rh9-050619.tar.gz」解開這個軟體包後,可以看到其中包含以下幾個文件和目錄:MX{-
©OldLinux論壇 -- 有關早期Linux內核代碼發展的論壇。X
[root@plinux linux-gdb-rh9]# ll'*5tfq
total 1600bJT~Q
-rw-r--r-- 1 root root 18055 Jun 18 15:07 bochsrc-fd1-gdb.bxrcf%J2s
drwxr-xr-x 10 root root 4096 Jun 18 22:55 linux[dM&
-rw-r--r-- 1 root root 1474560 Jun 18 20:21 rootimage-0.11-for-orig8EIChk
-rwxr-xr-x 1 root root 35 Jun 18 16:54 run{gj
[root@plinux linux--gdb-rh9]#t|f
這里的bochs配置文件與其他Linux 0.11配置文件的主要區別是在文件頭部添加有以下一行內容,表示當bochs使用這個配置文件運行時將在本地網路埠1234上偵聽gdb調試器的命令:NhL
gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0J,i/6
運行這個實驗的基本步驟如下:@EkQ
(1).啟動X window系統後打開兩個終端窗口;(mPN
(2).在一個窗口中,把工作目錄切換進linux-gdb-rh9/目錄中,並運行程序「./run」,此時該窗口中會顯示一條等待gdb來連接的信息:「Wait for gdb connection on localhost:1234」,並且系統會創建一個Bochs主窗口(此時無內容);1P=VI<
(3).在另一個窗口中,我們把工作目錄切換到內核源代碼目錄中linux-gdb-rh9/linux/,並運行命令:「gdb tools/system」;iDqm8
(4).在運行gdb的窗口中鍵入命令「break main」和「target remote localhost:1234」,此時gdb會顯示已經連接到Bochs的信息;p
(5).在gdb環境中再執行命令「cont」,稍過一會gdb會顯示程序停止在init/main.c的main()函數處。v3L2
下面是運行gdb和在其中執行的一些命令示例。[2;jS
[root@plinux linux]# gdb tools/system hI/
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)!mC}
Copyright 2003 Free Software Foundation, Inc.|3
GDB is free software, covered by the GNU General Public License, and you areC$NY4
welcome to change it and/or distribute copies of it under certain conditions.boNdAL
Type "show ing" to see the conditions.3[nfHW
There is absolutely no warranty for GDB. Type "show warranty" for details.'1-V
This GDB was configured as "i386-redhat-linux-gnu"...Oq&*[
(gdb) break main }<;
Breakpoint 1 at 0x6621: file init/main.c, line 110.+%!.]{
(gdb) target remote localhost:12342 .yc
Remote debugging using localhost:1234X6X&7
0x0000fff0 in sys_mkdir (pathname=0x0, mode=0) at namei.c:481(
481 namei.c: No such file or directory.5QU
in namei.c&%P'
(gdb) cont Pv'/S$
Continuing.P:O_{
Breakpoint 1, main () at init/main.c:110 *
110 ROOT_DEV = ORIG_ROOT_DEV;T7PkpD
(gdb) list 5XT
105 { /* The startup routine assumes (well, ...) this */2L$
106 /*_c
107 * Interrupts are still disabled. Do necessary setups, then)Z0k
108 * enable themjZ@+wn
109 */u
110 ROOT_DEV = ORIG_ROOT_DEV;d&!*`
111 drive_info = DRIVE_INFO;#yRW,
112 memory_end = (1<<20) + (EXT_MEM_K<<10);9Uaw
113 memory_end &= 0xfffff000;`v8fAR
114 if (memory_end > 16*1024*1024)lA#
(gdb) next DH.zM
111 drive_info = DRIVE_INFO;X
(gdb) next ?+S:q
112 memory_end = (1<<20) + (EXT_MEM_K<<10);iXdDt
(gdb) print /x ROOT_DEV <W<
$3 = 0x21d }{%Q
(gdb) quit |
The program is running. Exit anyway? (y or n) yt
[root@plinux linux]#lixBs
=====================================================
14.1 利用bochs調試內核%UU
Bochs具有非常強大的操作系統內核調試功能。這也是本文選擇Bochs作為首選實驗環境的主要原因之一。有關Bochs調試功能的說明參見前面14.2節,這里基於Linux 0.11內核來說明Windows環境下Bochs系統調試操作的基本方法。m[2
14.1.1 運行Bochs調試程序.g8O
我們假設Bochs系統已被安裝在目錄「C:/Program Files/Bochs-2.1.1/」中,並且Linux 0.11系統的Bochs配置文件名稱是bochsrc-hd.bxrc。現在在包含內核Image文件的目錄下建立一個簡單的批處理文件run.bat,其內容如下:R
"C:/Program Files/Bochs-2.1.1/bochsdbg" -q -f bochsrc-hd.bxrcjFypV+
其中bochsdbg是Bochs系統的調試執行程序。運行該批處理命令即可進入調試環境。此時Bochs的主顯示窗口空白,而控制窗口將顯示以下類似內容:D8v~
C:/Documents and Settings/john1/桌面/Linux-0.11>"C:/Program Files/Bochs-2.1.1/boRW6RNY
chsdbg" -q -f bochsrc-hd.bxrc2
========================================================================`)2?os
Bochs x86 Emulator 2.1.13$O@R
February 08, 2004x2
========================================================================/26c3(
00000000000i[ ] reading configuration from bochsrc-hd.bxrcq4
00000000000i[ ] installing win32 mole as the Bochs GUI4UW
00000000000i[ ] Warning: no rc file specified.1dsv
00000000000i[ ] using log file bochsout.txtmM
Next at t=0*
(0) context not implemented because BX_HAVE_HASH_MAP=0c
[0x000ffff0] f000:fff0 (unk. ctxt): jmp f000:e05b ; ea5be000f0g$
<bochs:1>i/
此時Bochs調試系統已經准備好開始運行,CPU執行指針已指向ROM BIOS中地址0x000fffff0處的指令處。其中'<bochs:1>'是命令輸入提示符,其中的數字表示當前的命令序列號。在命令提示符'<bochs:1>'後面鍵入'help'命令,可以列出調試系統的基本命令。若要了解某個命令的具體使用方法,可以鍵入'help'命令並且後面跟隨一個用單引號括住的具體命令,例如:「help 'vbreak'」,如下面所示。V7
<bochs:1> help@n{L(
help - show list of debugger commands5&6^
help 'command'- show short command description~B
-*- Debugger control -*-e!/;l
help, q|quit|exit, set, instrument, show, trace-on, trace-off,u7J
record, playback, load-symbols, slistr2:
-*- Execution control -*-pOHjE
c|cont, s|step|stepi, p|n|next, modebpj
-*- Breakpoint management -*-|EQ
v|vbreak, lb|lbreak, pb|pbreak|b|break, sb, sba, blist,dL/rBI
bpe, bpd, d|del|deleteyR%|
-*- CPU and memory contents -*-xsMy
x, xp, u|disas|disassemble, r|reg|registers, setpmem, crc, info, mp_cpu,@|'p
set_cpu, ptime, print-stack, watch, unwatch, ?|calc7
<bochs:2> help 'vbreak'_t*<#o
help vbreak/?
vbreak seg:off - set a virtual address instruction breakpoint0
<bochs:3>flx+
為了讓Bochs直接模擬執行到Linux的引導啟動程序開始處,我們可以先使用斷點命令在0x7c00處設置一個斷點,然後讓系統連續運行到0x7c00處停下來。執行的命令序列如下:.Xfk
<bochs:3> vbreak 0x0000:0x7c00hDzuWy
<bochs:4> cfMH/'X
(0) Breakpoint 1, 0x7c00 (0x0:0x7c00))W&
Next at t=4409138<-0m5
(0) [0x00007c00] 0000:7c00 (unk. ctxt): mov ax, 0x7c0 ; b8c007b 03*
<bochs:5>3R28Q
此時,CPU執行到boot.s程序開始處的第1條指令處,Bochs主窗口將顯示出「Boot From floppy...」等一些信息。現在,我們可以利用單步執行命令's'或'n'(不跟蹤進入子程序)來跟蹤調試程序了。在調試時可以使用Bochs的斷點設置命令、反匯編命令、信息顯示命令等來輔助我們的調試操作。下面是一些常用命令的示例:J'P
<bochs:8> u /10 # 反匯編從當前地址開始的10條指令。,S/2
00007c00: ( ): mov ax, 0x7c0 ; b8c007Wvl
00007c03: ( ): mov ds, ax ; 8ed8)1f*
00007c05: ( ): mov ax, 0x9000 ; b80090WmD1
00007c08: ( ): mov es, ax ; 8ec0(`|
00007c0a: ( ): mov cx, 0x100 ; b90001iW1|1
00007c0d: ( ): sub si, si ; 29f6ze_QZY
00007c0f: ( ): sub di, di ; 29ffZStl
00007c11: ( ): rep movs word ptr [di], word ptr [si] ; f3a5=yF
00007c13: ( ): jmp 9000:0018 ; ea18000090!s?PR9
00007c18: ( ): mov ax, cs ; 8cc8(
<bochs:9> info r # 查看當前CPU寄存器的內容aM>/D
eax 0xaa55 436057a@`_
ecx 0x110001 1114113/$3$K"
edx 0x0 00j3G?
ebx 0x0 0gE
esp 0xfffe 0xfffee7{
ebp 0x0 0x0]*lX
esi 0x0 0m
edi 0xffe4 65508TD}Zo
eip 0x7c00 0x7c00e
eflags 0x282 642Wlg
cs 0x0 0b s=]
ss 0x0 0=Z'
ds 0x0 02R;%
es 0x0 0!
fs 0x0 0BX/
gs 0x0 0D*)}n{
『玖』 如何編譯bochs源碼
bochs-2.62版本進行編譯安裝.
安裝前准備:安裝build-essential,主要是gcc/g++編譯器.
安裝gtk庫:libgtk2.0-dev
需要注意的是,如果make中出錯了,然後再安裝了一些庫後,必須全部重新執行,不能僅僅重新make。
a.解壓源代碼
b.執行如下命令,建議寫成shell腳本,便於修改.注意,此處並沒有指定安裝位置,不修改安裝位置則程序會安裝到默認路徑下.
./configure --with-x11 --with-wx --enable-debugger --enable-disasm --enable-all-optimizations --enable-readline --enable-long-phy-address --enable-debugger-gui
c.make
d.sudo make install
『拾』 lbochs運行Win11
、下載Linux0.11系統包,本鏈接的下載包已包含Bochs軟體。
點擊打開鏈接http://oldlinux.org/Linux.old/bochs/linux-0.11-devel-040329.zip
2、解壓linux-0.11-devel-040329.zip,目錄結構如下圖所示:
這里真正使用到的文件為:Bochs-2.1.1.exe 、bochsrc-hd.bxrc、bootimage-0.11、bootimage-0.11-hd、hdc-0.11.img
3、點擊Bochs-2.1.1.exe進行安裝。
4、安裝完畢後,將所有linux-0.11-devel-040329下的文件,拷貝到剛才安裝bochs下的根目錄。原目錄如下:
拷貝過後目錄為:
5、拷貝完成後,運行bochsrc-hd.bxrc,若安裝成功,打開即能見到如下界面:
這已經是x86PC模擬器上,搭建完成的Linux操作系統。建立linux操作平台命令,就能操作Linux。由於學習操作系統需要,我們需要在Linux下,編譯操作系統以及完成簡單的源碼修改,從而達到理解Linux內核的能力。接下來,主要演示Linux內核源碼的修改,以及內核的編譯過程。由於該Linux版本的原因,我們還需要對代碼做出調整,方能成功編譯。
內核編譯過程:
1、進入/usr/src/linux 目錄下,鍵入命令 cd ../src/linux ,如下圖所示:
2、進行編譯,鍵入命令 make clean 和 make後。
若出現如下所示錯誤:gcc-cc1: Invalid option "string-insns"。這是需將Linux目錄下的Makefile文件中的-mstring-insns參數去掉。除此之外,每個子目錄fs,lib,kernel以及kernel目錄下的三個驅動程序子目錄(math, blk_drv, chr_drv)的Makefike當中的-mstring-insns參數去除掉。此處只演示根目錄下的Makefile文件修改。
3、依次修改:/linux/Makefile、/linux/fs/Makefile、/linux/lib/Makefile、
/linux/kernel/Makefile、/linux/kernel/math/Makefile、/linux/kernel/blk_drv/Makefile、/linux/kernel/chr_drv/Makefile文件。linux目錄下,鍵入:vi Makefile。如下圖所示:
找到文件中的-mstring-insns 參數,並刪去保存。
4、到/usr/local/bin中找到文件ar,並把ar 改名為gar,鍵入命令:mv ar gar。如下圖所示:
5、回到linux 目錄下,重新鍵入make clean以及 make,完成內核的編譯鏈接。
出現上圖提示,即表面程序編譯成功。完成編譯後,便可以開始修改內核源碼,從而達到擴展操作系統功能以及學習操作系統的目的。這里,我們簡單修改下,linux操作系統開機啟動項bootsect.s源碼,讓開機後輸出個性化的字元串。
6、進入/usr/src/linux/boot目錄,修改bootsect.s源碼,保存並退出。
! Print some inane message
mov ah,#0x03 ! read cursor pos
xor bh,bh
int 0x10
mov cx,#47
mov bx,#0x0007 ! page 0, attribute 7 (normal)
mov bp,#msg1
mov ax,#0x1301 ! write string, move cursor
int 0x10
msg1:
.byte 13,10
.ascii "Loading system ...this is create by demon"
.byte 13,10,13,10
.org 508
7、修改完成後,在linux目錄下,重新鍵入make命令,完成編譯。
8、make成功後生成引導啟動映象文件Image。若需要輸出這個Image文件, 可以首先備份bootimage-0.11-hd文件, 然後使用下面命令就會把bootimage-0.11-hd替換成新的引導啟動文件,鍵入命令:dd bs=8192 if=Image of=/dev/fd0。如下圖所示:
9點擊reset重啟Linux操作系統。如下圖所示: