linux內核系統(tǒng)調用實驗指導書.ppt_第1頁
linux內核系統(tǒng)調用實驗指導書.ppt_第2頁
linux內核系統(tǒng)調用實驗指導書.ppt_第3頁
linux內核系統(tǒng)調用實驗指導書.ppt_第4頁
linux內核系統(tǒng)調用實驗指導書.ppt_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

預備知識 Linux內核結構 Linux內核源碼 Linux系統(tǒng)調用 實驗指導 系統(tǒng)調用的添加 Linux內核編譯 實驗步驟,linux內核系統(tǒng)調用實驗指導書,線程同步實驗,Linux內核結構,線程同步實驗,Linux分為用戶空間和內核空間兩個層次,Linux內核結構,線程同步實驗,Linux內核的組成 進程調度(SCHED):控制進程對CPU的訪問 內存管理(MM):允許多個進程安全的共享內存區(qū)域 虛擬文件系統(tǒng)(VFS):隱藏各種硬件的具體細節(jié),為所有設備提供統(tǒng)一的接口 網(wǎng)絡接口(NET):提供對各種網(wǎng)絡標準的存取和各種網(wǎng)絡硬件的支持 進程間通訊(IPC):支持進程間各種通信機制,Linux內核源碼,線程同步實驗,Linux系統(tǒng)調用,線程同步實驗,Linux系統(tǒng)調用機制 Linux內核中設置了一組用于實現(xiàn)各種系統(tǒng)功能的子程序,稱為系統(tǒng)調用 用戶通過系統(tǒng)調用命令在自己的應用程序中調用它們 系統(tǒng)調用與普通函數(shù)調用的區(qū)別 系統(tǒng)調用 核心態(tài) 操作系統(tǒng)核心提供 普通的函數(shù)調用 用戶態(tài) 函數(shù)庫或用戶自己提供,Linux系統(tǒng)調用,線程同步實驗,為什么有系統(tǒng)調用? 一般用戶進程不能直接訪問系統(tǒng)內核,不能直接使用或修改內核數(shù)據(jù),以免干擾內核程序的執(zhí)行,妨礙系統(tǒng)安全。 系統(tǒng)調用是什么? 用戶進程要使用內核功能時,只能通過內核提供的接口系統(tǒng)調用來實現(xiàn),系統(tǒng)調用實際是操作系統(tǒng)內核提供的、功能較強的一系列函數(shù)。 系統(tǒng)調用好比一個中間人,把用戶進程的系統(tǒng)調用請求傳達給內核,待內核把請求處理完畢后再將處理結果送回給用戶空間。 系統(tǒng)調用是用戶空間訪問內核的唯一手段。系統(tǒng)調用發(fā)生時會從用戶態(tài)轉到內核態(tài),完成功能后又由內核態(tài)轉回用戶態(tài),Linux系統(tǒng)調用,線程同步實驗,使用系統(tǒng)調用的兩種方式 1、通過C庫函數(shù) 2、使用syscall函數(shù) syscall函數(shù)原型為: int syscall(int number,); 通過指定系統(tǒng)調用號和一組函數(shù)來調用系統(tǒng)調用 * 2.6.19版前使用_syscall宏,Linux系統(tǒng)調用,線程同步實驗,C庫函數(shù)系統(tǒng)調用例子,Linux系統(tǒng)調用,線程同步實驗,系統(tǒng)如何響應調用的? 系統(tǒng)調用函數(shù)中的int$0x80匯編指令,會產(chǎn)生向量為128的異常。內核通過查中斷向量表找到128號異常對應的處理程序系統(tǒng)調用處理程system_call() 如何找到對應的內核函數(shù)? system_call()利用系統(tǒng)調用號查系統(tǒng)調用表sys_call_table,找到對應每個系統(tǒng)調用號的處理函數(shù)。,Linux系統(tǒng)調用處理流程,線程同步實驗, xyz() ,system_call: sys_xyz() ret_from_sys_call: ,xyz() int 0x80 ,sys_xyz() ,用戶態(tài) 內核態(tài),glibc標準庫中的封裝例程 (系統(tǒng)調用函數(shù) 的具體實現(xiàn)),系統(tǒng)調用處理程序,系統(tǒng)調用 服務例程 (內核函數(shù)),在應用程序中使用系統(tǒng)調用,系統(tǒng)調用的添加,線程同步實驗,(1)完成系統(tǒng)調用函數(shù) 編寫待添加的系統(tǒng)調用函數(shù),函數(shù)名以sys_開頭。 系統(tǒng)調用服務例程的名字均遵守一定的規(guī)則:系統(tǒng)調用名稱前增加“sys_”前綴,比如open系統(tǒng)調用對應sys_open函數(shù) 如:mycall(int num),在/usr/src/linux/kernel/sys.c文件中添加代碼: asmlinkage int sys_mycall(int number) return number; /僅返回一個整型值 ,系統(tǒng)調用的添加,線程同步實驗,(2)在系統(tǒng)調用表中添加表項 讓內核的其余部分知道該系統(tǒng)調用的存在。 系統(tǒng)調用表sys_call_table存儲了所有系統(tǒng)調用對應的服務例程的函數(shù)地址。 對于X86 32位體系結構的系統(tǒng)調用表位于arch/X86/kernel/syscall_table_32.S文件中定義。 第n個表項對應了系統(tǒng)調用號為n的服務例程的入口地址的指針,如:/usr/src/linux/arch/x86/kernel/syscall_table_32.S的最后一行增加新的系統(tǒng)調用內核函數(shù)指針。 .long sys_mycall,系統(tǒng)調用的添加,線程同步實驗,(3)添加系統(tǒng)調用號 /arch/x86/include/asm/unistd_32.h 每個系統(tǒng)調用號都是唯一的,依次對應sys_call_table中的一項,系統(tǒng)調用號寫在unistd.h文件中,以“_NR_”開頭。 內核通過系統(tǒng)調用號作為下標去獲取sys_call_table中的服務例程函數(shù)地址。 系統(tǒng)調用號一旦分配就不能再有任何變更,系統(tǒng)運行中即使該系統(tǒng)調用被刪除,它所擁有的系統(tǒng)調用號也不能被回收利用。,系統(tǒng)調用的添加,線程同步實驗,如: 在/arch/x86/include/asm/unistd_32.h 里的 #define _NR_recvmmsg 337 行下添加: #define _NR_mycall 338 這里系統(tǒng)調用號為338,是因為Linux-2.6內核自身的系統(tǒng)調用號碼已經(jīng)用到337,新添加的系統(tǒng)調用號不能與前面已有的重復。,系統(tǒng)調用的添加,線程同步實驗,(4)編寫系統(tǒng)調用的測試代碼 通過調用syscall函數(shù)調用添加的系統(tǒng)調用。 如:mycall系統(tǒng)調用的系統(tǒng)調用號為338,則調用mycall的方式為 syscall(338, argu); argu為mycall的參數(shù)。,系統(tǒng)調用的添加,線程同步實驗,(1)下載內核 到下載新內核 解壓到/usr/src/kernels目錄下 (2)清除內核及之前編譯的內容 make clean /清除原有不需要的模塊和文件 make mrproper /刪除原來編譯產(chǎn)生的垃圾 (3)配置內核 make oldconfig / 與當前配置相同 make config / 基于文本的、最為傳統(tǒng)的配置界面 make menuconfig / 基于文本菜單形式,字符終端下使用 make xconfig / 基于圖形窗口模式,Xwindow下使用,Linux內核編譯,Concurrency(并發(fā)性),(4)編譯內核 make 或make zImage /編譯內核, make zImage編譯壓縮 /形式的大內核 make modules /編譯選擇的模塊 make modules_install /編譯后的模塊移到系統(tǒng)標準位置 make install /把壓縮內核映象拷貝到/boot目 /錄下, 創(chuàng)建System.map符號鏈接 (5)啟動項配置 mkinitramfs o /boot/initrd.img- /創(chuàng)建內核的initrd映象 在/boot/grub/grub.cfg中設置啟動項的配置,Linux內核編譯,線程同步實驗,實驗環(huán)境 系統(tǒng)版本:CentOS 5.5 內核版本:2.6.18-194.el5 欲編譯內核:3 命令uname -r 查看當前系統(tǒng)的內核版本,實驗步驟,線程同步實驗,實驗目的: (1)添加新的系統(tǒng)調用pedagogictime,該函數(shù)通過使用一個引用參數(shù)的調用返回當前的系統(tǒng)時間。 (2)編寫一個用戶空間程序來測試pedagogictime,實驗步驟,線程同步實驗,rootlocalhost # cd /usr/src/kernels/linux-3 /切換到預編譯內核目錄 rootlocalhost linux-3# vi kernel/sys.c /用vi編輯器打開sys.c文件添加系統(tǒng)調用pedagogictime的代碼 /添加到sys.c的最后一行 /代碼如下: asmlinkage long sys_pedagogictime(struct timeval *tv) if(likely(tv) struct timeval ktv; do_gettimeofday( ,實驗步驟,線程同步實驗,實驗步驟,線程同步實驗,rootlocalhost linux-3# vi arch/x86/kernel/syscall_table_32.S /編輯系統(tǒng)調用表syscall_table_32.S, 添加pedagogictime .long sys_pedagogictime /* 338 */,實驗步驟,線程同步實驗,rootlocalhost linux-3# vi arch/x86/include/asm/unistd_32.h /編輯unistd_32.h,添加pedagogictime的系統(tǒng)調用號 #define _NR_pedagogictime 338,實驗步驟,線程同步實驗,rootlocalhost linux-3# make mrproper /刪除原來編譯產(chǎn)生的垃圾 rootlocalhost linux-3# cp /boot/config-2.6.18-194.el5 .config /導入原系統(tǒng)的內核配置 rootlocalhost linux-3# make menuconfig / Load an Alternate Configuration File - 導入.config文件 - Save an Alternate Configuration File - Exit /導入配置到欲編譯內核中 rootlocalhost linux-3# vi .config /修改配置, 修改如下: # CONFIG_SYSFS_DEPRECATED_V2 is not set 修改為: CONFIG_SYSFS_DEPRECATED_V2 = y,實驗步驟,線程同步實驗,rootlocalhost linux-3# make all /編譯內核 rootlocalhost linux-3# make modules /編譯模塊 rootlocalhost linux-3# make modules_install /添加模塊到內核 rootlocalhost linux-3# make install /鏈接、組建內核,實驗步驟,線程同步實驗,rootlocalhost linux-3# cp /boot/initrd-3.img /tmp /把剛編譯生成的內核拷貝到/tmp文件夾下,用作修改其中配置和重新打包內核 rootlocalhost linux-3# mv /boot/initrd-3.img /boot/initrd-3.img.bak /修改剛編譯生成的內核的文件名為initrd-3.img.bak,用作備份 rootlocalhost linux-3# cd /tmp /切換至/tmp文件夾 rootlocalhost tmp# mkdir newinitrd /新建newinitrd文件夾,用作把剛編譯的內核解壓到該文件夾下 rootlocalhost tmp# cd newinitrd /切換至newinitrd文件夾,實驗步驟,線程同步實驗,rootlocalhost newinitrd# zcat /initrd-3.img |cpio -i /解壓內核 rootlocalhost newinitrd# vi init /修改啟動初始化配置文件 /配置文件中有重復的配置,去掉其中一個即可 echo “Loading dm-region-hash.ko module“ insmod /lib/dm-region-hash.ko,實驗步驟,線程同步實驗,rootlocalhost newinitrd# find .|cpio -c -o /initrd /打包修改配置后的所有內核文件 rootlocalhost newinitrd# cd /切換到/tmp文件夾 rootlocalhost tmp# gzip -9 initrd-3.img /壓縮打包文件,構建內核包 rootlocalhost tmp# cp initrd-3.img /boot/ /把新建的內核包復制到文件夾/boot,到此內核編譯、打包、修改、構建完成 rootlocalhost tmp# reboot /重啟系統(tǒng),驗證新編譯的內核,實驗步驟,線程同步實驗,rootlocalhost # mkdir source /系統(tǒng)重啟后,創(chuàng)建source文件夾,用于存放編寫的用戶空間程序 rootlocalhost # cd source/ /切換到source目錄 rootlocalhost source# vi test.c /新建用于測試pedagogictime系統(tǒng)調用的用戶空間程序文

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論