




已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
預(yù)備知識 Linux內(nèi)核結(jié)構(gòu) Linux內(nèi)核源碼 Linux系統(tǒng)調(diào)用 實驗指導(dǎo) 系統(tǒng)調(diào)用的添加 Linux內(nèi)核編譯 實驗步驟,linux內(nèi)核系統(tǒng)調(diào)用實驗指導(dǎo)書,線程同步實驗,Linux內(nèi)核結(jié)構(gòu),線程同步實驗,Linux分為用戶空間和內(nèi)核空間兩個層次,Linux內(nèi)核結(jié)構(gòu),線程同步實驗,Linux內(nèi)核的組成 進程調(diào)度(SCHED):控制進程對CPU的訪問 內(nèi)存管理(MM):允許多個進程安全的共享內(nèi)存區(qū)域 虛擬文件系統(tǒng)(VFS):隱藏各種硬件的具體細節(jié),為所有設(shè)備提供統(tǒng)一的接口 網(wǎng)絡(luò)接口(NET):提供對各種網(wǎng)絡(luò)標(biāo)準(zhǔn)的存取和各種網(wǎng)絡(luò)硬件的支持 進程間通訊(IPC):支持進程間各種通信機制,Linux內(nèi)核源碼,線程同步實驗,Linux系統(tǒng)調(diào)用,線程同步實驗,Linux系統(tǒng)調(diào)用機制 Linux內(nèi)核中設(shè)置了一組用于實現(xiàn)各種系統(tǒng)功能的子程序,稱為系統(tǒng)調(diào)用 用戶通過系統(tǒng)調(diào)用命令在自己的應(yīng)用程序中調(diào)用它們 系統(tǒng)調(diào)用與普通函數(shù)調(diào)用的區(qū)別 系統(tǒng)調(diào)用 核心態(tài) 操作系統(tǒng)核心提供 普通的函數(shù)調(diào)用 用戶態(tài) 函數(shù)庫或用戶自己提供,Linux系統(tǒng)調(diào)用,線程同步實驗,為什么有系統(tǒng)調(diào)用? 一般用戶進程不能直接訪問系統(tǒng)內(nèi)核,不能直接使用或修改內(nèi)核數(shù)據(jù),以免干擾內(nèi)核程序的執(zhí)行,妨礙系統(tǒng)安全。 系統(tǒng)調(diào)用是什么? 用戶進程要使用內(nèi)核功能時,只能通過內(nèi)核提供的接口系統(tǒng)調(diào)用來實現(xiàn),系統(tǒng)調(diào)用實際是操作系統(tǒng)內(nèi)核提供的、功能較強的一系列函數(shù)。 系統(tǒng)調(diào)用好比一個中間人,把用戶進程的系統(tǒng)調(diào)用請求傳達給內(nèi)核,待內(nèi)核把請求處理完畢后再將處理結(jié)果送回給用戶空間。 系統(tǒng)調(diào)用是用戶空間訪問內(nèi)核的唯一手段。系統(tǒng)調(diào)用發(fā)生時會從用戶態(tài)轉(zhuǎn)到內(nèi)核態(tài),完成功能后又由內(nèi)核態(tài)轉(zhuǎn)回用戶態(tài),Linux系統(tǒng)調(diào)用,線程同步實驗,使用系統(tǒng)調(diào)用的兩種方式 1、通過C庫函數(shù) 2、使用syscall函數(shù) syscall函數(shù)原型為: int syscall(int number,); 通過指定系統(tǒng)調(diào)用號和一組函數(shù)來調(diào)用系統(tǒng)調(diào)用 * 2.6.19版前使用_syscall宏,Linux系統(tǒng)調(diào)用,線程同步實驗,C庫函數(shù)系統(tǒng)調(diào)用例子,Linux系統(tǒng)調(diào)用,線程同步實驗,系統(tǒng)如何響應(yīng)調(diào)用的? 系統(tǒng)調(diào)用函數(shù)中的int$0x80匯編指令,會產(chǎn)生向量為128的異常。內(nèi)核通過查中斷向量表找到128號異常對應(yīng)的處理程序系統(tǒng)調(diào)用處理程system_call() 如何找到對應(yīng)的內(nèi)核函數(shù)? system_call()利用系統(tǒng)調(diào)用號查系統(tǒng)調(diào)用表sys_call_table,找到對應(yīng)每個系統(tǒng)調(diào)用號的處理函數(shù)。,Linux系統(tǒng)調(diào)用處理流程,線程同步實驗, xyz() ,system_call: sys_xyz() ret_from_sys_call: ,xyz() int 0x80 ,sys_xyz() ,用戶態(tài) 內(nèi)核態(tài),glibc標(biāo)準(zhǔn)庫中的封裝例程 (系統(tǒng)調(diào)用函數(shù) 的具體實現(xiàn)),系統(tǒng)調(diào)用處理程序,系統(tǒng)調(diào)用 服務(wù)例程 (內(nèi)核函數(shù)),在應(yīng)用程序中使用系統(tǒng)調(diào)用,系統(tǒng)調(diào)用的添加,線程同步實驗,(1)完成系統(tǒng)調(diào)用函數(shù) 編寫待添加的系統(tǒng)調(diào)用函數(shù),函數(shù)名以sys_開頭。 系統(tǒng)調(diào)用服務(wù)例程的名字均遵守一定的規(guī)則:系統(tǒng)調(diào)用名稱前增加“sys_”前綴,比如open系統(tǒng)調(diào)用對應(yīng)sys_open函數(shù) 如:mycall(int num),在/usr/src/linux/kernel/sys.c文件中添加代碼: asmlinkage int sys_mycall(int number) return number; /僅返回一個整型值 ,系統(tǒng)調(diào)用的添加,線程同步實驗,(2)在系統(tǒng)調(diào)用表中添加表項 讓內(nèi)核的其余部分知道該系統(tǒng)調(diào)用的存在。 系統(tǒng)調(diào)用表sys_call_table存儲了所有系統(tǒng)調(diào)用對應(yīng)的服務(wù)例程的函數(shù)地址。 對于X86 32位體系結(jié)構(gòu)的系統(tǒng)調(diào)用表位于arch/X86/kernel/syscall_table_32.S文件中定義。 第n個表項對應(yīng)了系統(tǒng)調(diào)用號為n的服務(wù)例程的入口地址的指針,如:/usr/src/linux/arch/x86/kernel/syscall_table_32.S的最后一行增加新的系統(tǒng)調(diào)用內(nèi)核函數(shù)指針。 .long sys_mycall,系統(tǒng)調(diào)用的添加,線程同步實驗,(3)添加系統(tǒng)調(diào)用號 /arch/x86/include/asm/unistd_32.h 每個系統(tǒng)調(diào)用號都是唯一的,依次對應(yīng)sys_call_table中的一項,系統(tǒng)調(diào)用號寫在unistd.h文件中,以“_NR_”開頭。 內(nèi)核通過系統(tǒng)調(diào)用號作為下標(biāo)去獲取sys_call_table中的服務(wù)例程函數(shù)地址。 系統(tǒng)調(diào)用號一旦分配就不能再有任何變更,系統(tǒng)運行中即使該系統(tǒng)調(diào)用被刪除,它所擁有的系統(tǒng)調(diào)用號也不能被回收利用。,系統(tǒng)調(diào)用的添加,線程同步實驗,如: 在/arch/x86/include/asm/unistd_32.h 里的 #define _NR_recvmmsg 337 行下添加: #define _NR_mycall 338 這里系統(tǒng)調(diào)用號為338,是因為Linux-2.6內(nèi)核自身的系統(tǒng)調(diào)用號碼已經(jīng)用到337,新添加的系統(tǒng)調(diào)用號不能與前面已有的重復(fù)。,系統(tǒng)調(diào)用的添加,線程同步實驗,(4)編寫系統(tǒng)調(diào)用的測試代碼 通過調(diào)用syscall函數(shù)調(diào)用添加的系統(tǒng)調(diào)用。 如:mycall系統(tǒng)調(diào)用的系統(tǒng)調(diào)用號為338,則調(diào)用mycall的方式為 syscall(338, argu); argu為mycall的參數(shù)。,系統(tǒng)調(diào)用的添加,線程同步實驗,(1)下載內(nèi)核 到下載新內(nèi)核 解壓到/usr/src/kernels目錄下 (2)清除內(nèi)核及之前編譯的內(nèi)容 make clean /清除原有不需要的模塊和文件 make mrproper /刪除原來編譯產(chǎn)生的垃圾 (3)配置內(nèi)核 make oldconfig / 與當(dāng)前配置相同 make config / 基于文本的、最為傳統(tǒng)的配置界面 make menuconfig / 基于文本菜單形式,字符終端下使用 make xconfig / 基于圖形窗口模式,Xwindow下使用,Linux內(nèi)核編譯,Concurrency(并發(fā)性),(4)編譯內(nèi)核 make 或make zImage /編譯內(nèi)核, make zImage編譯壓縮 /形式的大內(nèi)核 make modules /編譯選擇的模塊 make modules_install /編譯后的模塊移到系統(tǒng)標(biāo)準(zhǔn)位置 make install /把壓縮內(nèi)核映象拷貝到/boot目 /錄下, 創(chuàng)建System.map符號鏈接 (5)啟動項配置 mkinitramfs o /boot/initrd.img- /創(chuàng)建內(nèi)核的initrd映象 在/boot/grub/grub.cfg中設(shè)置啟動項的配置,Linux內(nèi)核編譯,線程同步實驗,實驗環(huán)境 系統(tǒng)版本:CentOS 5.5 內(nèi)核版本:2.6.18-194.el5 欲編譯內(nèi)核:3 命令uname -r 查看當(dāng)前系統(tǒng)的內(nèi)核版本,實驗步驟,線程同步實驗,實驗?zāi)康模?(1)添加新的系統(tǒng)調(diào)用pedagogictime,該函數(shù)通過使用一個引用參數(shù)的調(diào)用返回當(dāng)前的系統(tǒng)時間。 (2)編寫一個用戶空間程序來測試pedagogictime,實驗步驟,線程同步實驗,rootlocalhost # cd /usr/src/kernels/linux-3 /切換到預(yù)編譯內(nèi)核目錄 rootlocalhost linux-3# vi kernel/sys.c /用vi編輯器打開sys.c文件添加系統(tǒng)調(diào)用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)調(diào)用表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)調(diào)用號 #define _NR_pedagogictime 338,實驗步驟,線程同步實驗,rootlocalhost linux-3# make mrproper /刪除原來編譯產(chǎn)生的垃圾 rootlocalhost linux-3# cp /boot/config-2.6.18-194.el5 .config /導(dǎo)入原系統(tǒng)的內(nèi)核配置 rootlocalhost linux-3# make menuconfig / Load an Alternate Configuration File - 導(dǎo)入.config文件 - Save an Alternate Configuration File - Exit /導(dǎo)入配置到欲編譯內(nèi)核中 rootlocalhost linux-3# vi .config /修改配置, 修改如下: # CONFIG_SYSFS_DEPRECATED_V2 is not set 修改為: CONFIG_SYSFS_DEPRECATED_V2 = y,實驗步驟,線程同步實驗,rootlocalhost linux-3# make all /編譯內(nèi)核 rootlocalhost linux-3# make modules /編譯模塊 rootlocalhost linux-3# make modules_install /添加模塊到內(nèi)核 rootlocalhost linux-3# make install /鏈接、組建內(nèi)核,實驗步驟,線程同步實驗,rootlocalhost linux-3# cp /boot/initrd-3.img /tmp /把剛編譯生成的內(nèi)核拷貝到/tmp文件夾下,用作修改其中配置和重新打包內(nèi)核 rootlocalhost linux-3# mv /boot/initrd-3.img /boot/initrd-3.img.bak /修改剛編譯生成的內(nèi)核的文件名為initrd-3.img.bak,用作備份 rootlocalhost linux-3# cd /tmp /切換至/tmp文件夾 rootlocalhost tmp# mkdir newinitrd /新建newinitrd文件夾,用作把剛編譯的內(nèi)核解壓到該文件夾下 rootlocalhost tmp# cd newinitrd /切換至newinitrd文件夾,實驗步驟,線程同步實驗,rootlocalhost newinitrd# zcat /initrd-3.img |cpio -i /解壓內(nèi)核 rootlocalhost newinitrd# vi init /修改啟動初始化配置文件 /配置文件中有重復(fù)的配置,去掉其中一個即可 echo “Loading dm-region-hash.ko module“ insmod /lib/dm-region-hash.ko,實驗步驟,線程同步實驗,rootlocalhost newinitrd# find .|cpio -c -o /initrd /打包修改配置后的所有內(nèi)核文件 rootlocalhost newinitrd# cd /切換到/tmp文件夾 rootlocalhost tmp# gzip -9 initrd-3.img /壓縮打包文件,構(gòu)建內(nèi)核包 rootlocalhost tmp# cp initrd-3.img /boot/ /把新建的內(nèi)核包復(fù)制到文件夾/boot,到此內(nèi)核編譯、打包、修改、構(gòu)建完成 rootlocalhost tmp# reboot /重啟系統(tǒng),驗證新編譯的內(nèi)核,實驗步驟,線程同步實驗,rootlocalhost # mkdir source /系統(tǒng)重啟后,創(chuàng)建source文件夾,用于存放編寫的用戶空間程序 rootlocalhost # cd source/ /切換到source目錄 rootlocalhost source# vi test.c /新建用于測試pedagogictime系統(tǒng)調(diào)用的用戶空間程序文
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工廠安裝拆除方案(3篇)
- 混凝土防水維修方案(3篇)
- 橋下渠道施工方案(3篇)
- 建筑耗材定價方案(3篇)
- 飯?zhí)冒踩脑旆桨?3篇)
- 情期間窗戶修理方案(3篇)
- 傳統(tǒng)別墅改造方案(3篇)
- 淤泥河道改造方案(3篇)
- 外企郵件采購方案(3篇)
- 城市公園道路雨季施工方案及措施
- 大模型備案-落實算法安全主體責(zé)任基本情況-XX集團有限公司
- 護理禮儀與人際溝通試題(含答案)
- 2025-2030中國蔬菜溫室大棚市場消費趨勢分析與經(jīng)營管理風(fēng)險報告
- 學(xué)校外來人員登記制度
- 應(yīng)急物資中轉(zhuǎn)站項目可行性研究報告(模板范文)
- 2025年初級等保測評試題及答案
- 薄壁空心墩施工方案
- 多重耐藥菌醫(yī)院感染預(yù)防與控制技術(shù)指南(試行)
- 教師如何使用AI開展教學(xué)DeepSeek使用指南人工智能 課件
- 油氣田地面工程詳解
- 地面注漿施工方案
評論
0/150
提交評論