106 OS homework 2-2 成果報告書

組長:B10415004 楊晉復
組員:B10415005 王頌仁
組員:B10415006 王文楷
github: https://github.com/tnsc4502/xv6_public


🙂 使用情境說明(包含流程圖)

  1. 使用情境

  2. 網路卡啟動程序流程 :

  3. ethtest system call 使用流程 :

  4. trap 處理流程 :


😇 成功畫面

  1. 使用Qemu指令指定虛擬網卡MAC、種類之後,可成功啟動虛擬機 :

  2. 使用ethtest system call可以向外部的DHCP Server取得IP :

  3. 也可以查看送出或接收的封包(接收的量太大超過畫面所以不予以截圖) :


🏃 實作過程(修改哪些檔案[含圖片])

左邊為原始xv6,右邊為我們版本

  1. x86.h 新增讀寫封包的底層函式 :

  2. usys.S & syscall.h & defs.h 註冊控制網路卡的底層函式System call :

  3. user.h 宣告上述system call :

  4. trap.c 新增IRQ訊號以及相關的interrupt :

  5. picirq.c 網卡硬體層的Interrupt Controller :

  6. init.c 開啟網路介面卡,並為其建立file description :

  7. file.c & sysfile.c 實作ioctl控制網路卡相關的函式 :

  8. main.c 啟動網路卡 :


😎 結論

要讓OS可以支援網路功能除了要撰寫通用的網路卡驅動程式之外,還要讓系統底層可以辨識來自網路卡的訊號,在Qemu中是IRQ 11(我們定義在trap.c第12行)。

由於我們的系統無法支援多工,因此無法像真正的電腦上可以同時工作以及接受封包,因此只能用簡單的system call來進行網路傳輸的簡易測試,而後續面臨到網路的protocol實在太複雜,因此我們僅展示DHCP協定的成果。

受限於Qemu的虛擬網路的運作機制,我們只能抓到一組預設的IP,相關文獻請參考 https://wiki.qemu.org/Documentation/Networking 的 “User Networking (SLIRP)” 條款。


📅 組員分工

  1. 楊晉復 : 尋找ne2000的網路卡驅動程式並且成功在linux上成功編譯,並且查詢qemu的ETH IRQ訊號。
  2. 王文楷 : 撰寫ethtest system call,以及根據晉復的驅動程式來使用網路卡,並且提供一個虛擬抽象層(iotcl以及write, read),以便dhcp服務使用。
  3. 王頌仁 : 將以上兩者工作合併到xv6中,並且撰寫trap處理以及dhcp服務,以及在main中啟動網路卡。