MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - sleep 是怎樣練成的?

接上文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給我們帶來的幫助也遠超我們的想象,但如果你連問題都提不出來,他又怎么能幫你解決問題呢?所以,我們會被替代嘛?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904203.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904203.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904203.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

順序結構雙鏈表的實現

雙鏈表是用最快的時間實現鏈表的一種方式&#xff0c;具體的實現代碼如下&#xff1a; #pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h>typedef int LTDataType; typedef struct ListNode {LTDataType data;struct ListNode* next;/…

GoFrame 奉孝學習筆記

第一章節 GoFrame 是一款基礎設施建設比較完善的模塊化框架 GoFrame 是一款基礎設施建設比較完善的模塊化框架, Web Server 模塊是其中比較核心的模塊,我們這里將 Web 服務開發作為框架入門的選擇,便于大家更容易學習和理解。 用GOland編寫代碼 go.mod module goframePro…

pinia實現數據持久化插件pinia-plugin-persist-uni

在學習uniapp過程中&#xff0c;看到了pinia-plugin-persist-uni插件&#xff0c;以前面試過程中也有面試過說vuex數據刷新之前的數據就丟失了&#xff0c;之前回答的是把數據存儲到數據庫或者本地存儲。pinia-plugin-persist-uni本質上數據也是本地存儲。 1、安裝 npm instal…

Git 多賬號切換及全局用戶名設置不生效問,GIT進行上傳無權限問題

解決 Git 多賬號切換及全局用戶名設置不生效問題 在軟件開發過程中&#xff0c;我們經常會使用 Git 進行版本控制。有時&#xff0c;我們需要在同一臺機器上管理多個 Git 賬號&#xff0c;最近我在進行使用git的時候因為項目要進行上傳的不同的git賬號&#xff0c;但是通過本地…

基于STM32定時器中斷講解(HAL庫)

基于STM32定時器中斷講解&#xff08;HAL庫&#xff09; 1、定時器簡單介紹 以STM32F103C8T6中幾個定時器為例&#xff1a; TIM1&#xff1a;這是一個高級定時器&#xff0c;不僅具備基本的定時中斷功能&#xff0c;還擁有內外時鐘源選擇、輸入捕獲、輸出比較、編碼器接口以…

UE5 項目遷移 注意事項記錄

做項目的時候項目越做越大 132g的體量一旦移動復制就耗時間 這個時候遷移派上了用場 前置知識&#xff1a;會使用基本ue遷移流程 以下是遷移注意事項 遷移步驟 首先把項目插件plugins復制粘貼到新項目中其次把.project文本形式 全部復制粘貼新項目中開始遷移項目 選中要遷移的…

套接字+Socket連接

制作加載中動畫&#xff1a; 創建Panel&#xff0c;制作預制體&#xff0c;在Image游戲物體中添加DOTween插件&#xff0c;相關設置如下&#xff1a; (此為DOTween Pro,需付費&#xff0c;也可按下面的數值編寫代碼解決) Socket套接字 套接字就是將IP地址與主機端口號合并在一…

第 11 屆藍橋杯 C++ 青少組中 / 高級組省賽 2020 年真題答和案解析

一、選擇題 第 1 題 單選題 題目:表達式 ‘6’ - ‘1’ 的值是 ( ) A. 整數 5 B. 字符 5 C. 表達式不合法 D. 字符 6 答案:A 解析:在 C++ 中,字符常量以 ASCII 碼形式存儲。6 的 ASCII 碼為 54,1 的 ASCII 碼為 49,二者相減結果為 5,是整數類型,因此選 A。 第 2 題 …

使用Rust + WebAssembly提升前端渲染性能:從原理到落地

一、問題背景&#xff1a;為什么選擇WebAssembly&#xff1f; 最近在開發數據可視化大屏項目時&#xff0c;我們遇到了一個棘手的問題&#xff1a;前端需要實時渲染10萬數據點的動態散點圖&#xff0c;使用純JavaScript Canvas方案在低端設備上幀率不足15FPS。經過性能分析&a…

【沐風老師】3DMAX按元素UV修改器插件教程

3DMAX按元素UV修改器UV By Element是一個腳本化的修改器插件。對于需要創建隨機化紋理效果的用戶而言&#xff0c;3DMAX的UV By Element修改器無疑是一款高效工具&#xff0c;它將以偽隨機量偏移、旋轉和/或縮放每個元素的UV坐標。 【版本要求】 3dMax 2016及以上 【安裝方法】…

【神經網絡與深度學習】改變隨機種子可以提升模型性能?

引言 隨機種子在機器學習和數據處理領域中至關重要&#xff0c;它決定了模型訓練、數據劃分以及參數初始化的隨機性。雖然固定隨機種子能確保實驗的可重復性&#xff0c;但改變隨機種子有時會意外提升模型性能。本文將探討這一現象的潛在原因&#xff0c;并揭示隨機性如何影響…

java技術總監簡歷模板

模板信息 簡歷范文名稱&#xff1a;java技術總監簡歷模板&#xff0c;所屬行業&#xff1a;其他 | 職位&#xff0c;模板編號&#xff1a;XDNUTA 專業的個人簡歷模板&#xff0c;邏輯清晰&#xff0c;排版簡潔美觀&#xff0c;讓你的個人簡歷顯得更專業&#xff0c;找到好工作…

OpenLayers:偵聽縮放級別的變化

在實際開發中我們常常需要根據不同的縮放級別設置不同的展示效果或者執行不同的操作&#xff0c;因此偵聽縮放級別的變化就很重要。想要偵聽變化就需要依賴于OpenLayers中的事件系統&#xff0c;下面我將介紹兩個相關的事件。 一、地圖事件 moveend 1.介紹 在地圖的移動結束…

Langchain4j基于ElasticSearch的向量數據庫配置后,啟動報錯

報錯信息: co.elastic.clients.elasticsearch._types.ElasticsearchException: [es/search] failed: [search_phase_execution_exception] all shards failedat co.elastic.clients.transport.ElasticsearchTransportBase.getApiResponse(ElasticsearchTransportBase.java:34…

如何解決 403 錯誤:請求被拒絕,無法連接到服務器

解決 403 錯誤&#xff1a;請求被拒絕&#xff0c;無法連接到服務器 當您在瀏覽網站或應用時&#xff0c;遇到 403 錯誤&#xff0c;通常會顯示類似的消息&#xff1a; The request could not be satisfied. Request blocked. We can’t connect to the server for this app o…

PyTorch 2.0編譯模式深度評測:圖優化對GPU利用率的影響

一、編譯革命的性能拐點 PyTorch 2.0的torch.compile通過TorchDynamo與XLA兩種編譯模式&#xff0c;將動態圖執行效率推向新高度。本文基于NVIDIA A100與Google TPUv4硬件平臺&#xff0c;通過ResNet-50、Transformer-XL等典型模型&#xff0c;揭示不同編譯策略對GPU資源利用率…

在CentOS環境中安裝MySQL數據庫保姆級教程

一.確認當前系統版本 1.1登錄系統&#xff0c;切換至root賬戶 如圖所示&#xff1a; 1.2&#xff1a;在終端中執行如下命令查看系統版本 cat /etc/redhat-release 二.添加 MySQL Yum 源 2.1訪問MySQL開發者專區 https://dev.mysql.com/downloads/repo/yum/ TIPS: 1.發布包命…

SpringBoot智能排課系統源碼開發與實現

概述 基于SpringBoot框架開發的智能排課系統。該系統是一款功能完善的校園管理系統&#xff0c;包含管理員、教師和學生三種角色權限&#xff0c;實現了課程管理、排課算法、成績錄入等核心功能&#xff0c;是學習SpringBoot開發和企業級項目實踐的優質資源。 主要內容 1. 管…

探秘 RocketMQ 的 DLedgerServer:MemberState 的技術解析與深度剖析

在 RocketMQ 構建高可靠、強一致性消息系統的架構中&#xff0c;DLedgerServer 扮演著舉足輕重的角色&#xff0c;而 MemberState 作為 DLedgerServer 內部用于描述節點狀態的核心類&#xff0c;更是整個分布式日志模塊穩定運行的關鍵。深入理解 MemberState 的設計理念、功能特…

字符串匹配 之 KMP算法

文章目錄 習題28.找出字符串中第一個匹配項的下標1392.最長快樂前綴 本博客充分參考靈神和知乎的另一位博主 靈神KMP算法模版 知乎博主通俗易懂講解 對于給定一個主串S和一個模式串P,如果讓你求解出模式串P在主串S中匹配的情況下的所有的開始下標簡單的做法又稱為Brute-Force算…