Linux内核分析与高级编程_第1页
Linux内核分析与高级编程_第2页
Linux内核分析与高级编程_第3页
Linux内核分析与高级编程_第4页
Linux内核分析与高级编程_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux内核分(Fen)析与高级编程演示文稿第一页,共四十七页。Linux内核分析与高级(Ji)编程第二页,共四十七页。建立WindowsVMLinux文件(Jian)共享的步骤:(1)在Windows下建立共享文件夹(2)进入VMWare,点击CommandsEditVirtuvalMachineSettingsOptionsSharedFoldersEnabledAdd…

在向导引导下分别指定Linux下和Windows下的文件夹名(3)进入Linux,执行命令进入目录

cd/mnt/hgfs

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

第三页,共四十七页。内存(Cun)管理虚拟文件系统进程调度网络接口进程间通信Linux内核的抽象结构网络文件传送VFSSCHEDNET调度\交换进程IPC存取共享内存装入数据和程序虚存交换MM第四页,共四十七页。用户应(Ying)用程序系统库(如标准C库)系统调用接口硬件用户态进程请求与内核的接口

模块(动态链接)I/O进程控制(调度\通信内存管理)内核第五页,共四十七页。/usr/srclinuxdocumentationscriptsnetmodulesmmlibkernelipcinitincludearchi386…alphakernelmmlib…driversblockcharfsext2fatproc…源(Yuan)代码目录树结构第六页,共四十七页。/procdriverfsideirqnetsyssysvipctty有(You)关进程的子目录(十进制数目录)虚拟文件系统/PROC目录结构第七页,共四十七页。一个简单的系统监(Jian)测工具的实现命令行形式:sysinfo[-h][-i][-linterval]

选项:-h——显示命令用法

-i——显示系统静态信息,包括:内核版本信息,主机名,内核版本号,操作系统类型,CPU类型和主频,内存信息

-l间隔时间——按指定间隔时间刷新显示CPU占用率,包括:用户态、核心态和空闲态占用CPU时间百分比。main()显示帮助信息显示系统静态信息cpuinfo()显示系统动态信息loadinfo()-h-i-l第八页,共四十七页。cpuinfo()获取系统日期及时间显示报告系统静态信息的时间和日期依次打开/proc下的相关文件提取系统信息字符串并显示显示系统静态信息/proc/version/proc/sys/kernel/hostname/proc/sys/kernel/osrelease/proc/sys/kernel/ostype/proc/cpuinfo/proc/meminfo第九页,共四十七页。loadinfo()执(Zhi)行procinfo命令产生系统信息文件info提取文件info中的cpu使用情况信息格式化输出cpu使用情况信息休眠(由刷新参数指定休眠时间)显示系统动态信息第十页,共四十七页。运(Yun)行态停止态等待态就绪态僵死态进程状态转换关系示意图跟踪结束创建进程、分配资源调度回收资源进程消亡等待事件睡眠时间片耗尽跟踪事件唤醒exit第十一页,共四十七页。fork()创建新进程后,将并(Bing)发执行两个进程:intmain(void){pid_tpid;…if((pid=fork())==0)//条件不成立

{…}else{

父进程执行的分支

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

{

子进程执行的分支

}else{…}…父进程代码子进程代码第十二页,共四十七页。子进程生命周期示意(Yi)图fork()exit()等待态终止信号和状态父进程子进程wait()恢复执行第十三页,共四十七页。shell系统调用

内核硬件Shell与(Yu)内核的层次关系

Shell:接收、解释、执行用户命令。

系统调用:为用户态进程提供内核功能接口。

内核:对硬件进行抽象和管理,提供服务。用户第十四页,共四十七页。gettyttyAlogingettylogingettyloginttyBttyX登(Deng)录登录登录/etc/passwdLinux系统yesyesyes登录过程………第十五页,共四十七页。第十六页,共四十七页。模拟SHELL的执行流程第十七页,共四十七页。例:输入重定向的(De)基本实现方法。

char*filename=“data.txt”;

intfid;

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

,获取该文件描述符*/

fid=open(filename,O_RDONLY,o600);

/*用指定文件的描述符替换标准输入设备文件描述符*/

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

printf("RedirectStandardInError\n");

return-1;}…第十八页,共四十七页。例:父子进程通过管(Guan)道进行通信。intfd[2];

…pipe(fd)/*建立管道pipe*/if(fork()==0){…read(fd[0],childbuf,len);/*从管道读父进程写的信息*/…}else{…write(fd[1],msgbuf,len);/*将信息写入管道传给子进程*/…}第十九页,共四十七页。例:管道命(Ming)令“ls|more”的基本实现方法。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]);}…第二十页,共四十七页。#!/bin/bashforiin2526272829303132333437383940414344doechoKillingprocessesfromgpp$i/usr/bin/rsh-ngpp$irm-f/home/test/mpida*killalltmpi3ddone例:在运行并行程序的若干节点上删除临时文(Wen)件和进程。第二十一页,共四十七页。#!/bin/bashcounter=1whilereadlinedoif[${line:0:1}!='#'];thenecho"$counter:$line"counter=$[counter+1]fidone<$1例:读文本(Ben)文件并加行号后显示。第二十二页,共四十七页。//例3工作目录文(Wen)件备份程序(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第二十三页,共四十七页。//例4多文(Wen)件查找与替换操作usage(){echo\"changstrOLDstrNEWstr<filenames>changesthefirstinstanceofOLDstrtoNEWstrineachlineof<filenames>,andreportonthedifferences.Examples:changstrTxTexas./addresses.*changstrasps*.c"exit0}case$1in-h|-help)usage;;esaciftest$#-lt3thenusagefi

第二十四页,共四十七页。TMPDIR=/tmpTMPFILE=$TMPDIR/changstr.$$OLDstr=$1NEWstr=$2shift2forFILEin$*dosed-e"s/$OLDstr/$NEWstr/"$FILE>$TMPFILEecho"$FILE:"diff$FILE$TMPFILEecho""mv$TMPFILE$FILEdone第二十五页,共四十七页。//例5终(Zhong)端锁屏程序(shell脚本文件)stty-echowhiletest-z"$code"doecho-n"Enterpassword:"readcode</dev/ttydone

trap""23clearecho"**********************************************************"echo"**"echo"**"echo"*TERMINALSECURED!!*"echo"**"echo"**"echo"**************************************************"echo"“第二十六页,共四十七页。i=1match=""whiletest"$match"!="$code"dosleep$iecho-n"Enterpassword:"readmatch</dev/ttyi=`expr$i'*'2`doneechosttyecho第二十七页,共四十七页。用户程序内核代码模式切换用户空间核心空间用户栈核心栈(进行有关运行级检查)门用户模式核心模式第二十八页,共四十七页。逻辑地址线性地址物理地址段机制页机制两级地址转换机制虚拟地址实际地址虚拟系统空间1G进程1虚存用户空间3G……进程2虚存用户空间3G进程n虚存用户空间3G进程虚拟地址空间:4G0XFFFFFFFF0XC00000000XBFFFFFFF0X00000000系(Xi)统空间用户空间第二十九页,共四十七页。逻辑地址转换为线性地址逻辑地址结构段寄存器OFFSET:16位选择子32位偏移地址OFFSET索引TIRPL:153203108字节段描述符GDT全局描述符表┋+线性地址GDTR段内偏移地址段基址TI=0第三十页,共四十七页。线性地(Di)址转换为物理地(Di)址线性地址结构页目录索引页表索引页内偏移量页目录项┋页表项┋

(1024项)(1024项)物理页帧内存页内偏移

页帧号CR3页目录表页表31222112110物理地址第三十一页,共四十七页。页表项

3101211其它控制位禁止缓存位访问位保护位修改位存在位1=只读0=读写页内编移量查表最终得到页帧号+

页帧号页内偏移量页帧号1=存在0=不存在物理地址送地址线MMU在页表的支持下完成地址映射和虚实转换线性地址32位10位10位12位第三十二页,共四十七页。0111010虚存空间(Jian)页存在位2013……虚拟空间页……0-4k5-8k9-12k13-16k17-20k21-24k61-64k64k虚存1237页帧0页帧32k物理内存0-4k9-12k13-16k29-32k某时刻的虚实映射5-8k…虚实地址映射0页面123456…15第三十三页,共四十七页。入口地址(Zhi)高16位DDPLODXXX00087650段选择码入口地址低16位中断门、陷入门及调用门的基本格式定义31031第三十四页,共四十七页。用户进程(Cheng)调用系统调用getuid()执行宏调用_syscall0(int,getuid)即:调用getuid()产生陷入异常(模式切换到进入内核)traps.c内核初始化时trap_init()建立了调用门执行系统调用处理函数system_call()保护现场,由系统调用号(24)查系统调用表(sys_call_table)找到该系统调用的内核处理函数(sys_getuid16())调用sys_getuid16()返回uid,uid→eax,并压入堆栈执行ret_from_sys_call()恢复现场,并从堆栈获得(uid)→eaxeax→__res,uid返回给用户程序系统调用结束将系统调用号(__NR_getuid=(24))送(eax),并执行int$0x80unistd.hentry.Sgetuid()函数中的return__res第三十五页,共四十七页。intmain(){intuid;

┆uid=getuid();

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

_res;

movl调(Diao)用号,%eaxint$0x80;movl%eax,__res┆return__res;}ENTRY(system_call)pushl%eaxSAVE_ALL

┆callsys_getuid16(void)

┆RESTORE_ALL

asmlinkagelong\sys_getuid16(void){return用户UID;}用户程序标准C库(系统调用)系统调用处理函数内核处理函数系统调用实现中各程序间的关系示意图第三十六页,共四十七页。10读锁SN_READ

写锁SN_WRITE

01信号量数组(初始状态)使用信号量(semaphore)实现读进程\写进程互斥访问共享内存的方法:10(-1)LOCK读锁

写进程获取IPC资源00写共享内存(+1)UNLOCK写锁

释放IPC资源0

101(-1)LOCK写锁

读进程获取IPC资源0

0读共享内存(+1)UNLOCK读锁

释放IPC资源10读进程、写进程互斥访问共享内存的流程:第三十七页,共四十七页。写进程进入(Ru)临界区写数据先写满管道可用空间唤醒等待的读进程管道空间>=所需空间?N退出临界区唤醒读进程写数据量很大?YYY阻塞式写操作?写进程进入等待队列读进程读数据NN写进程写管道的规则和流程第三十八页,共四十七页。

#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"); }}第三十九页,共四十七页。

UIDLoginMath1Math2EnglishPhysicsGrade510wanglin99989590A501lsx190908080B502zhangyu80907085B-

Grades成绩文(Wen)件:第四十页,共四十七页。//suid程序举(Ju)例#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;}第四十一页,共四十七页。//stupid.c程(Cheng

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论