sysprog2017
dev_record
contributed by <HMKRL
, HTYISABUG
>
man gprof
不先試試什麼都不會知道
先寫了含 -i
, --input
參數的 fib-iterative.c
修改 tests/Makefile
以編譯自己的程式
編譯後馬上遇到一大堆錯誤
從錯誤訊息可以得知,這些錯誤是因為不存在相應 library 導致的
從 sandbox-design.md
得知 moxiebox 不提供任何 POSIX API
可用 library 只有以下幾種
所有能使用的相關內容都被記載在 runtime/sandboxrt.h
在 moxiebox
中沒有 malloc
函式
作為替代方案, 可用 mmap
搭配 MAP_PRIVATE | MAPANONYMOUS
來配置記憶體
mmap
使用上大概可以根據修改能見度跟 mapping 類型分為四類
能見度 \ 類型 | file | MAP_ANONYMOUS |
---|---|---|
MAP_PRIVATE | 以檔案內容初始化記憶體 | 配置記憶體 |
MAP_SHARED | memory mapping I/O, IPC | IPC |
moxie_memmap
是來自 moxiebox 的輸入
為一陣列, 每一單元資料結構如下
根據 moxiebox
的 usage
用 option -d
可以把文件載入為 input
這是 moxiebox
的 usage
README.md
, sandbox-design.md
都沒有提到
打錯 option 時才無意中發現
在使用 gdb
接入 moxiebox
debug 的時候
程式發生了不正常跳過程式片段的行為
向老師詢問後, 確定是 moxiebox
內建的 gdb stub
有 bug
另外也發現執行 continue 時有錯誤行為:
程式結束,但 gdb 仍收到 SIGTRAP
追蹤程式碼並檢查 gdb stub:
得知 gdb stub 的程式本體在函式 gdb_main_loop
中
參考 gdb remote protocal 並對照程式碼實作
發現其中幾個部份留有 FIXME
:
c (continue) 部份:
S05
對應 linux signal table 即為 SIGTRAP
應該將指令的回傳訊息改為正確的 signal.
對照程式碼後,確認程式收到的 signal 會存在 cpu.asregs.exception
中
因此搭配原有的 word2hex
將正確的 signal 回傳:
m 指令處的 FIXME 也用同樣的方法實作錯誤確認:
不同點在於 m 指令接受的回傳只有以 hex 表示的 errno 值
可以將 gdb 指令寫在檔案中,在常需要重複行為(例如做 remote debugging 所需的 target remote
指令)
gdb_cmd
:
讀取command file:
(gdb) source gdb_cmd
在編寫 fibonacci 的過程中
一開始在使用 -o
option 時會產生錯誤
參考 tests/sha256.c
修改程式碼, 發現是 mmap
的 length
參數出了問題
本來閱讀參考書[1]了解到, 就算 length
沒給到 page size
系統在分配記憶體時也會以 page size 為單位分配
但是依據這邊的程式行為來看 moxiebox
的 mmap
似乎不會自動延展記憶體配置
才會導致在 setreturn
時產生 Bus error
因此將 length
修改為以 runtime/sandboxrt.h
提供的 MACH_PAGE_SIZE
為單位
就成功修正這個錯誤了
在開始移植之前要先確認非 constant-execution-time 的 sort 在 moxiebox
會有什麼行為
參考來自 github 的樣本[1]編寫 selection , insertion , bubble sort
在這個步驟, 我們遇到了超出預想的錯誤
這是一段 selection sort 的程式碼
這段程式碼在 moxiebox
中執行時會產生 Sim exception 7 (Bus error)
藉由 gdb
觀察錯誤點時會得到以下錯誤訊息
我們得到 SIGEMT
這個 signal 導致了程式的錯誤
上網查詢, SIGEMT
出現的情況為「虛擬環境接收到不被識別的指令」
為了得知究竟哪裡產生這個錯誤, 我們藉由 grep 挖掘程式碼中有關 SIGEMT
的片段
結論是程式碼中根本沒有任何相關的片段
因此我們判斷可能是 gdb stub 在傳輸接收時有問題
於是加上些觀察用程式碼,將 gdb stub 的回複字串印出來觀察:
可以發現實際上被傳送的是 SIGBUS(7)
, 但接收端卻將它辨認為 SIGEMT(?)
進一步藉由 gdb 觀察產生錯誤的程式碼片段
發現錯誤是產生在 st.l
這個組語指令執行的時候
藉由 grep 挖掘到 moxie.cc
中實作了 st.l
的功能
順著所用函式往下挖
可以看見 gdb stub 傳送的 SIGBUS
是在這邊被設置的
這說明 mach.writes2(addr, v)
產生了錯誤
挖掘的成果到這裡為止, 接下來為何會發生錯誤尚未釐清