Linux內(nèi)核分析與高級(jí)編程_第1頁(yè)
Linux內(nèi)核分析與高級(jí)編程_第2頁(yè)
Linux內(nèi)核分析與高級(jí)編程_第3頁(yè)
Linux內(nèi)核分析與高級(jí)編程_第4頁(yè)
Linux內(nèi)核分析與高級(jí)編程_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Linux內(nèi)核分析與高級(jí)編程演示文稿目前一頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)Linux內(nèi)核分析與高級(jí)編程目前二頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)建立WindowsVMLinux文件共享的步驟:(1)在Windows下建立共享文件夾(2)進(jìn)入VMWare,點(diǎn)擊CommandsEditVirtuvalMachineSettingsOptionsSharedFoldersEnabledAdd…

在向?qū)б龑?dǎo)下分別指定Linux下和Windows下的文件夾名(3)進(jìn)入Linux,執(zhí)行命令進(jìn)入目錄

cd/mnt/hgfs

即可存取Windows下共享文件夾的所有文件

目前三頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)內(nèi)存管理虛擬文件系統(tǒng)進(jìn)程調(diào)度網(wǎng)絡(luò)接口進(jìn)程間通信Linux內(nèi)核的抽象結(jié)構(gòu)網(wǎng)絡(luò)文件傳送VFSSCHEDNET調(diào)度\交換進(jìn)程IPC存取共享內(nèi)存裝入數(shù)據(jù)和程序虛存交換MM目前四頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)用戶應(yīng)用程序系統(tǒng)庫(kù)(如標(biāo)準(zhǔn)C庫(kù))系統(tǒng)調(diào)用接口硬件用戶態(tài)進(jìn)程請(qǐng)求與內(nèi)核的接口

模塊(動(dòng)態(tài)鏈接)I/O進(jìn)程控制(調(diào)度\通信內(nèi)存管理)內(nèi)核目前五頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)/usr/srclinuxdocumentationscriptsnetmodulesmmlibkernelipcinitincludearchi386…alphakernelmmlib…driversblockcharfsext2fatproc…源代碼目錄樹結(jié)構(gòu)目前六頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)/procdriverfsideirqnetsyssysvipctty有關(guān)進(jìn)程的子目錄(十進(jìn)制數(shù)目錄)虛擬文件系統(tǒng)/PROC目錄結(jié)構(gòu)目前七頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)一個(gè)簡(jiǎn)單的系統(tǒng)監(jiān)測(cè)工具的實(shí)現(xiàn)命令行形式:sysinfo[-h][-i][-linterval]

選項(xiàng):-h——顯示命令用法

-i——顯示系統(tǒng)靜態(tài)信息,包括:內(nèi)核版本信息,主機(jī)名,內(nèi)核版本號(hào),操作系統(tǒng)類型,CPU類型和主頻,內(nèi)存信息

-l間隔時(shí)間——按指定間隔時(shí)間刷新顯示CPU占用率,包括:用戶態(tài)、核心態(tài)和空閑態(tài)占用CPU時(shí)間百分比。main()顯示幫助信息顯示系統(tǒng)靜態(tài)信息cpuinfo()顯示系統(tǒng)動(dòng)態(tài)信息loadinfo()-h-i-l目前八頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)cpuinfo()獲取系統(tǒng)日期及時(shí)間顯示報(bào)告系統(tǒng)靜態(tài)信息的時(shí)間和日期依次打開/proc下的相關(guān)文件提取系統(tǒng)信息字符串并顯示顯示系統(tǒng)靜態(tài)信息/proc/version/proc/sys/kernel/hostname/proc/sys/kernel/osrelease/proc/sys/kernel/ostype/proc/cpuinfo/proc/meminfo目前九頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)loadinfo()執(zhí)行procinfo命令產(chǎn)生系統(tǒng)信息文件info提取文件info中的cpu使用情況信息格式化輸出cpu使用情況信息休眠(由刷新參數(shù)指定休眠時(shí)間)顯示系統(tǒng)動(dòng)態(tài)信息目前十頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)運(yùn)行態(tài)停止態(tài)等待態(tài)就緒態(tài)僵死態(tài)進(jìn)程狀態(tài)轉(zhuǎn)換關(guān)系示意圖跟蹤結(jié)束創(chuàng)建進(jìn)程、分配資源調(diào)度回收資源進(jìn)程消亡等待事件睡眠時(shí)間片耗盡跟蹤事件喚醒exit目前十一頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)fork()創(chuàng)建新進(jìn)程后,將并發(fā)執(zhí)行兩個(gè)進(jìn)程:intmain(void){pid_tpid;…if((pid=fork())==0)//條件不成立

{…}else{

父進(jìn)程執(zhí)行的分支

}…intmain(void){pid_tpid;…if((pid=fork())==0)//條件成立

{

子進(jìn)程執(zhí)行的分支

}else{…}…父進(jìn)程代碼子進(jìn)程代碼目前十二頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)子進(jìn)程生命周期示意圖fork()exit()等待態(tài)終止信號(hào)和狀態(tài)父進(jìn)程子進(jìn)程wait()恢復(fù)執(zhí)行目前十三頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)shell系統(tǒng)調(diào)用

內(nèi)核硬件Shell與內(nèi)核的層次關(guān)系

Shell:接收、解釋、執(zhí)行用戶命令。

系統(tǒng)調(diào)用:為用戶態(tài)進(jìn)程提供內(nèi)核功能接口。

內(nèi)核:對(duì)硬件進(jìn)行抽象和管理,提供服務(wù)。用戶目前十四頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)gettyttyAlogingettylogingettyloginttyBttyX登錄登錄登錄/etc/passwdLinux系統(tǒng)yesyesyes登錄過程………目前十五頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)目前十六頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)模擬SHELL的執(zhí)行流程目前十七頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)例:輸入重定向的基本實(shí)現(xiàn)方法。

char*filename=“data.txt”;

intfid;

/*打開指定文件“data.txt”

,獲取該文件描述符*/

fid=open(filename,O_RDONLY,o600);

/*用指定文件的描述符替換標(biāo)準(zhǔn)輸入設(shè)備文件描述符*/

if(dup2(fid,STDIN_FILENO)==-1){

printf("RedirectStandardInError\n");

return-1;}…目前十八頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)例:父子進(jìn)程通過管道進(jìn)行通信。intfd[2];

…pipe(fd)/*建立管道pipe*/if(fork()==0){…read(fd[0],childbuf,len);/*從管道讀父進(jìn)程寫的信息*/…}else{…write(fd[1],msgbuf,len);/*將信息寫入管道傳給子進(jìn)程*/…}目前十九頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)例:管道命令“l(fā)s|more”的基本實(shí)現(xiàn)方法。intfd[2];

…pipe(fd)/*建立管道pipe*/

if((child1=fork())==0){if(fd[1]!=STDOUT_FILENO){if(dup2(fd[1],STDOUT_FILENO)==-1){/*輸出重定向到管道寫端*/printf("RedirectStandardOutError\n");return-1;}}execv(buffer,argv[0]);}…if((child2=fork())==0){if(fd[0]!=STDIN_FILENO){if(dup2(fd[0],STDIN_FILENO)==-1){/*輸入重定向到管道讀端*/printf("RedirectStandardInError\n");return-1;}}execv(buffer,argv[1]);}…目前二十頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)#!/bin/bashforiin2526272829303132333437383940414344doechoKillingprocessesfromgpp$i/usr/bin/rsh-ngpp$irm-f/home/test/mpida*killalltmpi3ddone例:在運(yùn)行并行程序的若干節(jié)點(diǎn)上刪除臨時(shí)文件和進(jìn)程。目前二十一頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)#!/bin/bashcounter=1whilereadlinedoif[${line:0:1}!='#'];thenecho"$counter:$line"counter=$[counter+1]fidone<$1例:讀文本文件并加行號(hào)后顯示。目前二十二頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)//例3工作目錄文件備份程序(shell腳本文件)#!/bin/bashcurr_dir=`pwd`listing=`ls`echo"Copyfor$curr_dir"forfilein$listingdoecho"$file"doneforfilenamein`ls`doecho“Copy$filename…"cp$filenameback/$filenameif[$?-ne0];thenecho"copy$filenamefailed"fidone目前二十三頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)//例4多文件查找與替換操作usage(){echo\"changstrOLDstrNEWstr<filenames>changesthefirstinstanceofOLDstrtoNEWstrineachlineof<filenames>,andreportonthedifferences.Examples:changstrTxTexas./addresses.*changstrasps*.c"exit0}case$1in-h|-help)usage;;esaciftest$#-lt3thenusagefi

目前二十四頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)TMPDIR=/tmpTMPFILE=$TMPDIR/changstr.$$OLDstr=$1NEWstr=$2shift2forFILEin$*dosed-e"s/$OLDstr/$NEWstr/"$FILE>$TMPFILEecho"$FILE:"diff$FILE$TMPFILEecho""mv$TMPFILE$FILEdone目前二十五頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)//例5終端鎖屏程序(shell腳本文件)stty-echowhiletest-z"$code"doecho-n"Enterpassword:"readcode</dev/ttydone

trap""23clearecho"**********************************************************"echo"**"echo"**"echo"*TERMINALSECURED!!*"echo"**"echo"**"echo"**************************************************"echo"“目前二十六頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)i=1match=""whiletest"$match"!="$code"dosleep$iecho-n"Enterpassword:"readmatch</dev/ttyi=`expr$i'*'2`doneechosttyecho目前二十七頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)用戶程序內(nèi)核代碼模式切換用戶空間核心空間用戶棧核心棧(進(jìn)行有關(guān)運(yùn)行級(jí)檢查)門用戶模式核心模式目前二十八頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)邏輯地址線性地址物理地址段機(jī)制頁(yè)機(jī)制兩級(jí)地址轉(zhuǎn)換機(jī)制虛擬地址實(shí)際地址虛擬系統(tǒng)空間1G進(jìn)程1虛存用戶空間3G……進(jìn)程2虛存用戶空間3G進(jìn)程n虛存用戶空間3G進(jìn)程虛擬地址空間:4G0XFFFFFFFF0XC00000000XBFFFFFFF0X00000000系統(tǒng)空間用戶空間目前二十九頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)邏輯地址轉(zhuǎn)換為線性地址邏輯地址結(jié)構(gòu)段寄存器OFFSET:16位選擇子32位偏移地址OFFSET索引TIRPL:153203108字節(jié)段描述符GDT全局描述符表┋+線性地址GDTR段內(nèi)偏移地址段基址TI=0目前三十頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)線性地址轉(zhuǎn)換為物理地址線性地址結(jié)構(gòu)頁(yè)目錄索引頁(yè)表索引頁(yè)內(nèi)偏移量頁(yè)目錄項(xiàng)┋頁(yè)表項(xiàng)┋

(1024項(xiàng))(1024項(xiàng))物理頁(yè)幀內(nèi)存頁(yè)內(nèi)偏移

頁(yè)幀號(hào)CR3頁(yè)目錄表頁(yè)表31222112110物理地址目前三十一頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)頁(yè)表項(xiàng)

3101211其它控制位禁止緩存位訪問位保護(hù)位修改位存在位1=只讀0=讀寫頁(yè)內(nèi)編移量查表最終得到頁(yè)幀號(hào)+

頁(yè)幀號(hào)頁(yè)內(nèi)偏移量頁(yè)幀號(hào)1=存在0=不存在物理地址送地址線MMU在頁(yè)表的支持下完成地址映射和虛實(shí)轉(zhuǎn)換線性地址32位10位10位12位目前三十二頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)0111010虛存空間頁(yè)存在位2013……虛擬空間頁(yè)……0-4k5-8k9-12k13-16k17-20k21-24k61-64k64k虛存1237頁(yè)幀0頁(yè)幀32k物理內(nèi)存0-4k9-12k13-16k29-32k某時(shí)刻的虛實(shí)映射5-8k…虛實(shí)地址映射0頁(yè)面123456…15目前三十三頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)入口地址高16位DDPLODXXX00087650段選擇碼入口地址低16位中斷門、陷入門及調(diào)用門的基本格式定義31031目前三十四頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)用戶進(jìn)程調(diào)用系統(tǒng)調(diào)用getuid()執(zhí)行宏調(diào)用_syscall0(int,getuid)即:調(diào)用getuid()產(chǎn)生陷入異常(模式切換到進(jìn)入內(nèi)核)traps.c內(nèi)核初始化時(shí)trap_init()建立了調(diào)用門執(zhí)行系統(tǒng)調(diào)用處理函數(shù)system_call()保護(hù)現(xiàn)場(chǎng),由系統(tǒng)調(diào)用號(hào)(24)查系統(tǒng)調(diào)用表(sys_call_table)找到該系統(tǒng)調(diào)用的內(nèi)核處理函數(shù)(sys_getuid16())調(diào)用sys_getuid16()返回uid,uid→eax,并壓入堆棧執(zhí)行ret_from_sys_call()恢復(fù)現(xiàn)場(chǎng),并從堆棧獲得(uid)→eaxeax→__res,uid返回給用戶程序系統(tǒng)調(diào)用結(jié)束將系統(tǒng)調(diào)用號(hào)(__NR_getuid=(24))送(eax),并執(zhí)行int$0x80unistd.hentry.Sgetuid()函數(shù)中的return__res目前三十五頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)intmain(){intuid;

┆uid=getuid();

┆printf(“┄”);}intgetuid(void){long_

_res;

movl調(diào)用號(hào),%eaxint$0x80;movl%eax,__res┆return__res;}ENTRY(system_call)pushl%eaxSAVE_ALL

┆callsys_getuid16(void)

┆RESTORE_ALL

asmlinkagelong\sys_getuid16(void){return用戶UID;}用戶程序標(biāo)準(zhǔn)C庫(kù)(系統(tǒng)調(diào)用)系統(tǒng)調(diào)用處理函數(shù)內(nèi)核處理函數(shù)系統(tǒng)調(diào)用實(shí)現(xiàn)中各程序間的關(guān)系示意圖目前三十六頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)10讀鎖SN_READ

寫鎖SN_WRITE

01信號(hào)量數(shù)組(初始狀態(tài))使用信號(hào)量(semaphore)實(shí)現(xiàn)讀進(jìn)程\寫進(jìn)程互斥訪問共享內(nèi)存的方法:10(-1)LOCK讀鎖

寫進(jìn)程獲取IPC資源00寫共享內(nèi)存(+1)UNLOCK寫鎖

釋放IPC資源0

101(-1)LOCK寫鎖

讀進(jìn)程獲取IPC資源0

0讀共享內(nèi)存(+1)UNLOCK讀鎖

釋放IPC資源10讀進(jìn)程、寫進(jìn)程互斥訪問共享內(nèi)存的流程:目前三十七頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)寫進(jìn)程進(jìn)入臨界區(qū)寫數(shù)據(jù)先寫滿管道可用空間喚醒等待的讀進(jìn)程管道空間>=所需空間?N退出臨界區(qū)喚醒讀進(jìn)程寫數(shù)據(jù)量很大?YYY阻塞式寫操作?寫進(jìn)程進(jìn)入等待隊(duì)列讀進(jìn)程讀數(shù)據(jù)NN寫進(jìn)程寫管道的規(guī)則和流程目前三十八頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)

#include<stdio.h>#include<stdlib.h>voidmain(){ charstr[10]; pid_tpid; pid=fork(); if(pid>0){ printf("daemonondutynow!\n"); exit(0);}

for(;;) { printf("Iamthedaemon!\n"); sleep(3); system("pwd"); }}目前三十九頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)

UIDLoginMath1Math2EnglishPhysicsGrade510wanglin99989590A501lsx190908080B502zhangyu80907085B-

Grades成績(jī)文件:目前四十頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)//suid程序舉例#include<stdio.h>#include<stdlib.h>#include<string.h>#defineN7#defineUID500intmain(){inti,uid;charstr[20],uids[10];FILE*fp;if((fp=fopen("grades","r"))==NULL){printf("Can'topenfilegrades\n");exit(1);}for(i=1;i<=N;i++){fscanf(fp,"%s",str);if(i>1)printf("\t%s",str);}printf("\n");uid=getuid();sprintf(uids,"%d",uid);while(!feof(fp)){fscanf(fp,"\t%s",str);if(feof(fp))break;if(strcmp(uids,str)==0||uid==UID){for(i=1;i<=N-1;i++){fscanf(fp,"\t%s",str);printf("\t%s",str); }if(uid!=UID)break; }if(uid==UID)printf("\n");}printf("\n");fclose(fp);return0;}目前四十一頁(yè)\總數(shù)四十七頁(yè)\編于十四點(diǎn)//stup

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論