




已閱讀5頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
預(yù)備知識(shí) Linux內(nèi)核結(jié)構(gòu) Linux內(nèi)核源碼 Linux系統(tǒng)調(diào)用 實(shí)驗(yàn)指導(dǎo) 系統(tǒng)調(diào)用的添加 Linux內(nèi)核編譯 實(shí)驗(yàn)步驟,linux內(nèi)核系統(tǒng)調(diào)用實(shí)驗(yàn)指導(dǎo)書,線程同步實(shí)驗(yàn),Linux內(nèi)核結(jié)構(gòu),線程同步實(shí)驗(yàn),Linux分為用戶空間和內(nèi)核空間兩個(gè)層次,Linux內(nèi)核結(jié)構(gòu),線程同步實(shí)驗(yàn),Linux內(nèi)核的組成 進(jìn)程調(diào)度(SCHED):控制進(jìn)程對(duì)CPU的訪問(wèn) 內(nèi)存管理(MM):允許多個(gè)進(jìn)程安全的共享內(nèi)存區(qū)域 虛擬文件系統(tǒng)(VFS):隱藏各種硬件的具體細(xì)節(jié),為所有設(shè)備提供統(tǒng)一的接口 網(wǎng)絡(luò)接口(NET):提供對(duì)各種網(wǎng)絡(luò)標(biāo)準(zhǔn)的存取和各種網(wǎng)絡(luò)硬件的支持 進(jìn)程間通訊(IPC):支持進(jìn)程間各種通信機(jī)制,Linux內(nèi)核源碼,線程同步實(shí)驗(yàn),Linux系統(tǒng)調(diào)用,線程同步實(shí)驗(yàn),Linux系統(tǒng)調(diào)用機(jī)制 Linux內(nèi)核中設(shè)置了一組用于實(shí)現(xiàn)各種系統(tǒng)功能的子程序,稱為系統(tǒng)調(diào)用 用戶通過(guò)系統(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ù)庫(kù)或用戶自己提供,Linux系統(tǒng)調(diào)用,線程同步實(shí)驗(yàn),為什么有系統(tǒng)調(diào)用? 一般用戶進(jìn)程不能直接訪問(wèn)系統(tǒng)內(nèi)核,不能直接使用或修改內(nèi)核數(shù)據(jù),以免干擾內(nèi)核程序的執(zhí)行,妨礙系統(tǒng)安全。 系統(tǒng)調(diào)用是什么? 用戶進(jìn)程要使用內(nèi)核功能時(shí),只能通過(guò)內(nèi)核提供的接口系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn),系統(tǒng)調(diào)用實(shí)際是操作系統(tǒng)內(nèi)核提供的、功能較強(qiáng)的一系列函數(shù)。 系統(tǒng)調(diào)用好比一個(gè)中間人,把用戶進(jìn)程的系統(tǒng)調(diào)用請(qǐng)求傳達(dá)給內(nèi)核,待內(nèi)核把請(qǐng)求處理完畢后再將處理結(jié)果送回給用戶空間。 系統(tǒng)調(diào)用是用戶空間訪問(wèn)內(nèi)核的唯一手段。系統(tǒng)調(diào)用發(fā)生時(shí)會(huì)從用戶態(tài)轉(zhuǎn)到內(nèi)核態(tài),完成功能后又由內(nèi)核態(tài)轉(zhuǎn)回用戶態(tài),Linux系統(tǒng)調(diào)用,線程同步實(shí)驗(yàn),使用系統(tǒng)調(diào)用的兩種方式 1、通過(guò)C庫(kù)函數(shù) 2、使用syscall函數(shù) syscall函數(shù)原型為: int syscall(int number,); 通過(guò)指定系統(tǒng)調(diào)用號(hào)和一組函數(shù)來(lái)調(diào)用系統(tǒng)調(diào)用 * 2.6.19版前使用_syscall宏,Linux系統(tǒng)調(diào)用,線程同步實(shí)驗(yàn),C庫(kù)函數(shù)系統(tǒng)調(diào)用例子,Linux系統(tǒng)調(diào)用,線程同步實(shí)驗(yàn),系統(tǒng)如何響應(yīng)調(diào)用的? 系統(tǒng)調(diào)用函數(shù)中的int$0x80匯編指令,會(huì)產(chǎn)生向量為128的異常。內(nèi)核通過(guò)查中斷向量表找到128號(hào)異常對(duì)應(yīng)的處理程序系統(tǒng)調(diào)用處理程system_call() 如何找到對(duì)應(yīng)的內(nèi)核函數(shù)? system_call()利用系統(tǒng)調(diào)用號(hào)查系統(tǒng)調(diào)用表sys_call_table,找到對(duì)應(yīng)每個(gè)系統(tǒng)調(diào)用號(hào)的處理函數(shù)。,Linux系統(tǒng)調(diào)用處理流程,線程同步實(shí)驗(yàn), 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)庫(kù)中的封裝例程 (系統(tǒng)調(diào)用函數(shù) 的具體實(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)用的添加,線程同步實(shí)驗(yàn),(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)用對(duì)應(yīng)sys_open函數(shù) 如:mycall(int num),在/usr/src/linux/kernel/sys.c文件中添加代碼: asmlinkage int sys_mycall(int number) return number; /僅返回一個(gè)整型值 ,系統(tǒng)調(diào)用的添加,線程同步實(shí)驗(yàn),(2)在系統(tǒng)調(diào)用表中添加表項(xiàng) 讓內(nèi)核的其余部分知道該系統(tǒng)調(diào)用的存在。 系統(tǒng)調(diào)用表sys_call_table存儲(chǔ)了所有系統(tǒng)調(diào)用對(duì)應(yīng)的服務(wù)例程的函數(shù)地址。 對(duì)于X86 32位體系結(jié)構(gòu)的系統(tǒng)調(diào)用表位于arch/X86/kernel/syscall_table_32.S文件中定義。 第n個(gè)表項(xiàng)對(duì)應(yīng)了系統(tǒng)調(diào)用號(hà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)用的添加,線程同步實(shí)驗(yàn),(3)添加系統(tǒng)調(diào)用號(hào) /arch/x86/include/asm/unistd_32.h 每個(gè)系統(tǒng)調(diào)用號(hào)都是唯一的,依次對(duì)應(yīng)sys_call_table中的一項(xiàng),系統(tǒng)調(diào)用號(hào)寫在unistd.h文件中,以“_NR_”開頭。 內(nèi)核通過(guò)系統(tǒng)調(diào)用號(hào)作為下標(biāo)去獲取sys_call_table中的服務(wù)例程函數(shù)地址。 系統(tǒng)調(diào)用號(hào)一旦分配就不能再有任何變更,系統(tǒng)運(yùn)行中即使該系統(tǒng)調(diào)用被刪除,它所擁有的系統(tǒng)調(diào)用號(hào)也不能被回收利用。,系統(tǒng)調(diào)用的添加,線程同步實(shí)驗(yàn),如: 在/arch/x86/include/asm/unistd_32.h 里的 #define _NR_recvmmsg 337 行下添加: #define _NR_mycall 338 這里系統(tǒng)調(diào)用號(hào)為338,是因?yàn)長(zhǎng)inux-2.6內(nèi)核自身的系統(tǒng)調(diào)用號(hào)碼已經(jīng)用到337,新添加的系統(tǒng)調(diào)用號(hào)不能與前面已有的重復(fù)。,系統(tǒng)調(diào)用的添加,線程同步實(shí)驗(yàn),(4)編寫系統(tǒng)調(diào)用的測(cè)試代碼 通過(guò)調(diào)用syscall函數(shù)調(diào)用添加的系統(tǒng)調(diào)用。 如:mycall系統(tǒng)調(diào)用的系統(tǒng)調(diào)用號(hào)為338,則調(diào)用mycall的方式為 syscall(338, argu); argu為mycall的參數(shù)。,系統(tǒng)調(diào)用的添加,線程同步實(shí)驗(yàn),(1)下載內(nèi)核 到下載新內(nèi)核 解壓到/usr/src/kernels目錄下 (2)清除內(nèi)核及之前編譯的內(nèi)容 make clean /清除原有不需要的模塊和文件 make mrproper /刪除原來(lái)編譯產(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符號(hào)鏈接 (5)啟動(dòng)項(xiàng)配置 mkinitramfs o /boot/initrd.img- /創(chuàng)建內(nèi)核的initrd映象 在/boot/grub/grub.cfg中設(shè)置啟動(dòng)項(xiàng)的配置,Linux內(nèi)核編譯,線程同步實(shí)驗(yàn),實(shí)驗(yàn)環(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)核版本,實(shí)驗(yàn)步驟,線程同步實(shí)驗(yàn),實(shí)驗(yàn)?zāi)康模?(1)添加新的系統(tǒng)調(diào)用pedagogictime,該函數(shù)通過(guò)使用一個(gè)引用參數(shù)的調(diào)用返回當(dāng)前的系統(tǒng)時(shí)間。 (2)編寫一個(gè)用戶空間程序來(lái)測(cè)試pedagogictime,實(shí)驗(yàn)步驟,線程同步實(shí)驗(yàn),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( ,實(shí)驗(yàn)步驟,線程同步實(shí)驗(yàn),實(shí)驗(yàn)步驟,線程同步實(shí)驗(yàn),rootlocalhost linux-3# vi arch/x86/kernel/syscall_table_32.S /編輯系統(tǒng)調(diào)用表syscall_table_32.S, 添加pedagogictime .long sys_pedagogictime /* 338 */,實(shí)驗(yàn)步驟,線程同步實(shí)驗(yàn),rootlocalhost linux-3# vi arch/x86/include/asm/unistd_32.h /編輯unistd_32.h,添加pedagogictime的系統(tǒng)調(diào)用號(hào) #define _NR_pedagogictime 338,實(shí)驗(yàn)步驟,線程同步實(shí)驗(yàn),rootlocalhost linux-3# make mrproper /刪除原來(lái)編譯產(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,實(shí)驗(yàn)步驟,線程同步實(shí)驗(yàn),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)核,實(shí)驗(yàn)步驟,線程同步實(shí)驗(yàn),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文件夾,實(shí)驗(yàn)步驟,線程同步實(shí)驗(yàn),rootlocalhost newinitrd# zcat /initrd-3.img |cpio -i /解壓內(nèi)核 rootlocalhost newinitrd# vi init /修改啟動(dòng)初始化配置文件 /配置文件中有重復(fù)的配置,去掉其中一個(gè)即可 echo “Loading dm-region-hash.ko module“ insmod /lib/dm-region-hash.ko,實(shí)驗(yàn)步驟,線程同步實(shí)驗(yàn),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),驗(yàn)證新編譯的內(nèi)核,實(shí)驗(yàn)步驟,線程同步實(shí)驗(yàn),rootlocalhost # mkdir source /系統(tǒng)重啟后,創(chuàng)建source文件夾,用于存放編寫的用戶空間程序 rootlocalhost # cd source/ /切換到source目錄 rootlocalhost source# vi test.c /新建用于測(cè)試pedagogictime系統(tǒng)調(diào)用的用戶空間程序文
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 線下演出市場(chǎng)復(fù)蘇中的藝人個(gè)人品牌塑造與傳播報(bào)告001
- 探索2025年開放銀行生態(tài)構(gòu)建中的金融科技與金融科技企業(yè)可持續(xù)發(fā)展研究報(bào)告
- 新藥研發(fā)新方向2025:靶點(diǎn)發(fā)現(xiàn)與驗(yàn)證技術(shù)實(shí)戰(zhàn)解析
- 2025年天然植物精油護(hù)膚品牌市場(chǎng)拓展與品牌合作案例報(bào)告001
- 汽車行業(yè)供應(yīng)鏈金融風(fēng)險(xiǎn)防范與優(yōu)化:2025年風(fēng)險(xiǎn)防范策略案例報(bào)告001
- 2025年醫(yī)藥行業(yè)研發(fā)外包(CRO)模式下的質(zhì)量控制與持續(xù)改進(jìn)報(bào)告
- 2025年醫(yī)藥行業(yè)CRO模式下的臨床試驗(yàn)數(shù)據(jù)管理與分析報(bào)告
- 城市商業(yè)綜合體智能化系統(tǒng)設(shè)計(jì)與智慧家居評(píng)估報(bào)告
- 2025年醫(yī)藥企業(yè)研發(fā)外包(CRO)模式藥物研發(fā)醫(yī)療器械研發(fā)與注冊(cè)報(bào)告
- 2025年體檢行業(yè)市場(chǎng)前景展望與服務(wù)質(zhì)量提升策略報(bào)告001
- 多重耐藥菌醫(yī)院感染預(yù)防與控制技術(shù)指南(試行)
- 教師如何使用AI開展教學(xué)DeepSeek使用指南人工智能 課件
- 油氣田地面工程詳解
- 地面注漿施工方案
- 《股骨粗隆間骨折》課件
- 深圳“20+8”之生物醫(yī)藥產(chǎn)業(yè)-前景機(jī)遇與技術(shù)趨勢(shì)探析報(bào)告-前瞻產(chǎn)業(yè)研究院
- 天然氣計(jì)量與標(biāo)準(zhǔn)化-洞察分析
- 2025年江蘇省安全員《A證》考試題庫(kù)及答案
- 真需求-打開商業(yè)世界的萬(wàn)能鑰匙
- 特應(yīng)性皮炎的健康宣教
- 城市公園生態(tài)效益最大化策略
評(píng)論
0/150
提交評(píng)論