Try   HackMD

2024q1 Homework5 (assessment)

contributed by < BooleanII >

閱讀〈因為自動飲料機而延畢的那一年〉受到的啟發

閱讀這篇文章時,我深感共鳴,仿佛回到了過去。身為電機系學生,在大學期間除了課堂實驗即大四專題外,從未有機會真正動手操作電路。直到研究所時期參與機器人專案,我才第一次親手製作電路,從設計到組裝都親自參與其中。當看到機器人按照指令動起來時,那份感動無以言喻。

畢業後進入職場,整合多塊電路板、調校細節、生產成品,都是新的挑戰。學生時代的實作經驗雖多少有些幫助,但在產品的量產過程仍花了許多時間在掌握細節。

曾經遇過四大的大三學生不會用三用電錶,理由是沒有修過實驗課。電機系學生不會焊接電路真實存在,我認為很大的原因是缺乏實作的機會與動機,考試不會考的科目通常不太被受到重視。

第 1 到第 6 週 「課程教材」和 CS:APP 3/e 研讀紀錄

CS:APP 3/e

如同因為自動飲料機而延畢的那一年系列文章中提到,軟體的有趣之處在於可以馬上看到結果,且實驗的難度與成本相較起硬體電路來的低許多。
有別於電機系從計算機概論、計算機組織到計算機結構,以建構者的角度學習計算機系統,但上完後能否打造一個計算機系統又是另外一回事。本書以軟體人的觀點介紹計算機系統運作方式,期許在閱讀後知道如何寫出更好的程式。此處的好不限於性能的優化,更包含理解程式開發過程中遇到的錯誤提示,以及避免程式碼存在安全漏洞。
第一章的內容大至上是複習計算機概論所學,值得一提的是抽象表示概念,作業系統透過下列的抽象描述進行實作:

  • 文件(文件): I/O 設備
  • 虛擬記憶體(虚拟內存):程式存取的記憶體抽象描述,包含 I/O 設備連接的硬碟與記憶體
  • 行程(进程):程式抽象描述,包含處理器(指令集架構)、記憶體與 I/O 設備
  • 虛擬機(虚拟机):計算機系統抽象描述,包含作業系統與底層硬體
    此處文件的概念又與 Unix 系統中的 Everything is a file. 概念相互呼應。

注意用詞:

  • file 是「檔案」,而非「文件」(document)
  • virtual machine 是「虛擬機器」,而非「機」(engine)

Amdahl 定律其透過三個變數評估程式性能提升的效果,包含應用程式運算時間 (

Told) 、優化程式碼片段運作的時間 (
α
) 與性能提升比例 (
k
) 。有趣的是,當性能提升比例高於一定數值時,實際獲得的加速比會收斂。透過此定律的分析,可以避免盲目追求性能,而未能獲得對等的效益。

閱讀第二章時想到下列問題:

  • 書中第 24 頁提到 GCC 默認編譯時,所使用的 C 語言標準為 GNU89 ,該如何確認該設定為何?另外,由於新的 C 語言標準可向下相容,該如何選用哪種版本進行編譯?

  • bi-endian 設備在運作時,是否可同時處理 little endian 與 big endian 兩種資料格式?

    • 依據 CPU 與其指令集是否支援而定,包含但不限於下列種類:
      • 透過硬體配決定使用哪種資料格式。
      • 在系統啟動過程中,透過軟體決定使用的資料格式。
      • 運作過程中可同時處理兩種資料格式。
    • https://en.wikipedia.org/wiki/Endianness#Bi-endianness

  • little endian 與 big endian 看起來只是單純的硬體架構上的差異,兩者在實際運作上存在優缺點嗎?

    • little endian 和 big endian 的優缺點相互補
    • big endian 優點
      • 資料排列方法容易閱讀。
      • 即便使用錯誤的型態讀取資料,仍可獲得正確的 signed bit 。
      • bitwise 位移操作較為簡單且直觀。
    • 缺點
      • 使用錯誤的資料長度讀取時,取到的內容會完全錯誤。
      • 大多數的 big endian 處理器不支援非 word 單位的記憶體位址資料讀寫。
    • Big-Endian, Little-Endian: Comparison

  • 圖 2-4 的範例程式中,為何將 byte_pointer 定義為 signed char pointer 會有不同的結果?

#include <stdio.h>

typdef unsigned char *byte_pointer;

void show_bytes(byte_pointer start, size_t len) {
    size_t i;
    for (i = 0; i < len; i++)
        printf(" %.2x", start[i]);
    printf("\n");
}

void show_int(int x) {
    show_bytes((byte_pointer) &x, sizeof(int));
}

void show_float(float x) {
    show_bytes((byte_pointer) &x, sizeof(float));
}

void show_pointer(void *x) {
    show_bytes((byte_pointer) &x, sizeof(void *));
}

第 6 週課程教材

Linux 核心設計: 不只挑選任務的排程器 (上) 中,想到下列問題:

  • 排程器在 response 與 throughput 間往往無法兼顧,但如果 throughput 夠高,為何無法同時滿足 response 的需求?
    • throughput 不可能無限大,如遇到運算量過大的任務,將造成其他任務沒辦法在需求時間內被執行。
  • 投影片中提到 Processes may belong to various process groups ,此設計的用途為何? process group ID 也是使用 link-list 的方式紀錄在 process 中嗎?
  • How containers use PID namespace to provide process isolation使用多個 terminal 示範PID Namespace 提供各個 session 間的隔離機制,為何開啟多組 terminal 就可以觀察到 root PID namespace 的相關隔離機制?且最先開的為 root PID namespace ?
  • 在 Linux 核心中 process switch 與 context switch 的差別?

課程期末專題

  1. Trusted Firmware-A (TF-A)
    工業 4.0 的興起,使物聯網 (IOT) 技術被廣泛應用於各式情境,但背後的資訊安全仍未有標準。 Arm 針對自家 A-Profile 架構處理器推出的韌體架構,目的在於提供安全的運算平台,共提供四大類安全性功能,與 PSA Certified 安全性認證方案,以增加使用者信心。
  • 防禦執行
  • 隔離
  • 共同平台安全性服務
  • 標準安全性 API

ARM 架構安全性功能

閱讀前人的研究成果,若同樣使用 Raspberry Pi 作為實驗平臺,待確認可滿足系統啟動流程分析需求的 JTAG 規格。

  1. 重做 lab0 並彙整學員成果
    為了這堂課特地買了新電腦,好不容易完成環境架設後,第一件事情竟是急著實作 queue 操作,而沒有靜下心來把 Valgrind 、網頁伺服器與指定論文研讀完,第一週就這麼草草開始感覺不踏實。

幻滅是成長的開始

  1. Trusted Firmware-A 及 Linux 啟動流程分析
    我對嵌入式系統的應用十分感興趣,在評估要為這堂課買哪台電腦時,有看上 Raspberry Pi 5 ,當時苦於 mouser 價格親民但交期太長,且不確定硬體規格是否可以滿足課程實驗所需,就選擇一般的筆電來旁聽課程一同學習 Linux 系統。工業 4.0 與設備智慧化的趨勢,感測、遠端監控與遠端控制模組需求急速增長,在軟體開發過程中就須考量到系統可靠度與資安風險等相關議題。

https://trustedfirmware-a.readthedocs.io/en/latest/plat/qemu.html
https://lnxblog.github.io/2020/08/20/qemu-arm-tf.html

  1. 並行程式設計
    去年看到羅習五老師在 ptt 八卦板上的文章覺得驚為天人,透過修改 glibc 和 Linux kernel 把多核 CPU 壓榨出更多性能。在運算平台的核數不斷增加的現在,也希望自己能夠撰寫出具備 scalability 的程式,有了更多的資源不就是要能夠做更多的事嗎?

Re: [新聞] 中正資工新技術助電腦效能大躍進 獲「系統界奧斯卡」肯定