1. 程式人生 > 其它 >南大計算機系統基礎實驗 ics2020,pa0

南大計算機系統基礎實驗 ics2020,pa0

技術標籤:c++c語言gitvim

文章目錄

1.相關資料

PA專案官方地址:https://nju-projectn.github.io/ics-pa-gitbook/ics2010/
tmux使用方法:http://www.ruanyifeng.com/blog/2019/10/tmux.html
vim學習遊戲:
http://vim-adventures.com/
Linux教程:
https://nju-projectn.github.io/ics-pa-gitbook/ics2019/linux.html#%E6%8E%A2%E7%B4%A2%E5%91%BD%E4%BB%A4%E8%A1%8C


Linux26個命令:https://linux.cn/article-6160-1.html
man入門教程:https://nju-projectn.github.io/ics-pa-gitbook/ics2019/man.html
GDB入門教程:https://www.cprogramming.com/gdb.html
作為一個對linux幾乎沒有接觸的人來說,這一部分完成需要花費的時間比較多,對於官方給出的手冊儘量一步一步完成,不要跳過,不然後面還要掉過頭來學。

2.遇到的問題解決辦法

(1)環境問題:

官方推薦在真機上安裝debain,作為一個linux菜鳥,沒有勇氣嘗試,我選擇了VMware Workstation和Ubuntu20.04。建議可以選擇版本稍微低一些的Ubuntu版本,如Ubuntu18.04。因為20.04這個版本比較大,對效能要求高一些,開始分配了2GB的記憶體和20GB的虛擬硬碟,有些卡頓。

(2)官方文件

官方文件在Getting Source Code for PAs這一步中,提到了ubuntu18.04可能會遇到的kvm編譯錯誤並給出瞭解決方案。
在我的Ubuntu20.04系統中也遇到了這一問題,在嘗試了官方給出的解決方法後,問題仍然存在。
錯誤提示如下:
Building x86-nemu-interpreter
Makefile:51: *** invalid DIFF. Supported: qemu kvm nemu. Stop.
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-EuFjIEdi-1608691935150)(/img/bVcL6Dj)]

根據給出的錯誤提示資訊,檢視Makefile檔案51的內容發現,發現是因為一個else條件中丟擲了一個錯誤。

     37 ifeq ($(DIFF),qemu)
     38 DIFF_REF_PATH = $(NEMU_HOME)/tools/qemu-diff
     39 DIFF_REF_SO = $(DIFF_REF_PATH)/build/$(ISA)-qemu-so
     40 CFLAGS += -D__DIFF_REF_QEMU__
     41 else ifeq ($(DIFF),kvm)
     42 DIFF_REF_PATH = $(NEMU_HOME)/tools/kvm-diff
     43 DIFF_REF_SO = $(DIFF_REF_PATH)/build/$(ISA)-kvm-so
     44 CFLAGS += -D__DIFF_REF_KVM__
     45 else ifeq ($(DIFF),nemu)
     46 DIFF_REF_PATH = $(NEMU_HOME)
     47 DIFF_REF_SO = $(DIFF_REF_PATH)/build/$(ISA)-nemu-interpreter-so
     48 CFLAGS += -D__DIFF_REF_NEMU__
     49 MKFLAGS = ISA=$(ISA) SHARE=1 ENGINE=interpreter
     50 else
     51 $(error invalid DIFF. Supported: qemu kvm nemu)
     52 endif

再通過檢視之前的程式碼,發現ifeq($(DIFF),qemu)中的條件總會成立,因此後面的else if和else應該沒有必要,所以就簡單粗暴,將後面的else if 和else都註釋掉。。
修改如下:

     37 #ifeq ($(DIFF),qemu)
     38 DIFF_REF_PATH = $(NEMU_HOME)/tools/qemu-diff
     39 DIFF_REF_SO = $(DIFF_REF_PATH)/build/$(ISA)-qemu-so
     40 CFLAGS += -D__DIFF_REF_QEMU__
     41 #else ifeq ($(DIFF),kvm)
     42 #DIFF_REF_PATH = $(NEMU_HOME)/tools/kvm-diff
     43 #DIFF_REF_SO = $(DIFF_REF_PATH)/build/$(ISA)-kvm-so
     44 #CFLAGS += -D__DIFF_REF_KVM__
     45 #else ifeq ($(DIFF),nemu)
     46 #DIFF_REF_PATH = $(NEMU_HOME)
     47 #DIFF_REF_SO = $(DIFF_REF_PATH)/build/$(ISA)-nemu-interpreter-so
     48 #CFLAGS += -D__DIFF_REF_NEMU__
     49 #MKFLAGS = ISA=$(ISA) SHARE=1 ENGINE=interpreter
     50 #else
     51 #$(error invalid DIFF. Supported: qemu kvm nemu)
     52 #endif

3.總結

(1)作為Linux菜鳥,這一部分比較費時,但是收穫很多,尤其是熟悉了vim的操作之後,vim編輯器之神的稱號名不虛傳。
(2)STFW,STFM,RTFSC。個人搜尋的能力很重要,讀原始碼的能力也很重要。