fzdwx

fzdwx

Hello , https://github.com/fzdwx

記錄學習 jyyos 操作系統課

最近也是又追起了南京大學的操作系統課 (前面幾次都中途放棄了), 記錄一下

1. 首先就是編譯第三節課的一個 demo 時,找不到 ld 等命令#

http://jyywiki.cn/OS/2023/build/lect3.ipynb demo('hello-os', 'i/hello-os')

由於我使用的是 archlinux, binutils 編譯出來的 ld, gcc 等命令都是不帶 x86 的前綴的,
而 Makefile 中定義的都是帶 x86 的,所以需要建立一個連結:

ln -s /usr/bin/ld /usr/bin/x86_64-linux-gnu-ld

{{<block type="tip" title="來自 chatgpt 的解釋:">}}
該命令創建了一個名為 “x86_64-linux-gnu-ld” 的符號連結,指向 “/usr/bin/ld”. 這個符號連結可以被用作 “x86_64-linux-gnu-ld” 二進制文件的替代品.
符號連結是一種特殊的文件類型,它是一個指向另一個文件的文件,可以用來在文件系統中創建指向其他文件或目錄的別名.

在 Linux 系統中,“/usr/bin/ld” 是一個連接器(linker), 用於將多個目標文件合併為單個可執行文件。通過創建 “x86_64-linux-gnu-ld” 的符號連結,可以使該連接器的功能可以在不同的系統上使用,並且不需要更改可執行文件的代碼.
這個符號連結通常被用於交叉編譯(cross-compiling)應用程序,這種情況下,應用程序在不同的硬件平台上運行.
{{< /block >}}

2. 使用 vscode 等編輯器時,第一個問題的代碼中頭文件無法跳轉#

使用 bear 生成 compile_commands.json, 然後編輯器就會自動識別了

bear -- make

{{<block type="tip" title="來自 chatgpt 的解釋:">}}
該命令使用 Bear 和 Make 工具,用於自動捕獲 Makefile 的編譯命令和編譯期間的調用鏈.

具體來說,Bear 是一個工具,它可以將系統調用跟踪器(strace)輸出轉換為 JSON 格式的文件,這個文件包含了所有運行期間的系統調用.
Make 是一個工具,它用於根據 Makefile 規則自動構建和編譯程序.

當這兩個工具一起使用時,可以使用 “bear -- make” 命令自動捕獲 Makefile 的編譯命令和編譯期間的調用鏈,這個過程可以在後續的調試中使用.
該命令的執行將產生一個 JSON 格式的文件,其中包含編譯期間的所有系統調用和它們的參數。這個文件可以用於調試,性能優化,以及自動化編譯和構建系統的開發.

總之,“bear -- make” 命令可以幫助程序員更好地理解他們的代碼在編譯期間所做的事情,以及識別代碼中的潛在問題.
{{< /block >}}

3. 寫一個 pstree - M1#

http://jyywiki.cn/OS/2023/labs/M1

實現思路:

  1. 掃描 /proc/ 目錄下所有為數字的文件夾
  2. 讀取 /proc/{pid}/status 文件
  3. 讀取 name 以及 ppid
  4. 建樹並打印樹結構

4. 關於編譯新的 os-workbench#

今天嘗試下載了一下 2023 年的代碼倉庫,沒想到可以下了

~~git clone https://git.nju.edu.cn/jyy/os-workbench.git~~

然後我就拉了 L0 來跑,但是怎麼樣都跑不動: [-Werror=array-bounds] 是關於數組越界的
文件是 os-workbench/abstract-machine/am/build/x86_64-qemu/src/x86/qemu/ioe.o:433

~~git pull origin L0~~

解決辦法是在 os-workbench/abstract-machine/MakefileCFLAGS 最後添加 -Wno-array-bounds

5. 跑起來 2023 版的代碼#

昨天晚上在我在本機的 L0 代碼下 make run 是跑不起來的,qemu 正常啟動了但是界面是黑的,環境是

Linux archlinux 6.2.2-arch1-1
qemu 7.2
gcc 12.2.1

最後只能曲線救國,在 docker 中 build, 然後在本機跑 qemu (docker 中不方便按圖形化界面)

FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update
RUN apt-get install -y build-essential git gcc-multilib qemu-system strace gdb sudo python3 libsdl2-dev libreadline-dev llvm-11 
RUN useradd -ms /bin/bash user
USER user
WORKDIR /home/users
docker build -t jyyos .
# os-workbench
docker run --rm -it -v ${PWD}:/mnt -w /mnt jyyos bash

# exit docker : os-workbench/kernel
make
qemu-system-x86_64 -serial mon:stdio -machine accel=tcg -smp "" -drive format=raw,file=./build/kernel-x86_64-qemu

可能還是編譯出了問題,使用 docker 編譯後就沒有出現第 4 個問題

6. 在 AbstractMachine 中顯示一張圖片 - L0#

這個我記得去年是做一個可以動的遊戲,根據鍵盤的輸入去做一些響應,而今年的是只要打印一張圖片,大概思路:

  1. xxd -i xxx.png > img_data.h
  2. 遍歷這個數組,取 rgb 並調用 draw_title
  3. 解析參數,獲取要輸出的分辨率,然後在獲得寬高的縮放比,最後獲得對於的像素點

感覺我的實現有問題,只是放大了左上角

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。