摘" 要: 操作系統課程涉及內容較廣,有技術深度和難度,教學上有一定的挑戰,同時,在ChatGPT等大語言模型流行的當下,如何在教學時應對以及利用也值得討論。文章探討如何結合一些系統工具來幫助學生理解Linux操作系統,例如利用QEMU仿真工具來調試內核,用Crash工具來動態查看內核數據。并且探討如何在學生使用ChatGPT等工具輔助操作系統實驗編程時進行有效的考察。
關鍵詞: 操作系統; 系統工具; QEMU; Crash; ChatGPT
中圖分類號:G642;TP311.5" " " " " 文獻標識碼:A" " "文章編號:1006-8226(2023)12-201-04
Discussion on operating system teaching in the context of system
tools and large language models like ChatGPT
Zeng Yingpei
(School of Cyberspace, Hangzhou Dianzi University, Hangzhou, Zhejiang 310018, China)
Abstract: The Operating System course poses certain challenges in achieving effective teaching outcomes due to its broad content and technical depth. In the current era of popular large language models like ChatGPT, it is worthwhile to discuss how to address and utilize them. This paper aims to explore the integration of system tools to aid students in understanding Linux operating systems. Examples include using the QEMU simulation tool for kernel debugging and the Crash tool for dynamic kernel data analysis. It also discusses how to design effective assessments in the experiments of operating system courses when students utilize ChatGPT or similar models as programming assistants.
Key words: operating system; system tool; QEMU; Crash; ChatGPT
0 引言
操作系統課程是計算機相關專業中一門重要的課程。它涵蓋了操作系統中許多核心概念和原理,如進程管理、內存管理、文件系統等。同時,它還需要學生理解底層的計算機體系結構、軟件編譯和運行過程等知識。這些內涵豐富且復雜的內容,使得有效地講授這門課程面臨著較大的挑戰。一些相關工作也分別從課程思政的引入[1-2]和輔助學習系統如雨課堂的使用[3]等角度提出了一些新方法來助力操作系統的教學。
在授課實踐中我們發現,對現代操作系統內部的真實情況不了解,理論知識與實踐脫節是造成學生學習的不自信和畏難情緒的重要原因,進而會嚴重影響教學效果。英國作家霍華德·菲利普斯·洛夫克拉夫特也曾經說過“恐懼源于未知”。對于學生來說,理解Linux操作系統的內部流程并不容易,它往往被視為一個黑盒,即使教材或參考書籍中有一些系統的具體描述,也無法對所有情況做出解釋。
我們提出利用一些系統工具,來幫助學生自行探索和理解操作系統,從而提高學習效果。比如利用動態仿真工具QEMU來調試自己新編譯的內核,學生可以在任何感興趣的地方設定斷點,來中斷運行過程并進行查看,而利用Crash工具則可以實時動態地查看當前內核的各種運行數據。與一些相關工作[4]不同的是我們側重內核而不是設備的模擬仿真。
另外隨著ChatGPT等大語言模型的流行,在操作系統課程設計課(即實驗課)中,學生也會用它們進行輔助編程。我們需要應對并仍然對課程實驗進行有效的考查。目前我們主要通過要求題目做出創新來實現目的。
1 使用QEMU調試內核
通過在線網站或者Source Insight軟件只能靜態查看內核代碼,但是動態調試可以在另一維度上更深入地了解內核運行。使用QEMU和kgdb調試內核各有優勢,QEMU調試內核的優勢是跨平臺支持和靈活性高,而kgdb調試內核的優勢是實時調試和直接訪問硬件。對于學習操作系統來說,僅用一臺機器就可以方便調試的QEMU方式顯然更加合適。
1.1 調試前準備
在調試前需要準備環境和必要的文件,主要包括以下準備。
安裝QEMU、gdb。首先,需要在Linux系統中安裝QEMU和gdb,均以最新支持的版本為佳。
編譯內核。接下來,需要下載Linux內核源碼并編譯內核,確保生成了調試符號信息,并啟用CONFIG_GDB_SCRIPTS以生成一些gdb輔助腳本。一般默認配置已是如此配置的。
配置文件系統。雖然僅用單個可執行文件也可以作為rootfs,但是啟動后不方便使用,還是采用busybox這種包含一整套命令的文件系統為佳,即編譯生成出包含整個工具集的啟動內存盤initrd,如命名為rootfs.img。
1.2 進行調試
在調試時,需要用到兩個控制臺窗口,一個用于啟動QEMU(QEMU同時額外會彈出一個窗口),另一個用于啟動gdb。
啟動QEMU。啟動時設置為-S,即讓其等待gdb連接并不立刻執行,同時設定內核啟動參數為nokaslr,讓其禁用地址隨機化。比如筆者測試啟動參數為“qemu-system-x86_64 -kernel ../kernal/linux-5.4.11/arch/x86/boot/bzImage -initrd ./rootfs.img -append \"root=/dev/ram nokaslr\"" -m 512 -smp 2 -s -S”。
啟動gdb連接QEMU。可以把編譯內核生成的gdb腳本加入到gdbinit中,如筆者加入add-auto-load-safe-path /home/zengyingpei/Documents/kernal/linux-5.4.11/scripts/gdb/vmlinux-gdb.py 到~/.gdbinit中,這樣會引入一些方便的命令到gdb中使用。在另一個控制臺窗口啟動gdb并連接QEMU,加載有符號的內核vmlinux后。既可以如使用gdb一樣進行調試。
比如可以用bstart_kernel在啟動時的一個關鍵函數上下斷點。在命中后可以繼續調試。
可以用apropos lx命令看到所有加了腳本后獲得的額外的調試內核命令(lx打頭)。利用這些命令可以做比如,打印pid為10的進程的task struct:p $lx_task_by_pid(10)。
因為額外彈出的QEMU窗口中會持續輸出內核啟動的信息,此時隨時可以Ctrl+C打斷,查看目前執行棧,如圖1所示。
2 使用Crash查看當前內核數據
Crash工具可以用于交互式分析當前Linux系統運行時,或內核崩潰后生成核心轉儲文件。我們課程中主要使用它分析當前Linux系統運行時。它提供的功能包括查看和修改內存內容,檢查進程和線程的狀態,包括調用棧、等待隊列等,分析內核模塊、設備驅動和文件系統的信息,跟蹤系統調用和中斷處理,分析網絡連接、文件描述符等系統資源等等。Crash也需要與當前運行內核對應的帶符號內核文件才能運行,一般編譯安裝一次系統內核即可滿足。
我們接下來以Linuxx64架構下地址翻譯過程為例介紹Crash的使用。
Linux x64位內核采用4級頁表(4-level Paging)實現虛擬地址到物理地址的轉換,4級頁表分別是:PGD -gt; PUD -gt; PMD -gt; PTE(內核從4.14版起還支持Intel的5級頁表,物理地址達56位),PGD、PUD、PMD、PTE分別占9位,頁內偏移(Page Offset)占12位,合計48位,頁面大小為4KB,頁表項為8B。準備下面測試程序并編譯為hello:
[// gcc -o hello hello.c
#include lt;stdio.hgt;
#include lt;unistd.hgt;
int main(int argc,char **argv)
{
const char * str = \"HelloWorld!\";
printf(\"%s @ %p\n\",str,str);
pause();
} ]
直接運行hello可以得到其輸出:HelloWorld! @ 0x55fd9ebd1754,該地址為“HelloWorld”字符串的邏輯地址,程序同時并不退出。
在另外一個控制臺窗口啟動Crash。
首先可以直接用Crash的vtop命令查看地址翻譯過程,如:
[crashgt;vtop 0x55fd9ebd1754
VIRTUAL" " "PHYSICAL
55fd9ebd1754" 9ffd3754
PGD: 8f43c558 =gt; bc281067
PUD: bc281fb0 =gt; 41f57067
PMD: 41f577a8 =gt; 40900067
PTE: 40900e88 =gt; 9ffd3025
PAGE: 9ffd3000
… ]
從中除了可以直接看到物理地址0x9ffd3754外,還能看到4個目錄項地址-gt;目錄項值的映射。
另外,還可以利用Crash來手動計算出物理地址。
首先獲得CR3寄存器的值,它保存了頁目錄表的物理地址。由于地址隨機化,目前的page_offset_base為內核起始地址,因此進程的pgd值與page_offset_base相減即可推出該進程CR3的值0x8f43c000。
[crashgt;pxpage_offset_base
page_offset_base = $6 = 0xffff9adac0000000
crashgt;ps | grep hello
3289" 2551" 0" ffff9adafde28000" IN" 0.0" 4504" 1464" hello
crashgt;px ((struct task_struct *)0xffff9adafde28000)-gt;mm-gt;pgd
$8 = (pgd_t *) 0xffff9adb4f43c000
crashgt;px (0xffff9adb4f43c000
crashgt;px (0xffff9adb4f43c000 - 0xffff9adac0000000)
$14 = 0x8f43c000 ]
其次,逐個計算在PGD、PUD、PMD、PTE中目錄項的地址,并讀取出該目錄項內容,其中除低12位外其余為物理頁地址。如計算PGD中目錄項的地址:CR3值+虛擬地址中PGD部分*目錄項大小。讀取對應地址內存中內容,即為該目錄項內容,其中高64-12位為下一個頁目錄表物理塊號:
[crashgt;px (0x00000000bc281000 + 0x1f6*8)
$19 = 0xbc281fb0
crashgt;rd -p" 0xbc281fb0
bc281fb0: 0000000041f57067 gp.A....
//省略PUD、PMD計算
crashgt;px (0x000000009ffd3000 + 0x754)
$22 = 0x9ffd3754
crashgt;rd -p 0x9ffd3754 2
9ffd3754:" 726f576f6c6c6548" 402073250021646c
HelloWorld!.%s @ ]
3 使用ChatGPT等大語言模型輔助編程的課程實驗
隨著ChatGPT等大語言模型的流行,不少人也利用其輔助進行代碼編寫,這包括ChatGPT、Claude、NewBing等通用大模型和Copilot等專門用于代碼的大模型,我們也發現實際課程中有一些學生也會采用這些大模型工具進行輔助代碼編寫。如圖2顯示,ChatGPT可以完整給出為指定pid進程修改nice值的內核模塊代碼。可以看出利用這類工具后完成實驗的難度進一步降低。因為實驗課并非封閉式課程,我們并不能阻止學生使用這些新工具來輔助完成代碼編寫,但這使得我們的實驗課程需要做一些適應性改變。
首先,提醒學生不要被工具左右,主要包括下面幾點:①提醒學生還是需要系統性學習基本知識,不能全部依賴工具、頻繁問其問題,因為這樣效率可能反而不高,②自身需要理解ChatGPT等工具給出的代碼的意思,做到“知其所以然”,③工具給出的代碼如不符合自己要求時不能將就,如有的量不是預期的通過參數傳入而是使用常量等,這時自己要加以改動來實現要求。
其次,我們提出了學生需要在課程實驗中做出創新的要求。這既是為了使得學生不會是簡單地使用ChatGPT這些工具,也是仿照現實中軟件常需開發新功能的場景,同時還可以更有效地實現考查,這樣就不會都是同樣的功能。創新需要有具體內容,比如可以是在打印進程父進程時多打印一點祖父進程等信息,創新越多越有新意則可以得到更高評價。在實驗驗收時,我們也會詢問其創新的設計思路、對相應代碼的理解,即進行多維度考查[5],全面了解其創新并指出可以改進之處。
4 結束語
由于操作系統課程的教授難度較高,本文提出采用系統工具如QEMU和Crash來輔助學生對現代操作系統內部深入探索的方法。該方法實施后,部分學生對操作系統課程學習的畏難情緒明顯降低,還有學生主動嘗試Kprobes等的使用。為了使得學生合理利用ChatGPT等大語言模型,我們同時提出了實驗創新的要求。實際中學生各種新奇的小創新頻出,如實現更改進程nice值模塊時改為通過proc文件系統傳入進程pid。可見這一措施確實激發了學生的學習興趣和創新精神。
參考文獻(References):
[1] 林穗,李敏.操作系統課程思政教學設計與實踐[J].計算機
教育,2023,No.339(3):115-118.
[2] 龍諾春.課程思政理念下的“Linux操作系統”課程教學研究
與實踐[J].工業和信息化教育,2022,No.113(5):85-88,94.
[3] 曹曉梅,陳丹偉.智慧教學工具在操作系統課程教學中的應
用研究[J].軟件導刊,2023,22(1):94-98.
[4] 張潤宇,楊朝樹.Linux操作系統設備仿真教學探索與實踐[J].
福建電腦,2023,39(4):112-116.
[5] 楊智,孫磊,杜學繪等.本科信息安全專業實踐教學改革——
以操作系統安全課程為例[J].高教學刊,2022,8(10):127-130.