操作系统原理-实验-linux增加系统调用
中国地质大学(武汉)《操作系统原理》课程实验报告
数据科学与大数据技术专业
班级195182学生姓名钟欢
任课教师康晓军
完成时间2020年3月31日
实验一——实现一个linux的系统调用
一、实验目的
1.加深对系统调用的理解,掌握增加与调用系统调用的方法。
2.掌握内核编译方法。
二、实验思路
1.增加新的系统调用:
新增的系统调用名为Hello,其功能是打印输出“This is ZhongHuan ’ s system call ! wo zhong yu cheng gong le !”
2.编译内核:
用编译内核的方法,将其增加进内核源码并编译内核。
3.测试:
在用户控件编写测试程序测试该系统调用。
三、实验步骤
1.系统调用的添加
在Linux中添加新的系统调用,需执行多个步骤才能添加成功:
(1)第一步
完成系统调用函数在内核源码目录kernel/sys.c文件中编写待添加的系统调用函数。
该函数的名称应该是新的系统调用名称前面加上sys_标志。
新加的系统调用为hello(void),在kernel/sys.c文件中添加源代码:asmlinkage long sys_hello(void)
{
printk("This is ZhongHuan's system call! wo zhong yu cheng gong le!");
return 1;
}
(2)第二步
在系统函数表中表项添加新的系统调用后,需要让Linux内核的其余部分知晓该程序的存在。
在内核源码目录arch/x86/entry/syscalls下修改文件syscall_64.tbl。
该文件用来对sys_call_table[]数组实行原始化,数组包含指向内核中每个系统调用的指针。
在该文件中的最后一行添加自己的系统调用表项:335 64 hello sys_hello(),这样就在数组中添加了新的内核函数指针。
(3)第三步
添加系统调用号在内核源码目录arch/x86/include/asm下修改头文件unistd_32.h。
该文件包含系统调用清单,用来给每个系统调用分配一个独一的号码。
文件中每一行的格式如下:
#define__NR_nameNNN
其中,name用系统调用名称代替,而NNN则是该系统调用对应的号码。
应该将新的系统调用名称加到清单的结尾,并给它分配号码序列中下一个可用的系统调用号。
在该文件后面添加系统调用号:
#define__NR_hello 335
修改系统中所用的系统调用数目:
#define_NR_syscalls 336
这里系统调用号为335,是因为Linux-2.6内核自身的系统调用号码已经用到334,新添加的系统调用号不能与前面已有的重复。
至此系统调用的
添加已经完成,然后就是重新编译内核,用新的内核引导即可使用新的系统调用。
新系统调用的测试代码中,使用syscall()函数,通过指定它的调用索引和一组参数来调用系统调用,如syscall(335),其中335是系统调用号,因为新加的系统调用函数是无参函数,所以不需要添加参数。
2.Linux内核编译
作为自由软件,在广大爱好者的支持下,Linux内核版本不断更新。
新内核修订了旧内核的bug,并增加了许多新特性。
如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效、更稳定的内核,就需要重新编译内核通常,更新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快、更稳定,并且会修复老版本中发现的许多洞等,经常性地选择升级更新的系统内核是Linux使用者的必要操作内容。
要增加对某部分功能的支持,比如网络之类,可以把相应部分编译到内
核中(build-in),也可以把该部分编译成模块(module),动态用。
如果将要增加对某部分功能编译到内核中,在内核启动时就可以自动支持相应部分的功能,其优点是方便、快速,机器一启动,就可以使用这部分能;缺点是会使内核变得庞大,不管是否需要这部分功能,它都会存在。
建议经常使用的部分直接编译到内核中,比如网卡。
如果编译成模块,就会生成对应的.o文件,使用时动态加载,优点是不会使内核过分庞大,缺点是需要手工调用这些模块。
编译内核的流程如下:
(1)第一步:下载内核
到下载新内核到/usr/src(如linux-2.6.34.tar.bz2),然后将其解压到/usr/src目录下,得到linux-2.6.34:tar-jxvflinux-
2.6.34.tar.bz2。
如果下载的是.tar.gz(.tgz)文件,使用命令tar-zxvflinux-2.6.34.tar.gz。
(2)第二步:配置内核
配置内核之前,先用命令“makeclean”清除原有不需要的模块和文件,命令“make mrproper”把原来编译产生的垃圾删除。
配置内核可以根据需要与爱好使用下面命令中的一个。
#make config(基于文本的、最为传统的配置界面)
#make menuconfig(基于文本选单的配置界面)
#make xconfig(基于图形窗口模式的配置界面)
#make oldconfig(如只需在原来内核配置的基础上修改一些小地方,该命令会省去不少麻烦)
这几个命令中,makexconfig的界面最为友好(需要Xwindow的支持),make menuconfig次之。
进行配置时,大部分选项可以使用其缺省值,只有小部分需要根据用户不同的需要选择。
选择的原则是将与内核其他部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的主存,简化该功能相应的环境改变时对内核的影响;不需要的功能不要选;与内核关系紧密而且经常使用的部分功能代码直接编译到内核中。
在添加新的系统调用后重构内核时,执行make menuconfig,利用当前的内核配置详单设置将要编译的内核(即选择默认选项)后存盘退出即可。
(3)第三步:编译内核
在内核源码目录下执行:
#make clean(确保所有有关文件都处于最新版本状态)
#make或makezImage(编译内核,makezImage可以编译压缩形式的内核)在需要内核支持较多的外设和功能时,内核可能变得很大,此时可以利用make bzImage编译大内核。
如果选择了可加载模块,编译完内核后,需要对选择的模块进行编译:
#make modules(编译选择的模块)
#make modules_install(将编译后的模块转移到系统标准位置)
#make install(把压缩内核映象拷贝到/boot目录下,并创建相应的System.map符号链接)
(4)第四步:启动项配置
调用mkinitrd程序创建内核的initrd映象:mkinitramf–o/boot/initrd.img-2.6.34.6在/boot/grub/grub.cfg中设置启动项的配置:照着原来的inux-headers-2.6.32-24-generic增加linux-2.6.34.6。
至此,整个内核的编译就全部完成。
重启系统时,选择进入新的内核就可以使用新内核了。
3.测试添加的系统调用
编写程序验证:创建C程序并执行系统调用
(1)安装vim:在终端输入命令sudo apt-get install vim
(2)使用vim建立c文件:终端输入命令vim hello.c
(hello.c为我的文件名)
(3)键盘上点字母a,进入插入(insert)模式,在编辑区输入主程序代码(如下图,图中335为之前自己添加的系统调用号)
int main()
{
syscall(335);
syscall(335);
syscall(335);
syscall(335);
syscall(335);
syscall(335);
syscall(335);
syscall(335);
syscall(335);
syscall(335);
syscall(335);
return 0;
}
(4)保存并退出:按一下Esc键,输入:wq 点回车,则保存并退出(5)编译c程序:终端输入命令:gcc -o hello hello.c
(6)执行:终端输入命令 ./hello,终端输入dmesg查看结果
(7)完成实验
实验二——实现一个U盘的启动程序
(1)设置bios为u盘启动优先
(2)写一小段汇编程序,调用bios中断输出一个字符(或字符串)汇编程序如下:
org 0x7c00
mov ax, cs
mov ds, ax
mov es, ax
call dispstr
jmp $
dispstr:
mov ax, 0x1301
mov bx, 0x000c
mov cx, 10
mov dx, 0x1010
mov bp, BootMessage
int 0x10
ret
BootMessage: db "hello zhonghuan!", 0
times 510-($-$$) db 0
dw 0xaa55
(3)编译程序为二进制代码
(4)将程序段写入U盘的mbr
(5)开机后,屏幕输出你设定好的字符(字符串)
(6)完成实验。
编译内核-新增Linux系统调用过程
一、题目:新增Linux系统调用(1)需要重新编译Linux内核(2)增加一个Linux的系统调用(3)写一个用户程序进行调用测试。
系统调用实现的功能:计算一个数字的三次方,并打印出来。
二、版本:编译版本:Win10上虚拟机(Virtual Box) Ubuntu(64bit)15.04系统原内核版本:3.19.0编译的新内核源码版本:3.2.75不同内核版本,32位和64位文件位置以及文件名可能有所不同。
添加系统调用时要根据自己的版本的文件位置和文件名修改相应的三个文件。
三、步骤:1.前期准备:下载内核及解压1.1下载内核:1.2打开终端获得权限然后再输入su输入刚刚设置的密码。
1.3移动文件并解压下载目录2.添加系统调用2.1添加系统调用函数在文末添加调用函数。
然后保存,关闭。
2.2 添加调用函数声明在文末#endif前添加函数声明。
然后保存关闭。
2.3添加系统调用号因为前一个系统调用号是311 所以这里我们写312将原本的#defineNR_syscalls (__NR_syscall_max+1)修改为:#defineNR_syscalls (__NR_syscall_max + 2)然后保存,关闭。
3.编译内核3.1安装基本编译器套件3.2编译3.1make mrproper清除以前配置(如果是第一次编译,不用执行此操作)3.2 make menuconfig配置内核(此处选择了默认配置)3.3 make编译内核如果电脑是双核则也可以用make–j4代替make(双核编译会更快一些)接下来就是漫长的等待过程,不过要随时注意是否编译过程中因有错误而停止。
我的电脑用了两个小时。
(也有教程里用的是make bzlmage和makemodules,make bzlmage+make modules=make)4.安装内核4.1makemodules_install4.2makeinstall4.2 reboot重启(或不使用命令直接对电脑进行重启)ﻩ重启之后在开机时候开机时候,如果是虚拟机需要同时按esc和↑键出现开机启动项(如果是真机开机一般会自动出现开机启动项),选择新建的内核版本进入。
Linux内核中系统调用详解
Linux内核中系统调用详解什么是系统调用?(Linux)内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。
用户可以通过系统调用命令在自己的应用程序中调用它们。
从某种角度来看,系统调用和普通的函数调用非常相似。
区别仅仅在于,系统调用由(操作系统)核心提供,运行于核心态;而普通的函数调用由函数库或用户自己提供,运行于用户态。
随Linux核心还提供了一些(C语言)函数库,这些库对系统调用进行了一些包装和扩展,因为这些库函数与系统调用的关系非常紧密,所以习惯上把这些函数也称为系统调用。
为什么要用系统调用?实际上,很多已经被我们习以为常的C语言标准函数,在Linux 平台上的实现都是靠系统调用完成的,所以如果想对系统底层的原理作深入的了解,掌握各种系统调用是初步的要求。
进一步,若想成为一名Linux下(编程)高手,也就是我们常说的Hacker,其标志之一也是能对各种系统调用有透彻的了解。
即使除去上面的原因,在平常的编程中你也会发现,在很多情况下,系统调用是实现你的想法的简洁有效的途径,所以有可能的话应该尽量多掌握一些系统调用,这会对你的程序设计过程带来意想不到的帮助。
系统调用是怎么工作的?一般的,进程是不能访问内核的。
它不能访问内核所占内存空间也不能调用内核函数。
(CPU)(硬件)决定了这些(这就是为什么它被称作"保护模式")。
系统调用是这些规则的一个例外。
其原理是进程先用适当的值填充(寄存器),然后调用一个特殊的指令,这个指令会跳到一个事先定义的内核中的一个位置(当然,这个位置是用户进程可读但是不可写的)。
在(Intel)CPU中,这个由中断0x80实现。
硬件知道一旦你跳到这个位置,你就不是在限制模式下运行的用户,而是作为操作系统的内核--所以你就可以为所欲为。
进程可以跳转到的内核位置叫做sysem_call。
这个过程检查系统调用号,这个号码告诉内核进程请求哪种服务。
然后,它查看系统调用表(sys_call_table)找到所调用的内核函数入口地址。
计算机操作系统实验指导计算机系统调用
使用内核编译法添加系统调用
为了验证系统调用是否成功,编写验证代码如下。 #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
邓 豪--操作系统原理实验报告二
进程创建实验报告计科1301 邓豪学号:1309050158一、实验环境:Win7 64位操作系统(4g内存)VMware Workstation 10虚拟机虚拟机系统:ubuntu-14.04.1二、实验内容:(1)进程创建(2)生产者与消费者(3)读者和写者三、实验步骤:(1)进程创建:使用系统调用fork()创建一个子进程。
当此程序运行时,在系统中有一个父进程和一个子进程同步运行,在程序中分别获得父进程和子进程的进程号编写程序:编译并运行:编译上面程序,观察父进程和子进程的PID号有何关系?可以看到子进程的pid比父进程的pid大1父进程和子进程的关系是子进程是父进程的一个副本,创建子进程后,子进程会有自己的空间,然后把父进程的数据拷贝到子进程的空间里。
运行时,谁先运行是不确定的,这有系统决定如何区分父进程和子进程?父进程从fork()返回时的返回值是子进程的进程号,大于零;而子进程从fork()返回(严格来说子进程是从这里开始的)时的返回值是0。
getpid获得进程号和fork创建返回的PID号有何关系?getpid获得的进程号是当前进程的PIDfork创建返回的PID号是在父进程中返回子进程的PID,大于0扩展:父子进程的同步:编译运行结果:上一段程序中父进程执行完exit退出,再执行子进程这段程序中,父进程执行完不会exit,而是直接执行子进程,然后再依次exit 如果没有父进程中的wait(0),会出现什么现象?父进程会在打印语句结束后直接exit使用ps -aux查看子进程的状态。
如果将子进程中sleep系统调用改成系统调用pause( ),将什么结果?试实验之。
【如果一个进程休眠,而没有进程通知将导致其一直睡眠下去。
】子进程会不exit扩展:多进程运行的结果不可重现编译运行:由于三个进程共享代码区,所以相当于各自有各自的全局变量,所以为了保证结果正确,需在内存在设置一篇数据共享区用来存放共享变量。
linux应用程序的编写实验原理
Linux应用程序的编写实验原理1. 概述本文档旨在介绍Linux应用程序的编写实验原理。
Linux是一种开源操作系统,拥有强大的稳定性和灵活性,因此在开发应用程序时,使用Linux作为开发平台是很常见的选择。
本文将介绍Linux应用程序的基本概念和原理,并提供一些编写实验的指导。
2. Linux应用程序概念Linux应用程序是为Linux操作系统编写的软件程序。
它们通过使用系统调用和相关的库函数与操作系统进行交互。
Linux应用程序可以包括命令行工具、图形界面程序和服务器端应用程序等。
3. Linux应用程序编写原理要编写一个Linux应用程序,需要掌握以下原理:3.1 系统调用系统调用是Linux应用程序与操作系统之间的接口。
通过系统调用,应用程序可以请求操作系统提供各种服务,如文件操作、进程管理、网络通信等。
常用的系统调用包括open、read、write、fork、exec等。
3.2 进程和线程管理Linux应用程序是以进程或线程的形式运行的。
进程是一个独立的执行实体,拥有自己的地址空间和系统资源。
线程是进程内的一个执行单元,多个线程可以共享同一进程的资源。
编写Linux应用程序时,需要了解进程和线程的创建、销毁和调度等管理操作。
3.3 文件操作Linux应用程序可以通过文件操作来读写文件。
文件可以是文本文件、二进制文件、设备文件等。
在编写应用程序时,需要使用相关的系统调用和库函数,如open、read、write、close等,来进行文件的打开、读写和关闭操作。
3.4 网络通信Linux应用程序可以通过网络进行通信。
常用的网络通信方式包括套接字编程和网络协议。
套接字编程提供了一种通用的网络编程接口,可以实现不同主机之间的数据传输。
网络协议则规定了数据在网络中的传输方式和格式。
编写网络应用程序需要了解套接字编程和网络协议。
3.5 图形界面编程Linux应用程序可以利用图形界面提供用户友好的交互方式。
操作系统原理实验2-Linux操作系统命令接口
《操作系统原理》实验报告
实验序号:2 实验项目名称:Linux操作系统命令接口
挑战3:历史命令
挑战4:数据提取
四、实验结果与数据处理
1.查看用户
2.检查权限
3.创建文件
4.创建目录
5.复制文件
6.删除文件
7.预声明变量
8.变量赋值
9.查看变量
10.查找文件
11.打包文件
12.解压文件
13.检查磁盘
14.查看ls命令的帮助信息
15.进入文件添加任务
16.顺序执行多条命令
17.打印全部文件
18.使用管道一行一行查看
19.打印某个字段的某一行
20.默认字典排序
21.删除"hello shiyanlou" 中所有的'o','l','h'
22.将"hello" 中的ll,去重为一个l
23.将输入文本,全部转换为大写或小写输出
24.数据流重定向
25.进程 = 可执行程序 + 该进程对应的内核数据结构
26.linux操作系统基本概念:操作系统按用户数量可以分为单用户系统和多用户系统。
比如Windows就是典型的单用户系统,Linux就是典型的多用户系统。
多用户系统就是一台能并发和独立地执行分别属于两个和多个用户的若干应用程序的计算机。
27.显示环境变量
28.列出指定用户的所有进程
29显示所有进程
30.将在后台运行的作业放到前台运行
31.访问日志
32.历史命令
33.寻找文件,提取数据见上
五、分析与讨论
上机的命令有很多,要重复操作,才能熟练掌握
六、教师评语成绩。
实验一进程管理实验
实验一linux进程的创建与控制【实验目的】1、加深对进程概念的理解,明确进程和程序的区别;2、进一步认识并发执行的实质;3、分析进程争用资源的现象,学习解决进程互斥的方法;【实验环境】编程环境:TC或者VC操作系统软件: linux【准备知识】一.基本概念1、进程的概念;进程与程序的区别。
2、并发执行的概念。
3、进程互斥的概念。
二.系统调用系统调用是一种进入系统空间的办法。
通常,在OS的核心中都设置了一组用于实现各种系统功能的子程序,并将它们提供给程序员调用。
程序员在需要OS提供某种服务的时候,便可以调用一条系统调用命令,去实现希望的功能,这就是系统调用。
因此,系统调用就像一个黑箱子一样,对用户屏蔽了操作系统的具体动作而只是控制程序的执行速度等。
各个不同的操作系统有各自的系统调用,如windows API,便是windows的系统调用,Linux的系统调用与之不同的是Linux由于内核代码完全公开,所以可以细致的分析出其系统调用的机制。
三.相关函数。
1 fork( )函数fork()函数创建一个新进程。
其调用格式为:int fork();其中返回int 取值意义如下:正确返回:等于0:创建子进程,从子进程返回的ID值;大于0:从父进程返回的子进程的进程ID值。
错误返回:等于-1:创建失败。
2 wait( )函数wait()函数常用来控制父进程与子进程的同步。
在父进程中调用wait()函数,则父进程被阻塞,进入等待队列,等待子进程结束。
当子进程结束时,会产生一个终止状态字,系统会向父进程发出SIGCHLD信号。
当接到信号后,父进程提取子进程的终止状态字,从wait()函数返回继续执行原程序。
其调用格式为: #include <sys/type.h> #include <sys/wait.h> (pid_t) wait(int *statloc);正确返回:大于0:子进程的进程ID值;等于0:其它。
操作系统实验1-Linux系统操作使用
第1章Linux系统操作使用一、Linux操作系统简介Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux 版本,但它们都使用了Linux内核。
Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。
Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。
严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核、并且使用GNU 工程各种工具和数据库的操作系统。
Linux得名于天才程序员林纳斯·托瓦兹。
Linux 操作系统的诞生、发展和成长过程始终依赖着五个重要支柱:UNIX 操作系统、MINIX 操作系统、GNU 计划、POSIX 标准和Internet 网络。
1981 年IBM公司推出微型计算机IBM PC。
1991年,GNU计划已经开发出了许多工具软件,最受期盼的GNU C编译器已经出现,GNU的操作系统核心HURD一直处于实验阶段,没有任何可用性,实质上也没能开发出完整的GNU操作系统,但是GNU奠定了Linux用户基础和开发环境。
1991年初,林纳斯·托瓦兹开始在一台386SX兼容微机上学习minix操作系统。
1991年4月,林纳斯·托瓦兹开始酝酿并着手编制自己的操作系统。
1991 年4 月13 日在comp.os.minix 上发布说自己已经成功地将bash 移植到了minix 上,而且已经爱不释手、不能离开这个shell 软件了。
1991年7月3日,第一个与Linux有关的消息是在comp.os.minix上发布的(当然此时还不存在Linux这个名称,当时林纳斯·托瓦兹的脑子里想的可能是FREAX,FREAX的英文含义是怪诞的、怪物、异想天开等)。
1991年的10月5日,林纳斯·托瓦兹在comp.os.minix新闻组上发布消息,正式向外宣布Linux内核的诞生(Freeminix-like kernel sources for 386-AT)。
操作系统原理第一次实验
内容三:敲通如下程序,写出运行结果,分析程序功能。
#include <stdio.h>
#include <pthread.h>
void *ptest(void *arg)
{
printf(" This is the new thread!" );
return(NULL);
}
main()
3
{
pthread_t tid;
实验一进程管理、管道通信
一.实验名称:
进程管理、管道通信
二.实验目的:
1、熟悉linux下利用gcc、gdb编译、调试C程序
2、掌握进程的概念,明确进程的含义
3、认识并了解并发执行的实质
4、掌握进程间无名管道的通信
三.实验准备:
1、预习linux下利用gcc编译c程序。
2、参考课件及资料掌握进程的创建过程。
thread!”返回值为空,程序休眠后结束程序。
图三
内容四:敲通管道通信(课件)例题,写出运行结果,分析程序功能
#include<stdlib.h>
#include<stdio.h>
voidmain()
{
int x,fd[2];
char buf[30],s[30]; pipe(fd); while((x=fork())==-1); if(x==0)
3、参考课件及资料掌握进程的并发执行。
4、参考课件及资料掌握进程间无名管道的通信。
四.实验内Байду номын сангаас:
内容一:敲通如下程序,分析运行结果。
#include <stdio.h>
main()
操作系统原理_实验报告
一、实验目的1. 理解操作系统基本原理,包括进程管理、内存管理、文件系统等。
2. 掌握操作系统的基本命令和操作方法。
3. 通过实验加深对操作系统原理的理解和掌握。
二、实验环境1. 操作系统:Linux2. 编程语言:C语言3. 开发工具:Eclipse三、实验内容本次实验主要分为以下几个部分:1. 进程管理实验2. 内存管理实验3. 文件系统实验四、实验步骤及结果1. 进程管理实验实验步骤:- 使用C语言编写一个简单的进程管理程序,实现进程的创建、调度、同步和通信等功能。
- 编写代码实现进程的创建,通过调用系统调用创建新的进程。
- 实现进程的调度,采用轮转法进行进程调度。
- 实现进程同步,使用信号量实现进程的互斥和同步。
- 实现进程通信,使用管道实现进程间的通信。
实验结果:- 成功创建多个进程,并实现了进程的调度。
- 实现了进程的互斥和同步,保证了进程的正确执行。
- 实现了进程间的通信,提高了进程的效率。
2. 内存管理实验实验步骤:- 使用C语言编写一个简单的内存管理程序,实现内存的分配、释放和回收等功能。
- 实现内存的分配,采用分页存储管理方式。
- 实现内存的释放,通过调用系统调用释放已分配的内存。
- 实现内存的回收,回收未被使用的内存。
实验结果:- 成功实现了内存的分配、释放和回收。
- 内存分配效率较高,回收内存时能保证内存的连续性。
3. 文件系统实验实验步骤:- 使用C语言编写一个简单的文件系统程序,实现文件的创建、删除、读写等功能。
- 实现文件的创建,通过调用系统调用创建新的文件。
- 实现文件的删除,通过调用系统调用删除文件。
- 实现文件的读写,通过调用系统调用读取和写入文件。
实验结果:- 成功实现了文件的创建、删除、读写等功能。
- 文件读写效率较高,保证了数据的正确性。
五、实验总结通过本次实验,我对操作系统原理有了更深入的理解和掌握。
以下是我对实验的几点总结:1. 操作系统是计算机系统的核心,负责管理和控制计算机资源,提高计算机系统的效率。
