接上文MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - sleep
探究sleep.c是如何’煉成’的?
老實講,我不熟悉Makefile,最多寫過簡單的編譯和輔助腳本,拿到Xv6的Makefile是一臉懵的,至今還是一臉懵,那么我們上篇中新加的sleep.c是如何一步步的經過編譯鏈接成一個可執行文件的?
- 從修改的UPROGS開始
UPROGS=\$U/_cat\$U/_echo\$U/_forktest\$U/_grep\$U/_init\$U/_kill\$U/_ln\$U/_ls\$U/_mkdir\$U/_rm\$U/_sh\$U/_stressfs\$U/_usertests\$U/_grind\$U/_wc\$U/_zombie\$U/_sleep\
在上篇實驗正文中,我們只在UPROGS中的最后一行加了 $U/_sleep\
,就能在Xv6系統的文件目錄中看到一個可執行程序sleep
,可是搜遍整個Makefile文件,只有兩處對他有依賴和使用
fs.img: mkfs/mkfs README $(UEXTRA) $(UPROGS)mkfs/mkfs fs.img README $(UEXTRA) $(UPROGS)-include kernel/*.d user/*.dclean: rm -f *.tex *.dvi *.idx *.aux *.log *.ind *.ilg \*/*.o */*.d */*.asm */*.sym \$U/initcode $U/initcode.out $K/kernel fs.img \mkfs/mkfs .gdbinit \$U/usys.S \$(UPROGS) \*.zip \ph barrier
- 但是這也只是說依賴 UPROGS啊,他在哪里編譯的?在過去想要搞明白這個問題我們得去查資料,去抱大腿,甚至狠一點,從頭到尾學一遍Makefile的語法規則,如今就簡單多了,直接問AI,下面是cursor給我的回答
乍一看它說的都在理,注意第三條3. 用戶程序的編譯規則
,仔細看這里的解釋,
這條規則的意思是:
- 例如 _cat 依賴于 cat.o 和 $(ULIB)(用戶態庫)。
- 先編譯 cat.c 生成 cat.o,再和用戶庫鏈接生成 _cat 可執行文件。
這里的對于 UPROGS 里的每一個目標(如 $U/_cat),Makefile 里有如下的通用規則:
中的通用規則,其實是Makefile的一種隱藏規則,詳細見 10.1 Using Implicit Rules(這也是cursor告訴我的),部分摘抄如下:
大致意思呢就是你寫了foo依賴foo.o,但是呢又沒有寫規則foo.o哪里來的,那么make就會自動的去執行相關的編譯.
- 可是執行編譯他怎么知道要調用gcc并且附加上編譯選項 *$(CFLAGS)*呢?這又是一條內建規則。。。原文見10.2 Catalogue of Built-In Rules:
所以,雖然這個Makefile中沒有明確寫gcc user/sleep.c -o user/sleep.o
,也依然通過一系列的內建規則,生成了最終的elf文件,甚至把匯編代碼什么的都自動生成了。
談一談cursor對我的幫助
至此我想我們已經在cursor的幫助下,算是搞清楚了sleep到底是怎么得來的,他甚至還建議我你不信可以自己去驗證
我還真的就去驗證了
make user/sleep.o V=1
riscv64-unknown-elf-gcc -Wall -Werror -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -DSOL_UTIL -DLAB_UTIL -MD -mcmodel=medany -ffreestanding -fno-common -nostdlib -mno-relax -I. -fno-stack-protector -fno-pie -no-pie -I/opt/homebrew/opt/openjdk@17/include -c -o user/sleep.o user/sleep.c
等等,怎么有一條 -I/opt/homebrew/opt/openjdk@17/include
,這從哪里來的?繼續追問
最終我查看了 我的~/.zshrc
文件,果然在其中找到了定義,也再次印證了 “計算機的世界里沒有魔法” 這句話
# OPENJDK
export JAVA_HOME=/opt/homebrew/opt/openjdk@17
export CPPFLAGS="-I/opt/homebrew/opt/openjdk@17/include"
我想,在如今這個時代,即使是學習晦澀難懂的底層技術原理,AI給我們帶來的幫助也遠超我們的想象,但如果你連問題都提不出來,他又怎么能幫你解決問題呢?所以,我們會被替代嘛?