操作系统实验---内核模块实现

合集下载

北京邮电大学计算机学院 - 操作系统实验报告(含源代码)

北京邮电大学计算机学院 - 操作系统实验报告(含源代码)
小组成员:许伟林 08211306 (6 班) 刘惠庭 08211338 (7 班)
1/58
10 年 12 月 19 日
内容目录
实验 1.3 Shell 编程...........................................................4 1、实验目的...............................................................4 2、实验内容...............................................................4 3、实验原理...............................................................4 4、实验步骤...............................................................4 5、实验结果:.............................................................4 6、人员任务分配...........................................................5
实验项目:
1. 实验 1.3 Shell 编程 2. 实验 2.3 内核模块 3. 实验 2.4 系统调用 4. 实验 3.3 Shell 编程实验(进程管理实验) 5. 实验 4.1 观察实验(存储管理实验) 6. 实验 5.1 观察实验(进程通信) 7. 实验 6.3 Io 系统编程实验 8. 实验 6.4 设备驱动程序 9. 实验 7.1 代码分析(文件系统管理实验)
实验 3.3 Shell 编程实验(进程管理实验)......................................18 1、实验目的..............................................................18 2、实验内容..............................................................18 3、实验原理..............................................................18 4、实验步骤..............................................................18 5、实验结果及分析........................................................19 6、人员任务分配..........................................................19 2、实验内容 2............................................................20 3、实验原理..............................................................20 4、实验步骤..............................................................20 5、实验结果及分析........................................................23 6、人员分配..............................................................24

Linux内核模块讲解

Linux内核模块讲解

29
内核模块的参数



声明一个数组参数: module_param_array(name,type,num,perm); name 数组的名子(也是参数名) type 数组元素的类型 num 是数组元素的个数,模块加载者拒绝比数组能放下的多的值。 2.6.9传递数组个数变量名,2.6.11传递数组个数变量的地址。 perm 是通常的权限值. 如果数组参数在加载时设置。
11
Linux的内核模块(相关命令)
内核模块的加载 #insmod module_name 内核模块的卸载 当我们不需要内核模块了,为了减少系统资源的开销,需要卸载时使 用命令 #rmmod module_name 或者 #modprobe –r module_name 查看系统已经加载的模块 #lsmod 查看系统已经加载的模块信息 #modinfo

操作系统的代码高度紧密,所有的模块都在同一块寻址空间内运行
2.
微内核(Micro kernel)
微内核本身只提供最基本的操作系统的功能,比如进程调度与消息传 递等 其他的功能由其独立的模块提供,每个独立的功能模块都可以是一个 进程。

当我们需要使用某个功能的时候,我们只需要在运行的操作系统里安 装这个模块,并且运行对应服务,当这个功能不再需要的时候,我们 可以停止这个服务,这样这个功能模块将不占据系统内存和处理器的 资源,而不会破坏当前的系统正常运
18
内核模块说明

写内核程序需要注意:
19
内核模块的makefile
obj-m := hello.o KERNELDIR := /lib/modules/2.6.20/build PWD := $(shell pwd) modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

Linux操作系统实验总结分析报告

Linux操作系统实验总结分析报告

Linux操作系统实验总结分析报告从系统的⾓度分析影响程序执⾏性能的因素1.Linux系统概念模型从全局的⾓度来看,Linux系统分为内核空间和⽤户空间,但毫⽆疑问内核空间是Linux系统的核⼼,因为内核负责管理整个系统的进程、内存、设备驱动程序、⽂件,决定着系统的性能和稳定性。

于是从这个⾓度我构建的Linux系统的概念模型如下图所⽰:此模型将Linux系统主要划分为四个模块:内存管理、进程管理、设备驱动程序、⽂件系统。

这四个部分也是⼀个操作系统最基本也是最重要的功能。

2.概念模型解析2.1 内存管理Linux系统采⽤虚拟内存管理技术,使得每个进程都有各⾃互不⼲涉的进程地址空间。

该空间是块⼤⼩为4G的线性虚拟空间,⽤户所看到和接触到的都是该虚拟地址,⽆法看到实际的物理内存地址。

利⽤这种虚拟地址不但能起到保护操作系统的效果(⽤户不能直接访问物理内存),⽽且更重要的是,⽤户程序可使⽤⽐实际物理内存更⼤的地址空间。

内存管理主要有分为如下⼏个功能:地址映射、虚拟地址管理、物理内存管理、内核空间管理、页⾯换⼊换出策略和⽤户空间内存管理,这些模块的架构图如下所⽰:2.2 进程管理进程管理是Linux系统⾮常重要的⼀部分,进程管理虽然不像内存管理、⽂件系统等模块那样复杂,但是它与其他⼏个模块的联系是⾮常紧密的。

进程管理主要包括进程的创建、切换、撤销和进程调度。

2.2.1 进程的创建、切换、撤销进程的创建:在Linux编程中,⼀般采⽤fork()函数来创建新的进程,当然,那是在⽤户空间的函数,它会调⽤内核中的clone()系统调⽤,由clone()函数继续调⽤do_fork()完成进程的创建。

整个进程创建过程可能涉及到如下函数:fork()/vfork()/_clone----------->clone()--------->do_fork()---------->copy_process()进程的切换:进程切换⼜称为任务切换、上下⽂切换。

理工大学Linux实验报告

理工大学Linux实验报告

实验名称实验一Linux操作系统定制安装实验地点博学楼实验时间4月16日网络实验室一、实验目的和要求⑴通过对Linux 操作系统的定制安装,建立对Linux操作系统的初步认识,为后续实验的进行提供基础平台。

⑵掌握Linux操作系统的虚拟机定制安装。

⑶熟悉Linux文件目录结构二、实验内容和原理实验内容:利用虚拟机软件定制安装Linux操作系统,熟悉安装过程中各个选项的意义。

实验原理:虚拟机可以说是一种软件,也可以说是一种技术,它允许用户在一台主机上虚拟出多台计算机,每台虚拟的计算机都可以有自己的硬件及软件配置。

三、主要仪器设备PC机、VMware Player、Redhat/Ubuntu/Fedora四、操作方法与实验步骤⑴安装VMware Player⑵在VMware Player当中创建一个新的虚拟机,指定安装包的路径。

⑶安装定制Redhat Enterprise Linux 5.0说明:⑴对软件开发和和网络服务包进行定制。

⑵选择samba服务、nfs服务、tftp服务、Telnet服务和FTP服务⑶关闭系统防火墙、禁用SELinux服务。

⑷手动设置系统分区。

五、实验数据记录和处理1、安装Ubuntu进入界面:2、选择tftp服务3、对软件开发和网络服务包进行定制,都选择老的软件开发和老的网络服务器4、关闭系统防火网5、禁用SELinux服务六、实验结果与分析七、讨论、心得通过这次实验,在自己电脑的虚拟机上安装好了Ubuntu的镜像文件,并在Ubuntu下写了一些简单的命令,深深地感觉在虚拟机上运行Ubuntu远远要比双系统下方便得多,尤其是在两种不同系统下来回切换。

由于电脑上之前就已经安装过虚拟机,所以,实验报告中未对虚拟机的安装加以赘述。

实验名称实验二熟悉Linux系统的基本命令实验时间4月18日实验地点博学楼网络实验室一、实验目的和要求⑴熟悉Linux命令格式⑵学会如何获取命令帮助信息⑶熟练掌握Linux常用命令⑷掌握GCC命令的使用及其常用参数的含义二、实验内容和原理实验内容:系统设置命令、文件及文件夹操作命令、压缩与解压缩命令、自动补全与历史命令、管道与重定向命令、GCC命令的使用三、主要仪器设备PC机、装有Linux操作系统的虚拟机四、操作方法与实验步骤⑴练习以下常用命令的使用shutdown、reboot、logout、exit、useradd、userdel、su、cd、ls、touch、mkdir、cp、rm、rmdir、mv、more、less、man、du、find、clear、grep、cat、history、tar、unzip、chmod、管道命令|以及重定向命令⑵举例说明管道命令| 的使用⑶举例说明重定向命令<、<<、>、>>的使用⑷编写一个C的源程序,并用gcc进行编译,练习使用gcc的各个参数,理解参数的意义五、实验数据记录和处理1.cd、ls 、mkdir 新建hello文件夹2.cp 复制a到hello文件夹3.rm移除hello 中的a文件4.rmdir移除hello文件夹5.mv更改文件名字、移动文件6.du -b 以字节为单位显示cache目录的大小7.find / -name lolo搜索当前目录下名为lolo的文件8.grep 在lan/b.txt文件里查找字符3,并输出行号-n;输出b.txt内容9.grep重定向追加>>六、讨论、心得本次实验室是熟悉Linux的基本操作命令。

计算机操作系统实验指导计算机系统调用

计算机操作系统实验指导计算机系统调用

使用内核编译法添加系统调用
为了验证系统调用是否成功,编写验证代码如下。 #include <stdio.h> #include <linux/kernel.h> #include <sys/syscall.h> #include <unistd.h> int main() { long int a = syscall(三三三); printf("System call sys_helloworld reutrn %ld\n", a); return 0; }
如图地执行结果,我们得到sys_call_table地址:ffffffffabe00一a0 三. 编写Makefile文件,可参考实验指导书地内容。 四. 编译并装入模块 # sudo make //编译 # sudo insmod hello.ko //装入模块 # lsmod //该命令查看所有模块,用以检查hello是否被装入系统 # sudo rmmod hello.ko //卸载模块
三三三 六四 helloworld
sys_helloworld
使用内核编译法添加系统调用
六. 配置内核 # cd /usr/src/linux-四.一六.一0 # sudo make mrproper # sudo make clean # sudo make menuconfig 七. 编译与安装内核(与第七章类似) # sudo make -j八 # sudo make modules -j八 # sudo make modules_install # sudo make install 八. 重启系统 # uname -r 查看此时地内核版本
编译验证代码: # gcc hello.c

windows内核原理与实现

windows内核原理与实现

在windows中,用户代码和内核代码有各自的运行环境,而且他们可以访问的内存空间也不相同。在32为系统中,内核代码可以访问当前进程的整个4GB虚拟地址空间,而用户代码只能访问底端的2GB虚拟地址(或3GB,如果打开了内核启动开关/3GB的话)。用户模式的代码只能访问2GB一下的虚拟内存地址空间,2GB以上车更为系统地址空间。实际上在两者之间有一块特殊的64KB地址空间,位于0x7fff0000—0x7fffffff,两种模式下都不能访问。
在内核模块ntoskrnl.exe中的下层部份(上层部份为执行体),最接近于HAL层,负责线程调度和中断、异常的处理。对于多处理器系统,他还负责同步处理器之间的行为以优化系统的性能。这一层的核心人物是让系统中的所有处理器尽可能的忙和高效。内核层可在多个处理器伤病发执行,他的代码以C语言为主。
执行体:
本地安全权威子系统进程(lsass.exe):负责本地系统安全策略,例如允许那些用户登录到本地系统中、口令策略、 授予用户和用户组的特权,以及系统安全审计设置,同时也负责认证用户的身份,以及将安全审 计消息发送到系统的时间日志中。
shell进程(explorer.exe):windows默认的shell,提供了系统玉用户打交道的各种界面
windows采用了双模式结构来保护操作系统本身,以避免被应用程序的错误所波及。操作系统核心运行在内核模式(kernel mode)下,应用程序的代码运行在用户模式下。每当应用程序需要用到系统内核或内核的扩展模块(内核驱动程序)所提供的服务时,应用程序通过硬件指令从用户模式切换到内核模式中,当系统内核完成了所请求的服务以后,控制权又回到用户模式代码。
系统线程和系统进程:
在windows中,每个线程代表一个指令执行序列,同时也是一个调度单元;进程定义了一个执行环境,有自己独立的地址空间。每个线程都必定依附于一个进程。windows内核除了接受来自应用程序的系统服务调用,它自己也有一些线程用于各种用途。浙西县城运行在一个特殊的进程环境中,称为system进程。他的线程被称为系统线程,其中有一组系统辅助线程(system worker thread),他们代表操作系统或者其他的应用进程来完成一些特殊的工作。

操作系统存储管理实验报告

操作系统存储管理实验报告
4 / 37
操作系统实验·报告
typedef struct pfc_struct pfc_type; (2)模块结构 (伙伴系统) # define Inital 1024 //初始时的总内存
NODE root=(memory_node *)malloc(1*sizeof(memory_node));//根节点 int chip=0; // 记录总的碎片大小
total = 256 use =127 remain_max = 0 flag = 0 pid =0
total = 256 use = 0 remain_max = 256 flag = 0 pid =-1
total = 1024 use = 0 remain_max = 512 flag = 1 pid =-1
total = 512 use = 0 remain_max = 512 flag = 0 pid =-1
total = 512 use = 267 remain_max = 0 flag = 0 pid = -1
6 / 37
操作系统实验·报告
三、实验理论分析
7 / 37
操作系统实验·报告
(伙伴算法) Buddy System 是一种经典的内存管理算法。在 Unix 和 Linux 操作系统中都有用到。其 作用是减少存储空间中的空洞、减少碎片、增加利用率。避免外碎片的方法有两种: a.利用分页单元把一组非连续的空闲页框映射到非连续的线性地址区间。 b.开发适当的技术来记录现存的空闲连续页框块的情况,以尽量避免为满足对小块的 请 求而把大块的空闲块进行分割。 基于下面三种原因,内核选择第二种避免方法: a.在某些情况下,连续的页框确实必要。 b.即使连续页框的分配不是很必要,它在保持内核页表不变方面所起的作用也是不容 忽视的。假如修改页表,则导致平均访存次数增加,从而频繁刷新 TLB。 c.通过 4M 的页可以访问大块连续的物理内存,相对于 4K 页的使用,TLB 未命中率降 低,加快平均访存速度。 Buddy 算法将所有空闲页框分组为 10 个块链表,每个块链表分别包含 1,2,4,8,16,32,64,128,256,512 个连续的页框,每个块的第一个页框的物理地址是该块 大小的整数倍。如,大小为 16 个页框的块,其起始地址是 16*2^12 的倍数。 例,假设要请求一个 128 个页框的块,算法先检查 128 个页框的链表是否有空闲块, 如果没有则查 256 个页框的链表,有则将 256 个页框的块分裂两份,一 份使用,一份 插入 128 个页框的链表。如果还没有,就查 512 个页框的链表,有的话就分裂为 128, 128,256,一个 128 使用,剩余两个插入对应链 表。如果在 512 还没查到,则返回 出错信号。 回收过程相反,内核试图把大小为 b 的空闲伙伴合并为一个大小为 2b 的单独块,满足 以下条件的两个块称为伙伴: a.两个块具有相同的大小,记做 b。 b.它们的物理地址是连续的。 c.第一个块的第一个页框的物理地址是 2*b*2^12 的倍数。 该算法迭代,如果成功合并所释放的块,会试图合并 2b 的块来形成更大的块。 为了模拟 Buddy System 算法,我采用了数的数据结构,并使用了结构体,来记录各项 数据与标记,虽然不是真正的操作系统使用的方法,但成功模拟了插入和回收的过程。 在回收时我采用物理上的合并——即删除实际的物理节点,释放空间。然而实际中可 能根据需要仅仅是删除了标记项,使之标记成没用过的,从而避免了合并,会提高下 一次的插入操作。 碎片百分比 = 碎片总大小/总内存大小 (置换算法)

操作系统中的网络协议栈及其实现

操作系统中的网络协议栈及其实现

操作系统中的网络协议栈及其实现在当今的数字化时代,网络已经成为了人们生活和工作中不可或缺的一部分。

作为连接互联网的重要中介,操作系统扮演着一个重要的角色。

操作系统中的网络协议栈是实现网络通信的核心组件,本文将对操作系统中的网络协议栈及其实现进行探讨。

一、网络协议栈的作用和基本原理操作系统中的网络协议栈是一系列网络协议的集合,用于实现数据在网络中的传输和通信。

它通过网络接口设备与物理网络相连,负责数据封装、分组、路由和传输等一系列工作。

网络协议栈按照分层结构组织,通常包括物理层、数据链路层、网络层、传输层和应用层等不同的层次。

1. 物理层物理层是网络协议栈的最底层,负责将数字数据转换为物理信号,并通过物理介质进行传输。

它关注的是物理连接、电气特性和传输速率等问题。

2. 数据链路层数据链路层建立在物理层之上,负责将数据分组组装为数据帧,并通过物理介质传输。

它包括逻辑链路控制、介质访问控制和数据帧的错误检测和纠正等功能。

3. 网络层网络层负责数据在网络中的路由选择和传输控制。

它提供了网络互联和数据包交换的功能,具有IP地址分配、路由表维护等重要功能。

4. 传输层传输层为应用程序提供了端到端的可靠通信服务。

它通过端口号标识应用程序,负责数据的分段、重组和流控制等工作。

5. 应用层应用层是网络协议栈的最高层,提供了各种网络应用程序的接口和服务。

它包括HTTP、FTP、DNS等协议,用于实现电子邮件、文件传输、域名解析等功能。

二、网络协议栈的实现方式操作系统中的网络协议栈可以通过不同的实现方式来实现,下面介绍两种常用的实现方式。

1. 单内核实现方式单内核实现方式是指将网络协议栈的各个层次直接嵌入到操作系统的内核中。

这种实现方式的优点是效率高,因为各个层次之间可以直接进行函数调用。

然而,缺点是网络协议栈与操作系统内核紧密耦合,不够灵活,对于协议的更新和扩展需要修改内核代码。

2. 用户态协议栈实现方式用户态协议栈实现方式是指将网络协议栈的各个层次实现为用户态的进程或线程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告
实验题目:内核模块实现
姓名:
学号:
课程名称:操作系统
所在学院:信息科学与工程学院
专业班级:计算机
任课教师:
module_init(初始函数名);
module_exit(退出函数名 );
MODULE_LICENSE("GPL");//模块通用公共许可证
5、makefile文件内容基本格式
ifneq ($(KERNELRELEASE),)
obj-m:=xxx.o
else
KDIR:=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.o *.ko *.mod.c *.cmd *.markers *.order *.symvers .tmp_versions endif
说明:
1) KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量。

ifneq($(KERNELRELEASE),) 判断该变量是否为空。

2) KDIR := /lib/modules/$(shell uname -r)/build 是给KDIR这个变量赋值,值为当前linux运行的内核源码。

3) 当make的目标为all时,-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD)表明然后返回到当前目录继续读入、执行当前的Makefile。

当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。

4) 我们可以把上述的Makefile文件作为一个模板,只需要改动obj-m := hello.o这条语句就可以了:obj-m=XXX.o。

4、进入管理员权限,cd到目录下。

输入如下命令:
5、输入make命令以编译:
6、编译成功后,输入insmod命令安装自己的内核模块:
7、查看内核模块:
可以看到自己的time模块安装成功。

8、输入dmesg命令,找到自己的内核模块,查看日志:
也可以用dmesg |grep time快速筛选到自己的内核模块。

9、卸载内核模块,输入如下命令即可:
可以再用lsmod命令查看内核模块,以验证是否删除。

(二)实现数据包过滤功能的简单内核模块
1、编写实现该模块的程序,并将该文件命名为PackageFilter.c
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/netdevice.h>
#include<linux/netfilter.h>
#include<linux/netfilter_ipv4.h>
#include<linux/ip.h>
#include<linux/init.h>
static struct nf_hook_ops nfhook;//定义nf_hook_ops结构体nfhook
static unsigned char *drop = "\x73\xef\xd3\x70";
//baidu的ip地址115.239.211.112
unsigned int hook_func( const struct nf_hook_ops *ops,
struct sk_buff *skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff*))
//钩子函数
{
struct iphdr *ip = ip_hdr(skb);//提取数据包ip首部
if(ip->saddr == *(unsigned int *)drop)//与定义ip地址进行比对
{
printk("DROP PACKET FROM %d.%d.%d.%d\n",drop[0],drop[1],drop[2],drop[3]);
//如果符合,丢弃
return NF_DROP;//返回丢弃信号
}
else//否则打印该网址
{
unsigned char *p = (unsigned char *)&(ip->saddr);
printk ("ALLOWED PACKET FROM %d.%d.%d.%d\n",p[0],p[1],p[2],p[3]);
return NF_ACCEPT;//返回接受信号
}
}
static int __init hook_init(void)//hook注册函数
{
nfhook.hook = hook_func;//关联定义的函数
nfhook.hooknum = NF_INET_PRE_ROUTING;//说明hook点
nfhook.pf = PF_INET;//说明处理协议是什么,ipv4为PF_INET
nfhook.priority = NF_IP_PRI_FIRST;//说明优先级
nf_register_hook(&nfhook);//注册hook
return 0;
}
static void __exit hook_exit(void)//退出该模块
{
nf_unregister_hook(&nfhook);
}
module_init(hook_init);
module_exit(hook_exit);
MODULE_LICENSE("Dual BSD/GPL");
2、编辑Makefile文件:
ifneq ($(KERNELRELEASE),)
obj-m:=PackageFilter.o
else
KDIR:=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.o *.ko *.mod.c *.cmd *.markers *.order *.symvers .tmp_versions
endif
3、将以上两个文件(PackageFilter.c和Makefile)放在同一个目录mykernel下。

4、进入管理员权限,cd到目录下。

输入如下命令:
5、输入make命令以编译:
6、编译成功后,输入insmod命令安装自己的内核模块,再查看内核模块:
可以看到自己的time模块安装成功:
7、输入dmesg命令,找到自己的内核模块,查看日志:
(截取部分结果)8、卸载内核模块,输入如下命令即可:
可以再用lsmod命令查看内核模块,以验证是否删除。

五、实验数据(现象)处理分析
实验现象在上面的实验步骤中已有详细说明,这里只给出实验结果:
1、输出内核时间
2、数据包过滤
六、实验结论
通过本次实验,我基本熟悉了Linux内核模块实现流程——先编写相关模块代码,编写makefile文件,编译,安装模块,查看模块,查看日志,卸载模块。

同时对Netfilter 框架有了一定的了解。

明白了Netfilter的基本工作原理,和hook函数的一些简单的编写。

同时验证了编写的内核模块程序,完成了实验要求的目标。

相关文档
最新文档