丁喬

摘 要: 為了擴大操作系統的功能以及學習由Linux系統提供的系統調用,可以在內核中增加系統調用。運用Linux操作系統,VMware Workstation和Ubuntu達到我們的目的。獲得Linux內核源代碼,配置、編譯和安裝內核二進制并且將一個新條目添加到一組可引導的內核來構建一個新的內核。接下來的工作是擴展內核源代碼,將系統調用增加到內核中,其中一個是打印功能,另一個是函數返回系統數據和時間功能。最后,我們將在用戶程序中完成系統調用。
關鍵詞:Linux 操作系統 系統調用 內核
中圖分類號:TP399 文獻標識碼:A 文章編號:1003-9082(2016)12-0001-02
一、Linux和系統調用
1. Linux介紹
Linux操作系統是UNIX操作系統的一種克隆系統,現已成為世界上使用最多的UNIX類操作系統。Linux可免費使用和自由傳播,是一個基于POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行UNIX工具軟件、應用程序和網絡協議,支持32位和64位硬件并且繼承了Unix以網絡為核心的設計思想,是一個性能穩定的多用戶網絡操作系統。
Linux聞名于它的高效性和靈活性,Linux模塊化處理它的設計結構,使它不僅能在昂貴的工作站上運行,還能在廉價的PC機上體現Unix的全部特性,具有多任務、多用戶的能力。[1]
操作系統的功能在于管理硬件資源和為應用程序開發人員提供良好的環境來使應用程序具備更突出的兼容性,內核提供一系列具備預定功能的多內核函數,通過一組系統調用的接口呈現給用戶。系統調用將應用程序的需求傳送給內核,調用相對應的的內核函數完成需要的處理,將結果返回給應用程序。[2]
2.系統調用介紹
系統調用出現過程調用用戶程序,但導致執行上下文的變化和特權。用戶模式和過程調用系統調用有一些差異和相似之處。
2.1用戶模式過程調用
2.1.1將參數傳遞給被調用的堆棧或寄存器上;
2.1.2保存當前狀態和PC,并跳到被調用的過程;
2.1.3特權是相同的。
2.2系統調用
2.2.1系統調用是對用戶程序的調用,但是會導致執行上下文和特權的變化。在英特爾386,系統調用是通過存儲系統調用數字到EAX寄存器來完成的,比如在其他寄存器中向系統調用存儲參數(如EBX,ECX,EDX,ESI),或執行指令的陷阱。(INT 0x80指令)。
2.2.2在計算中,系統調用是一個計算機程序的編程方式來請求執行在操作系統上的內核。這可能包括硬件相關服務,創建和執行新的流程和溝通與整體內核進程調度等服務。系統調用提供了一個基本流程和操作系統之間的接口。在大多數系統中,系統調用可能只在用戶空間進程中實現,而在其他一些系統中,例如繼任者,特權系統代碼也可以實現系統調用。
2.3系統調用執行
2.3.1在陷阱之后,系統調用表用于索引代碼指針來為處理器標志起始地址。
2.3.2 2system_call()函數將比較系統調用號和NR_syscalls之間的價值。
2.3.3如果相比下來該值更大或相等,便回到ENOSYS。如果小,執行call* sys_call_table(% eax,4),并跳轉到處理程序;
2.3.4特權在用戶和內核模式之間轉化,內核代碼執行請求的服務:
I/O交互過程管理其他活動無法在用戶模式下執行
二、在內核中增加系統調用
1.打印功能
1.1查看內核版本
Sudo是一種常用的在Linux下允許普通用戶使用超級用戶權限的工具,允許系統管理員讓普通用戶執行一些或所有的根命令。這不僅可以減少根用戶登錄和管理的時間,也提高了安全性。
1.2輸入/usr/SRC查看活躍文件是否存在
1.3檢查源文件中的版本號
apt-cache是一個屬于Linux的恰當的包管理工具,它可以查詢恰當的二進制包緩存文件。Apt-cache通過不同的參數和子命令來顯示包、包的依賴關系和有關其他功能的信息。
1.4搜索版本信息,修正、同時更新版本。
1.5創建的文件“helloworld.c”
保存和退出
1.6創建“Makefile文件和進口
1.7編譯
出現以上信息,這表明編譯成功。
1.8 insmod模塊并檢查它
1.8.1這個系統調用(sys_init_module時)分配內核內存到相應的模塊, 這個內存分配操作是通過vmallo.c years來獲得
1.8.2然后將內容復制到這個模塊的存儲空間;
1.8.3內核申報模塊的引用
1.8.4初始化模塊調用涵數
Hello World已經寫在“syslog”
2.函數返回系統時間和日期
2.1檢查當前系統內核啟動項
2.2修改文件/usr/src/linux-source-/kernel/sys.c
2.3附加/usr/src/linux-/arch/x86/include/asm/unistd_32.h:#define__NR_mycall 337
2.4編譯內核
2.4.1讓mrproper消除不穩定的內核對象文件,附件,和內核配置文件
2.4.2使清潔:清除用于生成目標文件和其他文件
2.4.3讓oldconfig使用默認內核配置
2.4.4使bzImage:編譯內核
2.4.5讓模塊:編譯模塊
2.4.6 modules_install安裝模塊
2.4.7開始使用最新的項目
2.4.8增加啟動菜單項, 配置啟動文件/boot/grub/grub.cfg
2.4.9測試程序
三、結論
這個實驗的內容涉及到Linux系統調用。也就是說,應用程序的操作系統和內核提供了一組接口。通過此接口,應用程序可以被轉換到內核狀態,并調用相應的的內核函數,從而實現應用程序之間的交互和系統內核。
本文提出,任務指標應該向Linux內核中增加兩個系統調用。程序執行系統調用可以在以下步驟中運行。程序調用libc庫包函數。然后調用軟中斷0 x80 int到內核。內核首先實現system_call函數(首先系統調用號(eax)和CPU寄存器可以使用和保存到對應的堆棧(由SAVE_ALL完成)。之后,在系統調用表中找到對應的系統調用服務例程根據系統調用號。
在時代下的Windows操作系統,許多底層的東西都被掩蓋了。感謝我們的Linux讓我們更深入理解操作系統以及與操作系統相關的各個方面。同時,也是一個很好的機會讓我們學會操作系統的系統調用。
參考文獻
[1]Linux系統,2016-11-1取自http://baike.so.com/doc/5349227-5584683.html
[2]系統調用,2016-10-29取自http://baike.so.com/doc/5715175-5927901.html
[3]"The Linux Foundation Releases Linux Development Report". Linux Foundation. 18 February 2015. Retrieved 20 February 2015.