1. 程式人生 > 其它 >xv6實驗0-環境搭建

xv6實驗0-環境搭建

使用Docker

由於用macos編譯太過於麻煩,所以就安裝Docker來進行操作,主要的Dockerfile如下

FROM ubuntu:16.04

RUN apt-get -qq update

RUN apt-get install -y git build-essential gdb gcc-multilib tmux

RUN git clone http://web.mit.edu/ccutler/www/qemu.git -b 6.828-2.3.0

RUN apt-get install -y libsdl1.2-dev libtool-bin libglib2.0-dev libz-dev libpixman-1-dev

RUN cd qemu && ./configure --disable-kvm --target-list="i386-softmmu x86_64-softmmu" && make && make install && cd ..

ADD ./jos jos

WORKDIR jos

CMD ["/bin/bash"]

需要把程式碼目錄放到與Dockerfile檔案同一層級下

  1. docker build -t xv6 . 用於構建映象
  2. docker run --rm -it -v $PWD/jos:/jos xv6 啟動映象並掛在檔案,這樣可以在macos中編輯檔案,同時docker中也會同步顯示了,及時編譯
  3. docker exec -it 'ps_id' bash 進入執行的Docker,在用gdb除錯的時候需要

編譯執行

  • make qemu-nox 無圖形介面編譯執行
  • make qemu-nox-gdb 無圖形介面除錯執行
  • make run-name 執行使用者程式,例如make run-hello執行user/hello.c
  • make run-name-nox run-name-gdb``run-name-gdb-nox等等
  • make V=1 列印正在執行的每一條指令

如果提示需要載入安全路徑,gdb在執行的時候,需要帶上引數,命令如下
gdb -iex 'add-auto-load-safe-path .'

GDB使用

  • Ctrl-c 關閉GDB
  • c或者continue 斷點執行
  • si 或者 stepi 分步執行
  • b function或者b file:line 給特定的行或者函式設定斷點
  • b *addr 在EIP地址設定斷點
  • set print pretty 對於陣列和結構體啟用格式化列印
  • info registers
    列印通用暫存器,如eip,eflags和段選擇器
  • x/Nx addr 顯示16進位制虛擬地址的前N個字,N預設是1,addr可以是任何表示式
  • x/Ni addr 顯示N裝配說明,使用$eip,將會顯示當前指標介紹
  • symbol-file file 切換到標誌檔案
  • thread n 切換執行緒,n從0開始
  • info threads 列出所有執行緒資訊,包括其中的狀態和函式

QEMU使用

  • ctrl-a c停止qemu
  • xp/Nx paddr 顯示十六進位制實體地址的前N位,N預設是1
  • info registers 顯示所有內部暫存器狀態,包括隱藏段資訊的機器碼,中斷描述符表,和任務暫存器

比如下面的顯示

cs =0008 10000000 ffffffff 10cf9a00 DPL=0 CS32 [-R-]
  1. cs =0008 程式碼選擇器可見部分。我們使用段0x8.這也表明全域性描述符表(0x8&4=0)和當前特權等級(CPL)為0x8&3=0
  2. 10000000 段基地址。線性地址=邏輯地址+段基地址
  3. ffffffff 段限制。超過線性地址0xffffffff將會導致段無效錯誤
  4. 10cf9a00 原生標誌段,在接下來的幾個欄位,QEMU將幫助我們解碼
  5. DPL=0 特權等級段。只有程式碼在特權等級0上執行的時候才能載入這個段
  6. CS32 32位程式碼段。其他值包括資料段DS(別和DS暫存器搞混)和區域性描述符表(LDT)
  7. [-R-] 表示這個段只讀的
  • info mem 顯示虛擬地址和許可權
  • info pg 顯示當前頁表結構,輸出和info mem類似,但是單獨給出頁入口和頁表入口
  • make QEMUEXTRA='-d int' ...列印所有中斷日誌