實驗解析:https://www.zhihu.com/column/c_142990858
Linux 是開源操作系統,用戶可以根據自身系統需要裁剪、修改內核,定制出功能更加合適、運行效率更高的系統,因此,編譯linux 內核是進行內核開發的必要基本功。
在系統中根據需要添加新的系統調用是修改內核的一種常用手段,通過本次實驗,讀者應理解linux 系統處理系統調用的流程以及增加系統調用的方法。
(1) 添加一個系統調用,實現對指定進程的nice 值的修改或讀取功能,並返回進程最新的nice 值及優先級prio。建議調用原型為:
int mysetnice(pid_t pid, int flag, int nicevalue, void __user * prio, void __user * nice);
參數含義: pid:進程ID。
flag:若值為0,表示讀取nice 值;若值為1,表示修改nice 值。
Prio、nice:進程當前優先級及nice 值。 返回值:系統調用成功時返回0,失敗時返回錯誤碼EFAULT。
(2) 寫一個簡單的應用程序測試(1)中添加的系統調用。
(3) 若程序中調用了linux 的內核函數,要求深入閱讀相關函數源碼。
Linux 提供的模塊機制能動態擴充linux 功能而無需重新編譯內核,已經廣泛應用在linux 內核的許多功能的實現中。在本實驗中將學習模塊的基本概念、原理及實現技術,然後利用內核模塊編程訪問進程的基本信息,從而加深對進程概念的理解、對模塊編程技術的掌握。
(1) 設計一個模塊,要求列出系統中所有內核線程的程序名、PID 號、進程狀態及進程優先級。
(2) 設計一個帶參數的模塊,其參數為某個進程的PID 號,該模塊的功能是列出該進程的家族信息,包括父進程、兄弟進程和子進程的程序名、PID 號。
(3) 請根據自身情況,進一步閱讀分析程序中用到的相關內核函數的源碼實現。
(1) 熟悉linux 的命令接口。
(2) 通過對linux 進程控制的相關係統調用的編程應用,進一步加深對進程概念的理解, 明確進程和程序的聯繫和區別,理解進程並發執行的具體含義。
(3) 通過Linux 管道通信機制、消息隊列通信機制、共享內存通信機制的使用,加深對不同類型的進程通信方式的理解。
(4) 通過對linux 的Posix 信號量的應用,加深對信號量同步機制的理解。 (5)請根據自身情況,進一步閱讀分析相關係統調用的內核源碼實現。
(1)熟悉linux 常用命令:pwd,useradd,passwd, who, ps, pstree, kill, top, ls, cd, mkdir, rmdir, cp, rm, mv, cat, more, grep 等。
(2) 實現一個模擬的shell:
編寫三個不同的程序cmd1.c,cmd2.c,cmd3.c,每個程序的功能自定,分別編譯成可執行文件cmd1,cmd2,cmd3。然後再編寫一個程序,模擬shell 程序的功能,能根據用戶輸入的字符串(表示相應的命令名),去為相應的命令創建子進程並讓它去執行相應的程序,而父進程則等待子進程結束,然後再等待接收下一條命令。如果接收到的命令為exit,則父進程結束;如果接收到的命令是無效命令,則顯示“Command not found”,繼續等待。
(3) 實現一個管道通信程序:
由父進程創建一個管道,然後再創建3 個子進程,並由這三個子進程利用管道與父進程之間進行通信:子進程發送信息,父進程等三個子進程全部發完消息後再接收信息。通信的具體內容可根據自己的需要隨意設計,要求能試驗阻塞型讀寫過程中的各種情況,測試管道的默認大小,並且要求利用Posix 信號量機制實現進程間對管道的互斥訪問。運行程序,觀察各種情況下,進程實際讀寫的字節數以及進程阻塞喚醒的情況。
(4) 利用linux 的消息隊列通信機制實現兩個線程間的通信:
編寫程序創建兩個線程:sender 線程和receive 線程,其中sender 線程運行函數sender(), 它創建一個消息隊列,然後,循環等待用戶通過終端輸入一串字符,將這串字符通過消息隊列發送給receiver 線程,直到用戶輸入“exit”為止;最後,它向receiver 線程發送消息“end”, 並且等待receiver 的應答,等到應答消息後,將接收到的應答信息顯示在終端屏幕上,刪除相關消息隊列,結束程序的運行。 Receiver 線程運行receive(),它通過消息隊列接收來自sender 的消息,將消息顯示在終端屏幕上,直至收到內容為“end”的消息為止,此時,它向sender 發送一個應答消息“over”,結束程序的運行。使用無名信號量實現兩個線程之間的同步與互斥。
(5) 利用linux 的共享內存通信機制實現兩個進程間的通信:
編寫程序sender,它創建一個共享內存,然後等待用戶通過終端輸入一串字符,並將這串字符通過共享內存發送給receiver;最後,它等待receiver 的應答,收到應答消息後,將接收到的應答信息顯示在終端屏幕上,刪除共享內存,結束程序的運行。編寫receiver 程序, 它通過共享內存接收來自sender 的消息,將消息顯示在終端屏幕上,然後再通過該共享內存向sender 發送一個應答消息“over”,結束程序的運行。使用有名信號量或System V 信號量實現兩個進程對共享內存的互斥及同步使用。
通過具體的文件存儲空間的管理、文件的物理結構、目錄結構和文件操作的實現,加深對文件系統內部數據結構、功能以及實現過程的理解。
(1) 在內存中開闢一個虛擬磁盤空間作為文件存儲分區,在其上實現一個簡單的基於多級目錄的單用戶單任務系統中的文件系統。在退出該文件系統的使用時,應將該虛擬文件系統以一個文件的方式保存到磁盤上,以便下次可以再將它恢復到內存的虛擬磁盤空間中。
(2) 文件存儲空間的分配可採用顯式鏈接分配或其他的辦法。
(3) 空閒磁盤空間的管理可選擇位示圖或其他的辦法。如果採用位示圖來管理文件存儲空間,並採用顯式鏈接分配方式,那麼可以將位示圖合併到FAT 中。
(4) 文件目錄結構採用多級目錄結構。為了簡單起見,可以不使用索引結點,其中的每個目錄項應包含文件名、物理地址、長度等信息,還可以通過目錄項實現對文件的讀和寫的保護。
(5) 要求提供以下操作命令: