




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
linux內核系統調用實驗指導書第一頁,共31頁。基本知識2第二頁,共31頁。…xyz()…system_call:…sys_xyz()…ret_from_sys_call:…iretxyz(){…int0x80…}sys_xyz(){…}用戶態 內核態在應用程序中使用系統調用glibc標準庫中的封裝例程(系統調用函數的具體實現)系統調用處理程序系統調用服務例程(內核函數)系統調用處理過程3第三頁,共31頁。為什么有系統調用?一般用戶進程不能直接訪問系統內核,不能直接使用或修改內核數據,以免干擾內核程序的執行,妨礙系統安全。系統調用是什么?用戶進程要使用內核功能時,只能通過內核提供的接口——系統調用來實現,系統調用實際是操作系統內核提供的、功能較強的一系列函數。系統調用好比一個中間人,把用戶進程的系統調用請求傳達給內核,待內核把請求處理完畢后再將處理結果送回給用戶空間。系統調用是用戶空間訪問內核的唯一手段。系統調用發生時會從用戶態轉到內核態,完成功能后又由內核態轉回用戶態。4第四頁,共31頁。使用系統調用的兩種方式1、通過C庫函數2、使用syscall函數
syscall函數原型為:
intsyscall(intnumber,…);通過指定系統調用號和一組函數來調用系統調用*2.6.19版前使用_syscall宏C庫函數內核系統調用應用程序代碼5第五頁,共31頁。C庫函數系統調用例子用戶程序中使用C庫中的函數malloc函數free函數srccpy函數open函數brk系統調用open系統調用6第六頁,共31頁。系統如何響應調用的?
系統調用函數中的int$0x80匯編指令,會產生向量為128的異常。內核通過查中斷向量表找到128號異常對應的處理程序——系統調用處理程system_call()如何找到對應的內核函數?
system_call()利用系統調用號查系統調用表sys_call_table,找到對應每個系統調用號的處理函數。7第七頁,共31頁。實驗8第八頁,共31頁。一、實驗目的學習如何產生一個系統調用往內核中添加一個新的函數實現對用戶空間的讀寫理解、掌握Linux系統調用的實現框架、用戶界面、參數傳遞、進入/返回過程。9第九頁,共31頁。二、主要實驗環境Linux環境:CentOS6.0,linuxkernel2.6.32.71欲編譯內核:linux-2.6.35.13命令uname–r10第十頁,共31頁。三、實驗指導獲得內核源代碼,本次下載的內核版本為2.6.35.13將內核源碼保存到/usr/src目錄下cd/usr/srctar–xjvflinux-2.6.35.13.tar.bz2tarzxvflinux-2.6.35.13.tar.gz定義系統調用編號和修改系統調用表11第十一頁,共31頁。1)系統調用表
系統調用表sys_call_table存儲了所有系統調用對應的服務例程的函數地址。對于X8632位體系結構的系統調用表位于arch/X86/kernel/syscall_table_32.S文件中定義。系統調用服務例程的名字均遵守一定的規則:系統調用名稱前增加“sys_”前綴,比如open系統調用對應sys_open函數。可以使用man2syscalls瀏覽所有系統調用的添加歷史12第十二頁,共31頁。系統調用表位置cd/usr/src/linux-2.6.35.13/arch/x86/kernelvisyscall_table_32.S第n個表項對應了系統調用號為n的服務例程的入口地址的指針修改系統調用表:將.longsys_my_new_call添加到arch/x86/kernel/syscall_table_32.S中最后一行13第十三頁,共31頁。2)系統調用號
/arch/x86/include/asm/unistd_32.h
每個系統調用號都是唯一的,依次對應sys_call_table中的一項,系統調用號寫在unistd.h文件中,以“__NR_”開頭。
內核通過系統調用號作為下標去獲取sys_call_table中的服務例程函數地址。
系統調用號一旦分配就不能再有任何變更,系統運行中即使該系統調用被刪除,它所擁有的系統調用號也不能被回收利用。14第十四頁,共31頁。對于32位x86架構系統調用號位于arch/x86/include/asm/unistd_32.h15第十五頁,共31頁。4.編譯內核的方法makemrpropermakecleanmakeoldconfigmakeallmakemodules_installmakeinstall命令“makeall”用于生成期望的內核映像及模塊;“makemodules_install”將安裝模塊到“默認目錄/lib/module/<內核版本號>”下面;“makeinstall”最終將內核映像等幾個文件復制到“/boot”目錄,并修改引導程序的配置以啟用該新內核。16第十六頁,共31頁。以上命令執行完畢后,會在當前目錄下生成一個名為System.map的文件,會在/usr/src/linux-版本號/arch/i386/boot/下生成一個bzImage文件和vmlinuz文件。cd/boot(進入/boot目錄)17第十七頁,共31頁。5.修改引導程序GRUBcd/boot/grubvimenu.lst
為了以后能直接操作菜單,可把menu.lst文件中hiddenmenu那一行注釋掉(前加#)或刪除,并且可以根據需要設置其中的default和timeout的值,分別表示默認啟動項及等待時間。18第十八頁,共31頁。#hiddenmenudefault=0timeout=15splashimage=(hd0,0)/grub/splash.xpm.gztitlecentos(2.6.35.13)
root(hd0,0)
kernel/vmlinuz-2.6.35.13roroot=/dev/mapper/vg_wufeifei-lv_root
initrd/initramfs-2.6.35.13.imgtitlecentos(2.6.32-71.el6.i686)
root(hd0,0)
kernel/vmlinuz-2.6.32-71.el6.i686roroot=/dev/mapper/vg_wufeifei-lv_root19第十九頁,共31頁。reboot重啟系統就可以看到GRUB菜單已經包含了新編譯的內核選擇新編譯的內核啟動系統。可用uname–r測試當前內核版本號。任務完成后也可修改/boot/grub/menu.1st文件中移去不需要的引導內核信息20第二十頁,共31頁。測試小例子:在現有的系統中添加一個傳遞數值參數的系統調用。這個系統調用的功能打印傳入內核的參數。主要內容:在系統調用表中添加相應表項添加系統調用號sys_my_sys_call的實現編寫用戶態測試程序21第二十一頁,共31頁。在系統調用表中添加或修改相應表項
在2.6.35.13的內核下,只需要修改arch/x86/kernel/syscall_table_32.S.longsys_rt_tgsigqueueinfo/*335*/.longsys_perf_event_open.longsys_recvmmsg.longsys_my_new_call/*338*/.longsys_pedagogictime/*339*/22第二十二頁,共31頁。添加系統調用號
系統調用號在文件unistd_32.h里面定義這個文件在kernel2.6.35.13位于/arch/x86/include/asm/unistd_32.h。現在我們在unistd.h中添加我們的系統調用號:__NR_my_new_call,如下所示:#define__NR_rt_tgsigqueueinfo 335#define__NR_perf_event_open 336#define__NR_recvmmsg 337#define__NR_my_new_call338#define__NR_pedagogictime33923第二十三頁,共31頁。sys_my_new_call函數實現cd/usr/src/linux-2.6.35.13/kernel添加一個打印輸入值的系統調用visys.c上面在系統調用表中指明了系統調用號_NR_my_new_call對應的系統調用服務例程是sys_my_new_call24第二十四頁,共31頁。重新編譯內核。成功后,重啟。此時,在啟動項中有2.6.32和2.6.35兩個選項,其中新的內核是2.6.35。選擇它并進入系統。至此,我們已經成功添加了一個自己的系統調用。編譯成功之后編寫用戶空間程序進行測試testcall.c
#include<linux/unistd.h>intmain(){syscall(338,50);/*338是新添加的系統調用號,50是參數*/return0;}終端編譯
gcca–otestcall運行
./a查看結果:終端運行命令dmesg會看到在最后一行輸出
callnumberis5025第二十五頁,共31頁。問題A設計并實現一個新的內核函數pedagogictime(),該函數通過使用一個引用參數的調用返回當前的系統時間。如果flag的參數為TRUE,內核就把當前的系統時間打印輸出 intpedagogictime(intflag,structtimeval*tv) 新函數基本和gettimeofday()類似 cd/usr/src/linux2.6.35.13/kernel vitime.c添加實現代碼26第二十六頁,共31頁。#include<linux/time.h>#include<linux/kernel.h>#include<linux/mm.h>asmlinkageintsys_pedagogictime(intflag,structtimeval*tv){ if(tv){ structtimevalktv; do_gettimeofday(&ktv); if(copy_to_user(tv,&ktv,sizeof(ktv)))return-EFAULT;
} if(flag==true) printk("tv.sec:%ld\n",(*tv).tv_sec); return0;}27第二十七頁,共31頁。問題B編寫用戶空間程序來測試pedagogictime()的執行情況#include<linux/time.h>#include<linux/unistd.h>intmain(){structtimevaltv;tv.tv_sec=10;syscall(339,1,&tv);printf(“userfirstgettv_sec\n”,tv.tv_sec);printf(“nowsleep10seconds\n”);sleep(10);printf(“userfirstgettv_sec\n”,tv.tv_sec);return0;}28第二十八頁,共31頁。shell下用dmesg命令觀察內存打印信息最下面兩行即為內核函數輸出29第二十九頁,共31頁。心得、體會全部編譯一次內核會很長,大約3個小時。編過一次內核后,由于
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 病理科醫師崗位面試問題及答案
- 2025屆湖北省宜昌市長陽縣第一高級中學化學高二下期末統考試題含解析
- 浙江省樂清外國語學院2025屆高一化學第二學期期末聯考試題含解析
- 2025屆山東省東平縣第一中學高二下化學期末統考模擬試題含解析
- 甘肅省蘭州市五十一中2025屆高一下化學期末綜合測試試題含解析
- 上海市12校聯考2025屆高二下化學期末復習檢測試題含解析
- 民生項目現場管理辦法
- 材料當天入庫管理辦法
- 北京集體審批管理辦法
- 體系文件稽查管理辦法
- 鐵路營業線安全管理辦法
- 酒類銷售用人勞務合同
- 2025老年教育政策環境分析及教學模式創新路徑研究報告
- 2025年中國伺服電纜行業市場發展前景及發展趨勢與投資戰略研究報告
- 【大數跨境】全球移動電源市場洞察報告
- 酒店安全獎懲規定
- 2024北京四中初一(下)開學考數學試題及答案
- 物料堆放限高管理制度
- 夫妻債務隔離約定協議書
- T/CECS 10226-2022抗裂硅質防水劑
- 原發性醛固酮增多癥診斷治療的專家共識(2024版)解讀課件
評論
0/150
提交評論