Linux内核实验指导书_第1页
Linux内核实验指导书_第2页
Linux内核实验指导书_第3页
Linux内核实验指导书_第4页
Linux内核实验指导书_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

LinuxLinuxLinuxLinux内核设计与实现内核设计与实现 课程实验指导书课程实验指导书 西安理工大学西安理工大学 LinuxLinuxLinuxLinux 小组小组 谢井明谢井明 编编 2010201020102010 年年 3 3 3 3 月月 西安理工大学 计算机科学与工程学院 i 目录 1. 前言.1 1.1 一些话. 1 1.2 说明. 1 1.3 关于文档修正与程序 bug.1 2. Linux 下 Shell 脚本编程实验.2 2.1 预习要求. 2 2.2 实验目的. 2 2.3 实验任务. 2 2.4 实验原理及方法.2 2.5 注意事项. 3 3. Makefile 文件的编写.4 3.1 预习要求. 4 3.2 实验目的. 4 3.3 实验任务. 4 3.4 实验原理及方法.4 3.5 注意事项. 6 4. Linux 内核模块编程实验(必做).7 4.1 预习要求. 7 4.2 实验目的. 7 4.3 实验任务. 7 4.4 实验原理及方法.7 4.5 注意事项. 9 5. 增加系统调用实验.10 5.1 预习要求. 10 5.2 实验目的. 10 5.3 实验任务. 10 5.4 实验原理及方法.10 5.5 总结思考. 14 6. 获取进程管理与调度信息实验.15 6.1 预习要求. 15 6.2 实验目的. 15 6.3 实验任务. 15 6.4 实验原理及方法.15 6.5 注意事项. 15 7. 工作队列实验.17 7.1 预习要求. 17 7.2 实验目的. 17 7.3 实验任务. 17 7.4 实验原理及方法.17 8. 定时器实验.20 8.1 预习要求. 20 8.2 实验目的. 20 ii 8.3 实验任务. 20 8.4 实验原理及方法.20 9. Linux 驱动程序实验.21 9.1 预习要求. 21 9.2 实验目的. 21 9.3 实验任务. 21 9.4 实验原理及方法.21 10. 模拟 Linux 内存管理实验.24 10.1 预习要求.24 10.2 实验目的.24 10.3 实验任务.24 10.4 实验原理及方法.24 10.5 注意事项.28 11.进程同步实验.29 11.1 预习要求. 29 11.2 实验目的. 29 11.3 实验任务. 29 11.4 实验原理及方法. 29 Linux 设计与实现课程实验指定书 xaut-linux-group 谢井明(xjmbufan) 1 1.1.1.1.前言前言前言前言 1.11.11.11.1一些话一些话一些话一些话 对于大多数人来说, 几乎还没接触过Linux 及 Linux下的用户层编程, 就开始学习 Linux 内核设计与实现这门课程,这是一个巨大的挑战!即便是有一定基础的人,学习 Linux 内 核也是个莫大的考验。这里并不是吓唬初学者,而是希望能够使大家有个心里准备,学习 Linux 内核之旅充满艰难万险,但当你披荆斩棘一路走来,拨开云雾之时,无限感慨“风景 这边独好!”。 看不懂书中阐述的原理吗?搞不明其机制是如何实现的吗?没有捷径,唯有反复的学 习、消化,以致脑中出现其清晰的逻辑。 不知如何进行内核编程吗?也没有捷径,只有实践,大胆的实践,从简单helloworld 开 始,一步一步逐渐深入。实践多了,当你遇到问题时,自然会把内核编程考虑进你自己的解 决方案中来,而不仅仅局限于用户层的解决方案。 对于没接触过 Linux 的同学,建议自己装个 Linux 系统来玩玩,熟悉其基本操作、目录 组织以及掌握基本的 Linux 下的开发工具等;对于接触 Linux 有一段时间的同学,希望能够 多指导指导新手,同时自己也可以温习温习,温故而知新嘛,共同进步。 1.21.21.21.2说明说明说明说明 本人受黑新宏教授的指导与委托,特编写此实验指导书,予后来者。 本指导书包含了作者学习 Linux 内核时的大部分入门实验程序, 旨在指导帮助大家对内 核编程有个入门。 每个实验都提供了简单的实验程序及其原理说明, 同学们也可以自由发挥 编写相关实验程序。下面对实验按内核层代码与用户层代码进行分类: (1)只包含内核层代码的实验:实验 4、实验 7、实验 8。 (2)只包含用户层代码的实验:实验 2、实验 3、实验 10、实验 11。 (3)同时包含内核层代码与用户层代码的实验:实验 5、实验 6、实验 9。 请注意内核层代码的编译与用户层代码的编译有点小异。 本指导书中的所有程序都在“CentOS 5.3”这个 Linux 版本系统中编译通过。进行内核 编程需要相应内核开发包,可自行安装,一般安装在/usr/src/kernels/下,其他像/lib/modules/ 下会有对其的符号链接。 实验可能要用到的工具: Vim:用于编辑源代码; gcc:用于编译连接; gdb:用于调试(调试用户空间程序); make:用于自动编译; SourceInsight:用于浏览内核源代码。 1.31.31.31.3关于文档修正与程序关于文档修正与程序关于文档修正与程序关于文档修正与程序 bugbugbugbug 由于作者水平的有限,接触 Linux 内核的时间不长,对 Linux 内核的理解难免有偏差, 编写的程序瑕疵或许不少,所以欢迎广大读者来函指正。 邮箱:xjmbufan Linux 设计与实现课程实验指定书 xaut-linux-group 谢井明(xjmbufan) 2 2.2.2.2.LinuxLinuxLinuxLinux 下下下下 S S S Shellhellhellhell 脚本编程实验脚本编程实验脚本编程实验脚本编程实验 2.12.12.12.1预习要求预习要求预习要求预习要求 (1)开始本实验之前,请学习相关 shell 脚本编程知识。 (2)了解 Linux 环境变量。 2.22.22.22.2实验目的实验目的实验目的实验目的 (1)通过实验,进一步熟悉 shell 脚本编程。 (2)掌握基本 shell 命令及其环境变量。 2.32.32.32.3实验任务实验任务实验任务实验任务 (1)编写 shell 脚本程序获取环境变量并输出。 (2)编写包含控制语句的 shell 脚本程序。 2.42.42.42.4实验原理及方法实验原理及方法实验原理及方法实验原理及方法 (1)简单的 shell 脚本程序类似批处理程序,只执行一些命令,以下为“greet”脚本 程序,显示当前登陆用户名及域名,并显示当前时间。 greet 程序清单: (2)Shell 脚本可以有条件、循环等控制语句,以设计较复杂逻辑功能的脚本程序。 下面的check 程序是一个判断指定的用户名是否在系统的passwd 文件中的shell 脚本。它首先判断用户是否指定了一个要查找的用户名参数,然后循环在 “/etc/passwd”文件中查找,最后提示是否找到。 check 程序清单: Linux 设计与实现课程实验指定书 xaut-linux-group 谢井明(xjmbufan) 3 (3)Shell 脚本程序还能和用户进行交互。 下面的 five 程序实现实现对用户输入的百 分制的分数进行五分制,即非常优秀、优秀、优良、中等、不及格。 fivefivefivefive 脚本清单:脚本清单: 2.52.52.52.5注意事项注意事项注意事项注意事项 (1) “if”关键字与“”之间必须要有空格隔开。 (2) “$1”为脚本第一个参数变量,“$0”是脚本名本身,“$#”参数个数,后面的 参数以此类推,“$2”“$3”.如在终端执行该脚本“check xaut”则“$#”为 2,“$0”为 check,“$1”为 xaut。 (3)执行脚本程序时有两种方法: 一是直接调用shell 如/bin/bash来执行:/bin/bash five。 二是修改其属性为可执行的:chmod +x five,然后直接运行 five 脚本。 Linux 设计与实现课程实验指定书 xaut-linux-group 谢井明(xjmbufan) 4 3.3.3.3.MakefileMakefileMakefileMakefile 文件的编写文件的编写文件的编写文件的编写 3.13.13.13.1预习要求预习要求预习要求预习要求 (1)学习使用 gcc 编译。 (2)做本实验前,请阅读make 手册。 3.23.23.23.2实验目的实验目的实验目的实验目的 (1)熟悉掌握 gcc 编译器的使用。 (2)掌握 make 的工作原理及 Makefile 文件的编写。 3.33.33.33.3实验任务实验任务实验任务实验任务 (1)为自己的工程编写 Makefile 文件 (2)学有余力的同学可尝试给自己写一个基本通用的 Makefile 文件。 3.43.43.43.4实验原理及方法实验原理及方法实验原理及方法实验原理及方法 若写一个简单的只有一个源文件的小程序, 只需一条命令即可编译出可执行文件, 然而 编写一定功能的软件,其源程序也写在一个文件里的话,编写、阅读以及维护等工作都会难 以进行。所以一般把工程的源文件按功能分成几个、几十个甚至几百个文件。 要把工程中的源文件一个一个地编译成目标文件, 然后将它们连接成可执行程序, 这需 要相应敲的一个一个编译连接命令(当然 IDE 除外),而且要重新编译的话还得重敲,这 显然很繁琐。 一种解决办法是将每个源文件的编译命令写入一个脚本里。 这种方法虽然能达 到减轻开发者的负担, 但是要多次编译工程时的编译效率较低, 因为即使仅仅修改了一两个 源文件或头文件,重新编译工程时都得编译所有源文件,无论其有没修改。这是自动化编译 工具make 就应运而生了。 make 工具能够根据目标与依赖文件的新旧来执行相应的命令(如编译连接命令),若 至少有一个依赖比目标新,那么这条依赖关系相应的命令就会得到执行,否则不执行。而所 有这些都是 Makefile 文件来描述的。Makefile 文件的基本结构是: 宏定义(变量定义) 目标:依赖文件列表 命令(命令要缩进一个tab) 目标:依赖文件列表 命令 以下是一个较通用的 Makefile 文件,无需修改或只需修改一点点就能编译我们平时的 大部分工程。(当然,首先要学会写,否则你何以修改之?)。注意其中查找源文件列表使 用了 find_src_files.sh 脚本,这是自己写的,内容如下: Linux 设计与实现课程实验指定书 xaut-linux-group 谢井明(xjmbufan) 5 较通用的较通用的 MakefileMakefileMakefileMakefile 文件清单:文件清单: Linux 设计与实现课程实验指定书 xaut-linux-group 谢井明(xjmbufan) 6 3.53.53.53.5注意事项注意事项注意事项注意事项 (1)注意 find_src_files 脚本必须放在 PATH 环境变量指定的目录下,如/bin下 , 否则提示找不到。 (2)虽然是以上 Makefile 文件具有一定的通用性,但只适用 C 程序(稍加修改即 可),有时也要具体问题具体分析,像内核模块程序的 Makefile 文件就不能 再套用它。它只是展示了较通用的 Makefile 文件的写法,你完全可以自己也 写一个属于自己的。 Linux 设计与实现课程实验指定书 xaut-linux-group 谢井明(xjmbufan) 7 4.4.4.4.LinuxLinuxLinuxLinux 内核模块编程实验(必做)内核模块编程实验(必做)内核模块编程实验(必做)内核模块编程实验(必做) 4.14.14.14.1预习要求预习要求预习要求预习要求 (1)做本实验之前,请复习相关内核模块知识。 (2)请了解内核模块的编写、编译及安装与卸载方法。 (3)请学习内核打印函数 printk()的用法。 (4)请复习 Makefile 文件的编写。 4.24.24.24.2实验目的实验目的实验目的实验目的 (1)掌握内核模块的组成部分。 (2)掌握内核模块的编译、安装与卸载方法。 (3)学会查看内核模块的信息。 4.34.34.34.3实验任务实验任务实验任务实验任务 编写一个 helloworld 内核模块,安装该模块时打印 hello 信息,卸载时打印 goodbye 信 息。 4.44.44.44.4实验原理及方法实验原理及方法实验原理及方法实验原理及方法 Linux 内核模块(LKM)是一些在启动的操作系统内核需要时可以载入内核执行的代码 块,不需要时由操作系统卸载。它们扩展了操作系统内核功能却不需要重新编译内核、启动 系统。如果没有内核模块,就不得不反复编译生成操作系统的内核镜像来加入新功能,当附 加的功能很多时,还会使内核变得臃肿。 一个 Linux 内核模块主要由以下几个部分组成: (1)模块加载函数(必须):当通过 insmod 或 modprobe 命令加载内核模块时,模块的加 载函数会自动被内核执行,完成本模块相关初始化工作。 (2)模块卸载函数(必须):当通过 rmmod 命令卸载模块时,模块的卸载函数会自动 被内核执行,完成与模块加载函数相反的功能。 (3)模块许可证声明(必须):模块许可证(LICENCE)声明描述内核模块的许可权 限, 如果不声明 LICENCE,模块被加载时将收到内核被污染的警告。 大多数情况下 , 内核模块应遵循 GPL 兼容许可权。Linux2.6 内核模块最常见的是以 MODULE_LICENSE(“Dual BSD/GPL”)语句声明模块采用 BSD/GPL 双 LICENSE。 (4)模块参数(可选):模块参数是模块被加载的时候可以被传递给他的值,它本身对 应模块内部的全局变量。 (5)模块导出符号(可选):内核模块可以导出符号(symbol,对应于函数或变量),这样 其他模块可以使用本模块中的变量或函数。 (6)模块作者等信息声明(可选) 。 一个内核模块至少包含两个函数,模块被加载时执行的初始化函数 init_module()和模块 被卸载时执行的结束函数 cleanup_module()。在最新内核稳定版本 2.6 中,两个函数可以起 任意的名字,通过宏 module_init()和 module_exit()注册调用。 本次实验涉及了内核模块编程的一些大致框架:模块相关信息(包括许可证、作者信息 等)、模块参数、模块装载与卸载、模块间的引用等。在 helloworld 模块中用宏声明模块相 关信息,并定义了一个变量 N,其值可在模块加载时设定,还向内核空间导出了 my_print Linux 设计与实现课程实验指定书 xaut-linux-group 谢井明(xjmbufan) 8 函数符号(实验中 hello2 模块使用了它)。hello2 模块使用了 helloworld 模块中的函数符号 my_print,即 hello2 模块引用了 helloworld 模块(request_module(helloworld)),若 hello2 模 块未卸载的话是不能卸载 helloworld 模块的(除非强制卸载,不建议)。以下为两个模块的 源代码。 helloworld.chelloworld.chelloworld.chelloworld.c 程序清单:程序清单: hello2.chello2.chello2.chello2.c 程序清单:程序清单: Linux 设计与实现课程实验指定书 xaut-linux-group 谢井明(xjmbufan) 9 编译内核模块编译内核模块:编译时需要提供一个 Makefile 来隐藏底层大量的复杂操作(当然你也 可以指定很多选项来用 gcc 编译,但较麻烦),使用户通过 make 命令就可以自动完成编译 的任务。以下是 helloworld 模块的 Makefile 清单,后面实验的模块的 Makefile 和它基本 一致,知识目标名 TARGET 不同而已。 helloworldhelloworld 模块的模块的 MakefileMakefile 清单:清单: KVER 变量值为当前运行的内核的发行版本号,shell 命令 uname r 可得到。必须给变 量 obj-m 追加$(TARGET).o值。default 目标的命令的意思是: make 先进入$(KDIR)目录下处 理其目录下的 Makefile 文件,再退出进入子目录(模块所在目录)下执行模块的 Makefile 文件,modules 为 make 的目标(打开$(KDIR)目录下的 Makefile 你会看到“all:modules”, 会写 Makefile 文件的同学就会知道)。此 Makefile 文件中还包含了安装与卸载模块以及清 除文件的伪目标。 安装与卸载模块安装与卸载模块: 由于本实验的 Makefile 中指定了安装与卸载的伪命令, 故安装用 make install、卸载用 make uninstall 即可,当然也可以直接“insmod 模块名”与“rmmod 模块名” 来安装与卸载。在图形界面上不能直接看到模块的输出信息,想想为什么?可用 dmesg 查 看内核输出信息,或直接查看/var/log/messages 文件。在命令模式下则可直接看到输出。 4.54.54.54.5注意事项注意事项注意事项注意事项 (1)编译模块前必须安装相应的内核开发包。 (2)内核模块编程从内核版本 2.4 到 2.6 有较大区别, 请注意不要盲目的照搬网上或 其他书籍上的例子,必须懂得其原理。本实验是在基于 2.6 的。 (3)printk 为内核空间的打印函数,不是库函数,不要和 printf 等混淆了。 (4)由于 LKM 运行在内核空间,任何异常都会导致内核运行不稳定,不像在用户 层还有内核的相应机制来保护,所以必须保证你的模块代码的正确与安全。 (5)LKM 对于内核版本的依赖性过强,每一个 LKM 都是靠内核提供的函数和数 据结构组织起来的。当这些内核函数和数据结构因为内核版本变化而发生变动 时,原先的 LKM 不经过重新编译或修改可能不能正常运行。 Linux 设计与实现课程实验指定书 xaut-linux-group 谢井明(xjmbufan) 10 5.5.5.5.增加系统调用实验增加系统调用实验增加系统调用实验增加系统调用实验 5.15.15.15.1预习要求预习要求预习要求预习要求 (1)复习教材,熟悉 Linux 系统调用的原理。 (2)学习增加系统调用的方法。 (3)学习用户层调用系统调用的若干方法。 (4)学习并实践编译内核。 5.25.25.25.2实验目的实验目的实验目的实验目的 (1)加深对系统调用的理解。 (2)掌握增加与调用自己的系统调用的方法。 (3)掌握如何编译内核。 5.35.35.35.3实验任务实验任务实验任务实验任务 向内核添加一个名叫 get_proc_run_time 的系统调用,它的功能是根据指定的进程标识 号 pid,从该进程的进程描述符 task_struct 结构中提取出它的系统时间 stime 与用户时间 utime。将其增加进内核源码并编译内核,然后在用户空间编写测试程序测试该系统调用。 程序中调用此系统调用能最准确地度量一个程序的时间效率, 想想还有别的方法比这更准确 吗? 5.45.45.45.4实验原理及方法实验原理及方法实验原理及方法实验原理及方法 系统调用过程:系统调用过程:Linux 的系统调用的总控程序是 system_call,它是 Linux 系统中所有系 统调用的总入口,这个 system_call 是作为一个中断服务程序挂在中断 0 x80 上,系统初始化 时通过 void init trap_init(void)调用宏 set_system_gate(SYSCALL_VERCTOR,useradd mockbuild -g mockbuild,再执行以上命令)。 (2)#cd /usr/src/redhat/SPECS (3)#rpmbuild -bp -target=uname -m -without fips kernel.*.*.*.src.rpm 修改内核,增加系统调用(修改内核,增加系统调用(基于基于 CentOSCentOSCentOSCentOS 5.35.35.35.3【2.6.18-1642.6.18-1642.6.18-1642.6.18-164 内核】内核】):):系统调用是用户空 间进入内核的唯一入口, 要实现自己特定功能的系统调用只能在内核代码中增加代码。 且在 系统调用接口上出现的内核函数不能像普通函数一样直接调用(如我们自己定义的函数,可 以直接来用);相反,这些函数必须通过系统调用表来间接调用;因此,如果我们编写了一 个新的内核函数,就需要在内核系统调用表里面创建一个新的表项来引用新函数。 Linux 设计与实现课程实验指定书 xaut-linux-group 谢井明(xjmbufan) 11 (1)添加系统调用号:include/asm/unistd.h 文件给每个系统调用分配一个唯一的 编号。在这个文件中为新系统调用分配下一个可用的系统调用号,以供用户 进程和其他系统进程查询或调用。 将系统调用号加入include/asm-i386/unistd.h 中: #define _NR_restart_syscall0 #define _NR_exit1 #define _NR_fork2 #define _NR_read3 #define _NR_write4 . . #define _NR_fallocate324 #define _NR_get_proc_run_time325 #ifdefine _KERNEL_#define NR_syscalls326 /* number of syscall */ (2)更新系统调用表:有了自己的新的系统调用函数,以及表示这个系统调用的 编号。接下来需要做的是在编号和函数本身之间建立一种对等关系:将新的 系统调用的入口地址添加到 sys_call_table 表中,这个表的大小是由符号常量 NR_syscalls (2.6 中为 320)定义的。这个表按系统调用号(即前面提到的 _NR_name)排列了所有系统调用函数的指针,以供系统调用入口函数 system_call 查找。 把自己的系统调用 get_proc_run_time 加到系统调用表 sys_call_table(在 arch/i386/kernel/syscall_table.S 中,不在 entry.S 中)。 ENTRY(sys_call_table) .long sys_restart_syscall /* 0 - old setup() system call, used for restarting */ .long sys_exit .long sys_fork .long sys_read .long sys_write . . .long sys_fallocate/* 324 */ .long sys_get_proc_run_time/* 325my syscall */ (3)加入自己的系统调用代码:把自己的系统调用代码放在比较密切的文件中, 如果单独写个文件的话,需要修改 Makefile 文件。由于我们的系统调用 sys_get_proc_run_time 功能就是得到给定pid的task_struct中的utime 与 stime, 故我将其添加在 kernel/sched.c 中。 Linux 设计与实现课程实验指定书 xaut-linux-group 谢井明(xjmbufan) 12 get_proc_run_time.cget_proc_run_time.cget_proc_run_time.cget_proc_run_time.c 程序清单:程序清单: 说明:说明: (1)asmlinkage 修饰符的使用:这个宏(在 linux/include/linux/linkage.h 中定义) 告诉编译器将传递栈中的所有函数参数(表示通过堆栈递参数)。 (2)系统调用处理函数的函数名约定:函数名必须以“sys_”开头,后跟该系统 调用的名字 name。 编译内核:编译内核: (1)#cd /usr/src/redhat/BUILD/kernel.*.*/linux.*.*.*.i686 (2)#make mrproper/确保干净,没有不正确的.o 文件及相互依赖 (3)#make menuconfig/or make oldconfig (4)#make (5)#make modules_install Linux 设计与实现课程实验指定书 xaut-linux-group 谢井明(xjmbufan) 13 从新内核启动以后,使用新的系统调用有两种方法:从新内核启动以后,使用新的系统调用有两种方法: (1)第一种:使用 syscall()调用系统调用。通过 syscall 函数调用由其索引所标 识的新函数。使用 syscall 函数,你可以通过指定他的调用索引和一组参数 来调用系统调用。 (2)第二种:传统方法,使用_syscallN 宏。N 代表该系统调用的参数个数,一 般不超过 6 个。将_syscallN 宏用于用户空间应用程序开发中,这要求我们 创建函数调用,这些函数调用必须匹配内核中的系统调用索引,且参数也 要匹配。Linux 提供了一组宏来提供这种功能:即_syscallN 宏。 #define _NR_get_proc_run_time 325 _syscall2(long,get_proc_run_time, pid_t,pid, struct cpu_time_struct *,cpu_time); 注:自内核版本 2.6.18 以后,_syscall 宏从提供给用户空间的头文件中去除了,使用系 统调用 syscall()代替。(在一些系统结构里从来就不提供_syscall 宏,如 ia64) 测试程序:测试程序:用户空间编写的 test 程序创建一个子进程,子进程中调用 execl()执行一个 child_prog 程序,而父进程中注册一个子进程退出的信号处理函数,子进程退出后父进程进 入信号处理函数,调用 get_proc_run_time()系统调用获取子进程的所用的系统时间和用户时 间,并输出。 child_prog.cchild_prog.cchild_prog.cchild_prog.c 程序清单:程序清单: test.ctest.ctest.ctest.c 程序清单:程序清单: Linux 设计与实现课程实验指定书 xaut-linux-group 谢井明(xjmbufan) 14 5.55.55.55.5总结思考总结思考总结思考总结思考 用户/内核交互的其他选择:系统调用是请求内核中服务的一种方法。使用这种方法的 最大问题就是它是一个标准接口, 很难将新的系统调用增加到内核中, 因此可以通过其他方 法来实现类似服务。让您的服务对用户空间可见的另外一种方法是通过 /proc 文件系统。 /proc 文件系统是一个虚拟文件系统,您可以通过它来向用户提供一个目录和文件,然后通 过文件系统接口(读、写等)在内核中为新服务提供一个接口。系统调用是穿越用户空间和 内核空间的请求内核空间服务的一种有效方法。 不过对这种方法的控制也很严格, 更简单的 方式是增加一个新的 /proc 文件系统项来提供用户/内核间的交互。不过当速度因素非常重 要时,系统调用则是使应用程序获得最佳性能的理想方法。 Linux 设计与实现课程实验指定书 xaut-linux-group 谢井明(xjmbufan) 15 6.6.6.6.获取进程管理与调度信息实验获取进程管理与调度信息实验获取进程管理与调度信息

温馨提示

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

评论

0/150

提交评论