linux操作系统实验报告
linux操作系统实验报告(精选9篇)
linux操作系统实验报告 第1篇
Linux实验报告一
一、实验步骤及内容
1.虚拟机软件的安装
(1)先准备虚拟机安装包。
(2)更改安装路径:
“D: VMwareVMware Workstationvmware.exe”
(3)输入序列号:ctrl+v,在安装过程中不能进行复制剪切操作。
(4)不能重新启动,才能继续安装汉化版D: vmwarevmware workstation
2.新建一个虚拟机并进行配置
(1)单击新建虚拟机虚拟机的类型选择:典型安装 选择客户端操作系统 :linux虚拟机的名字及位置根据需要网络类型选择:,桥接。指定的磁盘容量删除软驱:双击 floppy—remove虚拟内存设置:双击memory—1024MB设置linux的安装文件:选择安装镜像文件—指定第一个安装文件—就可以啦!之后会提示安装第二个安装文件 就进行选择第二个 中间鼠标切换用CTRL+ALT。
3.安装LINUX操作系统
(1)要确定鼠标是否在虚拟机的激活状态下:敲回车不需要检测安装文件选择 skip进入linux的安装前的配置选项:选择安装的语言—中文简体键盘:--默认鼠标:--默认安装类型:--workstation磁盘分区:--自动分区引导程序:默认网络配置:默认防火墙:无防火墙支持的语言:中文时区:亚洲-上海密码:root123456安装的软件包:全部。
二 .在已有虚拟机软件的基础上安装LINUX的技巧。
(1)新建虚拟机—典型安装—linux ,red hat linux---给虚拟机命名,并且指定安装位置d:red hat linux---桥接---10G。
(2)在刚才建立的虚拟机上安装linux系统.(3)配置要安装的linux系统的安装文件iso镜像文件
(4)选择配置好linux镜像文件刚才建立的虚拟机,启动虚拟机,开始安装。
三 .实验总结
充分了解linux系统的安装,学会新建虚拟机,在虚拟机上安装linux系统.和一些简单的技巧并对此门课程有了一定的兴趣。
linux操作系统实验报告 第2篇
组员:武易 金鹏飞 周长升
实验一 熟悉嵌入式系统开发环境
一实验目的
1.熟悉嵌入式系统硬件实验平台 2.掌握超级终端配置方法。
3.掌握嵌入式系统开发环境配置,ARM-Linux下NFS服务器的配置方法 4.掌握常用的 Linux下shell命令
二实验设备及工具
硬件:UP-NETARM2410-S嵌入式实验仪、PC机pentumn500以上、硬盘40G以上、内存大于256M。
软件:PC机操作系统REDHAT LINUX 9.0、MINICOM、AMRLINUX开发环境
三实验内容
(1)掌握嵌入式系统实验平台上的各类借接口的位置;
(2)配置windows的超级终端,熟悉vivi的命令行,bootload、kernel、root和用户程序的介绍;
(3)配置linux的终端,配置网络服、Ip地址,开发目录共享,挂载等。
四实验结果
实验二嵌入式Linux程序设计
一实验目的
1.掌握嵌入式Linux软件设计方法原理 2.掌握Makefile文件设计方法。
3.熟悉Linux下静态库和共享库的设计
二实验设备及工具
硬件:UP-NETARM2410-S嵌入式实验仪、PC机pentumn500以上、硬盘40G以上、内存大于256M。
软件:PC机操作系统REDHAT LINUX 9.0、MINICOM、AMRLINUX开发环境
三实验内容
(1)编写一个带输入、输出的由5个文件组成的嵌入式软件;(2)写好makefile文件,并上机调试;(3)用变量指明两种编译器。
四实验结果
实验三
kernel与root的设计和烧写
一实验目的
1.掌握Linux内核配置与裁剪的方法 2.理解根文件系统配置。
3.掌握嵌入式系统内核和根文件系统的烧写的过程
二实验设备及工具
硬件:UP-NETARM2410-S嵌入式实验仪、PC机pentumn500以上、硬盘40G以上、内存大于256M。
软件:PC机操作系统REDHAT LINUX 9.0、MINICOM、AMRLINUX开发环境
三实验内容
对嵌入式Linux系统进行裁剪、配置和编译,生成自己需要的操作系统映像文件,并将其烧写到flash中。
四实验结果
实验四搭建嵌入式系统开发环境
一实验目的
1.掌握嵌入式开发环境的配置 2.掌握开发工具链的安装与配置。
3.掌握嵌入式系统内核和根文件系统的烧写的过程
二实验设备及工具
硬件:UP-NETARM2410-S嵌入式实验仪、PC机pentumn500以上、硬盘40G以上、内存大于256M。
软件:PC机操作系统REDHAT LINUX 9.0、MINICOM、AMRLINUX开发环境
三实验内容
(1)安装配置嵌入式开发环境;(2)安装与配置工具链;(3)内核和根文件系统的烧写
四实验结果
实验五嵌入式驱动程序设计
一实验目的
1.学习在LINUX 下进行驱动设计的原理
2.掌握使用模块方式进行驱动开发调试的过程
二实验设备及工具
硬件:UP-NETARM2410-S嵌入式实验仪、PC机pentumn500以上、硬盘40G以上、内存大于256M。
软件:PC机操作系统REDHAT LINUX 9.0、MINICOM、AMRLINUX开发环境
三实验内容
在PC 机上编写简单的虚拟硬件驱动程序并进调试,实验驱动的各个接口函数的实现,分析并理解驱动与应用程序的交互过程。
四实验结果
实验六
S3C2410处理器硬件电路设计
一实验目的
1.熟悉硬件电路设计
2.掌握简单的S3c2410处理器的电路设计。3.掌握protel软件的使用
二实验设备及工具
硬件:UP-NETARM2410-S嵌入式实验仪、PC机pentumn500以上、硬盘40G以上、内存大于256M。
软件:PC机操作系统REDHAT LINUX 9.0、MINICOM、AMRLINUX开发环境
三实验内容
使用protel 99se 做s3c2410处理器最小系统电路设计,A/D数据采集模块电路设计。
linux操作系统实验报告 第3篇
“操作系统”课程在计算机科学与技术专业或者电子信息工程专业中是一门必修的专业基础课, 本课程的学习目的是让学生掌握操作系统的基本概念、基本原理、设计方法和实现技术[1,2], 为后续课程的学习以及今后在相关领域的工作打下坚实基础。
“操作系统”是一门比较抽象的课程, 原理性的内容较多, 为了让学生能比较高效的理解并掌握相关的原理, 实验教学在“操作系统”课程的教学中是必不可少的。因此, 我们不仅要开设相关的实验内容, 而且还要重视实验, 使其很好地辅助课堂教学。实验教学的质量直接影响学生的就业机会和工程实践能力。德国教育家第斯多惠曾经说过:“教学的艺术不在于传授的本领, 而在于激励、唤醒和鼓舞。”实验教学的重点就是培养学生的好奇心和求知欲, 帮助学生自主学习、独立思考, 鼓励学生发现问题、提出问题, 并通过实验过程找到解决问题的方法和途径。
二、实验平台的选择
常用的桌面操作系统有Windows、Linux以及MAC。其中Windows系统是大部分学生最为熟悉的, 但Windows操作系统本身是个黑盒子, 因此在学习使用上具有一定的局限性。另外, 在有些专业的课程体系中, “操作系统”还是“嵌入式系统”的前导课程, 不仅肩负着让学生了解掌握操作系统的原理的使命, 还要让学生熟悉嵌入式系统开发所用的操作系统平台。在嵌入式开发中, Linux常作为首选的操作系统。Linux的另外一个优势是, 它是源码公开的实用的现代操作系统。因此, 利用Linux作为操作系统实验的平台, 不但能够帮助学生进行以理解操作系统原理为目的的实验, 同时也可以看作是操作系统开发实战的演练[5]。
三、教学现状
近些年来, 各高校特别是以工科为主的高校, 都在强调培养以应用型为主本科人才, 其目标是“理论够用, 注重实践”。要让学生在就业的时候有够硬的本领, 就要求在本科的教学中, 除了理论知识的学习之外, 要加强学生的动手实践。因此, 实验教学的重要性不言而喻。对于“操作系统”这门计算机类的专业课程, 其实验教学有着同样的重要性。然而在实际的实验教学活动中, 要让学生真正完成好操作系统的实验内容却并不是件容易的事情。其原因大致有三。首选是, “操作系统”这门课是典型的理论性较强且实验内容对前导课的依赖性大。因而, 如果前导课程的基础没打牢, 到“操作系统”这门课, 特别是做实验的时候, 就会打击一些学生的学习热情, 甚至有可能直接放弃了操作系统实验作业的完成。其次是, 因为选用实验平台的操作系统是Linux, 这在实验难度上又是对学生的一个考验。最后一个因素是, 现在网络已经是触手可得, 网络上的资料也比比皆是。从而容易造成学生对实验作业, 往往是不经自己的努力, 直接从网络上拷贝一份交差了事, 或者直接抄袭已做好的同学。这自然也影响了实际的教学效果。
四、提高实验教学的对策
首选, 在教学内容上尽量化难为易, 并从主观方面和客观方面进行有效引导。第一次的实验课, 往往也是学生热情度最高的时候, 因此在第一次实验课上要多下功夫, 以激发学生的学习积极性。其次, 实验的内容要有层次性, 不能对所有的学生都是一个标准。学生的能力水平毕竟是有差异的。实验内容的设计上, 既要照顾水平一般的同学, 也有考虑到能力较强的同学, 使大部分的同学都能比较顺利地完成实验内容, 又有可以提高的部分, 这也既能延续大部分同学的学习热情, 有利于挖掘优秀学生的潜能。第三, 加强实验考核。大部分的实验教学都是非独立开设的实验, 因此在期末的考核中往往没有独立的考核标准, 这也容易给学生一种应付的心理。在实验作业的完成过程中, 对于稍微难点的实验内容, 有些同学就会有不想努力直接抄袭现成的答案。这对于提高实验的教学质量是很不利的。因此, 可以考虑在期末的考核中, 加入实验的考核, 并提高实验考核在期末总成绩中所占的分值。
五、总结
“操作系统”在计算机类专业和电子信息类专业中, 是一门核心课程, 在专业的课程体系中有着举足轻重的作用。因此, 提高操作系统的实验教学质量是我们的目标。为了提高人才培养质量, 我们需要不断从教学实践中加以发现和总结, 努力培养出更多满足社会需要的应用型人才。
摘要:操作系统的实验教学对于提高学生的动手实践能力以及对操作系统原理的理解是至关重要的。本文针对操作系统实验教学现状中存在的一些问题, 结合自身的教学体会, 对提高实验教学质量进行研究与探索。
关键词:操作系统,Linux,实践教学
参考文献
[1]谢青松, 范辉, 操作系统课程教学之我见[J].计算机教育, 2004 (09) :75.
linux操作系统实验报告 第4篇
关键词: Docker 虚拟化 Linux桌面
Linux已经成为一门计算机网络专业必学的课程,以往实验机房都是使用vmware安装Linux虚拟,效果还可以,但是当需要虚拟多个Linux服务器时,机器的cpu和内存占用率就会变得相当高,系统出现卡顿现象,影响学生使用。而Docker的出现,可以很好地解决这个问题,它比vmware更轻量,启动速度更快,效率更高,单台设备能跑上百个虚拟机容器。图1、图2比较了Docker和传统虚拟化方式的不同之处,可见Docker是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
图1
图2
在windows安装Docker需要安装Boot2Docker,安装完运行后如图3所示:
图3
要使用Linux的桌面系统,我们需要到Docker官方网站去下载dorowu/ubuntu-desktop-lxde-vnc这个容器,可以在Boot2Docker的提示符界面输入docker pull dorowu/ubuntu-desktop-lxde-vnc,但是由于官方源下载速度的原因,运行了没有反应,只能通过国内的Docker镜像源实现下载,我使用http://www.daocloud.io/提供的Docker Hub加速器,安装它的主机监控程序使用命令:curl-sSL https://get.daocloud.io/daomonit/install.sh | sh -s 813a0da61980bfe943712607921a3084d5938ac8,再去下载容器的时候,使用dao pull dorowu/ubuntu-desktop-lxde-vnc即可。下載完成后,就可启用虚拟机容器,使用命令docker run-d-p 80:6080 dorowu/ubuntu-desktop-lxde-vnc,我们就可以在firefox浏览器中输入地址,我容器的地址为192.168.59.103,所以地址为http://192.168.59.103/vnc.html,弹出登录界面,输入密码ubuntu,即可登录Linux的桌面系统,如图4、图5:
图4
图5
Docker官方网站提供了非常多的容器可供使用,通过Docker的pull命令,我们可以非常方便地发布各种不同的Linux实验环境给学生使用,提高了效率,也充分利用了学校实验机房的现有资源。
参考文献:
[1]第一步Docker书.
linux驱动程序实验报告 第5篇
院系名称
学生姓名学号专业名称班
级时间
实验报告
****年**月**日 至
年
月 日
: : : : : :
实验题目 字符设备驱动程序
一、实验目的
通过编写一个简单的C语言字符设备驱动程序,来加深对上次的内存管理实验的复习,以及对本次学习的字符设备驱动的应用。
二、实验内容
编写一个字符设备驱动程序,以内核模块的形式插入内核,编译方法与内核编译方法一致。创建设备节点,然后通过编写一个测试程序,输出“hello world!”。
三、实验步骤
用C语言编写一个字符设备驱动程序;
编译,链接,将程序插入内核模块中;
创建设备节点,编写测试程序,运行输出“hello world”。
四、调试以及运行过程
因为用的是学校的电脑,在运行时,就出现错误。开始是怎么都插不进去模块。最后发现原来是makefile文件开始用小写,后来改成Makefile,,竟然对了。虽然最后显示内核模块插入了,但是无法进行编译,总是显示,无法正常运行。最后,把代码拷进同学电脑里,对了。才发现,有时要相信自己,换一个位置去试,就会发现惊喜。
五、心得体会
对于程序,我们要多练,才能懂得其真正的用处在哪里。没有编写程序运行前只知道一点皮毛,真正操作后才会受益匪浅。通过编写字符设备驱动程序,我知道了当我们不会写代码时,可以先试着把别人的类似代码敲一遍,然后找出那种属于自己的感觉,理解清楚别人的思想,然后根据需要编写属于自己的代码。
六、源代码
1.字符设备驱动程序
#include
#define DP_MAJOR 250 #define DP_MINOR 0 //定义变量
static int char_read(struct file *filp,char __user *buffer,size_t,loff_t *);static int char_open(struct inode *,struct file *);static int char_write(struct file *filp,const char __user *buffer,size_t ,loff_t*);static int char_release(struct inode *,struct file *);static int chropen;struct cdev *chardev;static int len;//file_operations结构中的每个函数都对应一个具体的功能,也就是对设备的不同操作 static const struct file_operations char_ops = {.read = char_read,.write = char_write,.open = char_open,.release = char_release, };//设备驱动模块加载函数
static int __init char_init(void){ dev_t dev;printk(KERN_ALERT“Initing......n”);dev=MKDEV(DP_MAJOR,DP_MINOR);chardev = cdev_alloc();if(chardev==NULL){ return-1;} if(register_chrdev_region(dev,10,“chardev”)){ printk(KERN_ALERT“Register char dev errorn”);return-1;} chropen=0;len=0;cdev_init(chardev,&char_ops);if(cdev_add(chardev,dev,1)){ printk(KERN_ALERT“Add char dev errorn”);} return 0;} //文件打开函数会在设备结构体指针赋值给私有数据
static int char_open(struct inode *inode,struct file *file){ if(chropen==0)chropen++;Else { printk(KERN_ALERT“Another process open the char devicen”);return-1;} try_module_get(THIS_MODULE);return 0;} //释放函数
static int char_release(struct inode *inode,struct file *file){ chropen--;module_put(THIS_MODULE);return 0;} //读函数
static int char_read(struct file *filp,char __user *buffer,size_t length,loff_t *offset){ if(length<12){ if(!copy_to_user(buffer,“hello world!”,length)){ return 0;} } else { if(!copy_to_user(buffer,“hello world!”,strlen(hello,world!“"))){ return 0;} } return-1;} //写函数
static int char_write(struct file *filp,const char __user *buffer,size_t length,loff_t *offset){ return 0;} //设备驱动模块卸载函数
linux操作系统实验报告 第6篇
计算机科学与工程学院
《Linux及应用》实验报告
题目: 《Linux及应用》实验报告
专业:计算机科学与技术
班级:计科班
学生姓名:
学号:200908
12011 年 11 月 14 日
Linux及应用课程实验报告
(大连民族学院 计算机科学与工程学院 计科09班 2009081辽宁 大连116600)
摘要:Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了Linux的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变。这让Linux吸收了无数程序员的精华,不断壮大。关键词:linux;常用命令;TFTP、NFS 服务设置;安全性
【实验一:ls命令相关操作】
目之后添加一个符号。这些符号包括:/ 表明是一
1实验目的1.初步了解Linux的命令格式; 2.学习如何连接Linux系统; 3.实习几个文件维护命令; 4.练习ls命令的相关用法。
个目录;@ 表明是到其它文件的符号链接;* 表明是一个可执行文件。
2.3 使用举例
要求:列出当前目录中所有以“t”开头的目录的详细内容,可以使用如下命令:[cc@cc ~]$ ls-l t*
这样,就可以查看当前目录下文件名以“t”开头的所有文件的信息。
其实,在命令格式中,方括号内的内容都是可以省略的,对于命令ls而言,如果省略命令参数和操作对象,直接输入“ ls ”,则将会列出当前工作目录的内容清单。
初学者在使用 ls 命令时要注意命令的格式:在命令提示符后,首先是命令的关键字,接下来是命令参数,在命令参数之前要有一短横线“-”,所有的命令参数都有特定的作用,自己可以根据需要选用一个或者多个参数,在命令参数的后面是命令的操作对象。
2实验内容
2.1ls命令
1)ls –a(all):表示列出所有的文件,包括以“.”开头的隐藏文件。位于这个列表的起首处的..和.依次是指父目录和你的当前目录。
2)ls –l(long):列举目录内容的详细信息,包括权限(模式)、所有者、组群、大小、创建日期、文件是否是到系统其它地方的链接,以及链接的指向。
2.2 其它参数
1)-d:如果其后接的是一个目录,则此只输出目录的名称
2)-t:表示列出的条目按最后修改的时间进行排序,默认是使用文件夹的名称来排序
3)-C:以文件的名称按列纵向排序 4)-r逆向(reverse):从后向前地列举目录中的内容。
5)-R递归(recursive):该选项递归地列举所有目录(在当前目录之下)的内容。
6)-S 大小(size):按文件大小排序。
7)-F 文件类型(File type):在每一个列举项
3学后反思
3.1 tab键小技巧
当忘记了一个命令的拼写, 打出尽可能多的字母, 敲tab键可以自动补齐。
3.2应用技术
ls 返回目录下的所有子文件和子目录
ls –l 返回所有子文件和子目录的详细信息,包
括创建时间, 用户名, 用户组名, 长度等.ls –a 返回目录下的所有子文件和子目录,包括隐藏文件.注意, linux下所有以.头的文件和文件夹都是隐藏的.ls--color dir 本来是windows下的命令,linux也把他引入过来.不同的文件夹有不同的颜色, 因为我们运行的ls命令实际上是ls--color.alias命令可以查看简称.我们输入一次alias ls就会发现: alias ls=’ls--color=auto’
设置时,可用 alias ls=”ls-l” 参考文献:
[1] HARRY ROGIN.Automated Testability Analysis For Design Application [C].International Test Confe-renec,1998:353-367
[2]胡大可,李培弘,方路平,基于单片机8051的嵌入式开发指南[M],电子工业出版社,2003.【实验二:Makefile的编写及应用】
1实验目的1、了解Makefile 的基本概念和基本结构
2、初步掌握编写简单Makefile 的方法
3、了解递归Make 的编译过程
4、初步掌握利用GNU Make 编译应用程序的方法
[root@local]$rm –f hello
2.2 利用GNU make 自动编译应用程序方法
1)利用文本编辑器创建一个Makefile 文件,并将其保存到与hello.c 相同的目录下。
# Makefile test for hello program #written by Emdoor CC= gcc CFLAGS= all: hello hello: hello.o
$(CC)$(CFLAGS)hello.o –o hello hello.o: hello.c
$(CC)$(CFLAGS)–c hello.c –o hello.o clean:
rm –rf hello *.o 2)先后执行如下命令 [root@local]$make [root@local]$ls
[root@51Board ~]$./hello
查看并记录所生成的文件和运行的结果。
2.3 多个.c 文件的编译
创建文件hello1.c、hello2.c、hello.h 和Makefile
//hello1.c
//written by Emdoor #include
2实验内容
2.1使用命令行的方式手动编译程序方法
1)利用文本编辑器创建hello.c 文件 //hello.c
//written by Emdoor #include
printf(“Welcome Emdoor!n”);return 1;}
2)手动编译hello 应用程序 在hello.c 的目录的终端下输入: [root@local]$ gcc –c hello.c
[root@local]$ gcc hello.o –o hello
通过ls 命令查看当前目录下是否生成源代码hello.c 的object 文件hello.o 和可执行文件hello,运行可执行文件hello。查看一下运行结果。
[root@51Board ~]$./hello
3)删除hello.o 和hello 文件 [root@local]$rm –f hello.o
printf(“Welcome Emdoor!n”);test2();return 1;}
//hello2.c
//written by Emdoor #include “hello2.h” #include
printf(“Welcome Emdoor!–hello2n”);}
//hello2.h
//written by Emdoor void test2(void);
【实验三:TFTP、1实验目的熟悉在Linux下配置基本网络服务TFTP和NFS的过程。
2实验内容
1)安装tftp软件包 2)配置tftp 3)启动tftp服务 4)测试tftp服务 5)安装NFS软件包 6)配置NFS服务 7)启动NFS 8)测试NFS服务
3实验步骤
3.1、安装TFTP服务
sudo apt-get install tftpd tftp xinetd
3实验结论
两种操作的所得的最后结果一样,只不过用变量名表示某些依赖文件路径,会大大简化Makefile,使Makefile文件清晰且便于修改。
$^Makefile文件规则的目标所对应的所有依赖文件。
$@Makefile文件规则的目标文件名。
$ 4心得体会 我觉得这次实验让我感受较深的是makefile文 件的编写,一开始毫无头绪,后来请教别人,才有一点进步。还有一些生词也看不懂。 NFS 服务设置】 1)建立配置文件 在/etc/xinetd.d/下建立一个配置文件tftp sudo vi tftp 在文件中输入以下内容: service tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args =-s /tftpboot disable = no per_source = 11 cps = 100 2 flags = IPv4 } 保存退出 2)建立tftp服务文件目录(上传文件与下载文件的位置),并且更改其权限 sudo mkdir /tftpboot sudo chmod 777 /tftpboot-R 3)重新启动服务 sudo /etc/init.d/xinetd restart 至此tftp服务已经安装完成了,下面可以对其3.2、配置NFS服务1)安装nfs Ubuntu上默认是没有安装nfs服务器的,因此我们首先安装nfs服务器端: 在一些文档中,提出还需要使用apt-get来手动安装nfs的客户端nfs-common,以及端口映射器portmap,但其实这是没有必要的,因为在安装nfs-kernel-server时,apt会自动为我们把它们安装好。 2)配置/etc/exports nfs允许挂载的目录及权限在文件/etc/exports中进行了定义。3)重启服务4)测试nfs 此时可以运行以下命令来显示一下共享出来的目录: 进行一下测试。(假设在当前目录下有一个测试文件test.txt) 或者可以使用以下命令把它挂载在本地磁盘上,可以运行df命令查看是否挂载成功。查看后可以使用相关命令卸载。 4心得体会 我有时,一些文件不能进行修改时,比如出现 rm: 无法删除 “test.txt”: 权限不够,可以用sudo rm-rf test.txt 命令先修改它的权限。还有进行上传文件时,必须在主目录建立和上传文件名相同的文件。 5参考文献 系统调用的原理 1.1 概述 系统调用是一个软中断,中断号是0x80,它是上层应用程序与Linux系统内核进行交互通信的唯一接口。通过int 0x80,就可使用内核资源。不过,通常应用程序都是使用具有标准接口定义的C函数库间接的使用内核的系统调用,即应用程序调用C函数库中的函数,C函数库中再通过int 0x80进行系统调用。 所以,系统调用过程是这样的: 应用程序调用libc中的函数->libc中的函数引用系统调用宏->系统调用宏中使用int 0x80完成系统调用并返回。 另外一种访问内核的方式是直接添加一个系统调用,供自己的应用程序使用,这样就不再使用库函数了,变得更为直接,效率也会更高。 1.2 相关的数据结构 在说具体的调用过程之前,这里先要说几个数据结构。 1.2.1 系统调用函数表 系统调用函数表sys_call_table是在sys.h中定义的,它是一个函数指针数组,每个元素是一个函数指针,它的值是各个系统提供的供上层调用的系统函数的入口地址。也就是说通过查询这个表就可以调用软中断0x80所有的系统函数处理函数。 1.2.2 函数指针偏移宏 这是一系列宏,它们的定义在unistd.h中,基本形式为#define _NR_name value,name为系统函数名字,value是一个整数值,是name所对应的系统函数指针在sys_call_table中的偏移量。 1.2.3 系统调用宏 系统调用宏_syscalln(type,name)在内核的unistd.h文件中定义的,对它展开就是: type name(参数列表){ 调用过程; }; 其中,n为参数个数,type为函数返回值类型,name为所要调用的系统函数的名字。在unistd.h中共定义了4个这样的宏(n从0到3),也就是说,0.11核中系统调用最多可带3个参数。那么下面就说这个宏干了什么,也就是说上面的那个“调用过程”是怎么样的呢?在这个宏中嵌入了汇编代码,做的工作就是int 0x80,其中将字符串“_NR_”和name连接,组成一个宏并将这个宏的值,也就是被调用的系统函数在sys_call_table中偏移量送到eax寄存器中;同时指明系统函数将来的返回值放到eax中。 1.3 系统调用处理过程 下面我再说一下系统调用的核心软中断int 0x80具体干了什么。这条指令会引起CPU的软件中断,cpu会根据中断号找到中断处理程序。这个中断处理程序是在System_call.s中。在中断处理程序的工作过程大致是这样的: 1.3.1 将寄存器ds,es,fs以及存有参数的edx,ecx,ebx入栈,再ds,es,指向内核段,fs指向用户段。 1.3.2 根据eax中的偏移值,在函数表sys_call_table中找到对应的系统函数指针(函数的入口地址)。并利用call指令调用系统函数,返回后,程序把返回值加入堆栈。 1.3.3 检查执行本次系统调用的进程的状态,如果发现由于某种原因原进程没处在就绪状态或者时间片到了,就会执行进程调度函数schedule()。1.3.4 通过执行这次调用的程序的代码选择符判断它是不是普通用户程序,如果是就调用信号处理函数。若不是就直接弹出栈内容,并返回 添加一个系统调用的实验 2.1 实验内容 在linux0.11版本中添加两个系统调用,并编写一个简单的应用程序测试它们。 第一个系统调用是iam(),其原型为: intiam(const char * name);完成的功能是将字符串参数name的内容拷贝到内核中保存下来。要求name的长度不能超过23个字符。返回值是拷贝的字符数。如果name的字符个数超过了23,则返回“-1”,并置errno为EINVAL。 第二个系统调用是whoami(),其原型为: intwhoami(char* name, unsigned int size);它将内核中由iam()保存的名字拷贝到name指向的用户地址空间中,同时确保不会对name越界访存(name的大小由size说明)。返回值是拷贝的字符数。如果size小于需要的空间,则返回“-1”,并置errno为EINVAL。 2.2 代码添加修改步骤 2.2.1 在unistd.h中添加系统调用接口 #define __NR_whoami 72 #define __NR_iam 73 intwhoami(void);intaim(void); 2.2.2 在exit.c文件中添加系统调用处理函数的实现 系统调用的函数可以在其他.c文件中添加或在新建文件中添加,只要编辑进image都是可以的,这里为了调试方便就在exit.c文件中添加了。 #define MAX 23 char N_MAX[26]; intsys_whoami(char* name, unsigned int size){ if(strlen(N_MAX)>size)return-EINVAL; int i; for(i=0;N_MAX[i]!=';i++){ put_fs_byte(N_MAX[i],&name[i]);} returnstrlen(N_MAX);} intsys_iam(char *name){ char c;charstr[100];memset(str,',sizeof(str));int i; for(i = 0;i <= MAX;i++) { if((c=get_fs_byte(&name[i]))!=') { str[i] = c; } else break;} if((c!= ')||(i>MAX)) { return-EINVAL;} memset(N_MAX,',sizeof(N_MAX)); for(i=0;str[i]!=';i++){ N_MAX[i]=str[i];} return i;} 2.2.3 在system_call.s汇编代码中修改系统调用的个数 #If 0 nr_system_calls = 72 #else nr_system_calls = 74 #endif 2.2.4 测试代码的编写test.c的代码如下: #define __LIBRARY__ #include int main(){ int a = 0;char bb[26] = “champion”;char cc[26] = “"; a = iam(bb);printf(”a=%d“, a); a = whoami(cc,8);printf(”iam=%sn“,cc);return(1);} 系统调用相关代码的分析 3.1 初始化软件中断门。 3.1.1 函数调用层次 初始化软件中断门,就是把0x80软件中断的处理函数system_call挂载到中断向量表idt中,以确保发生软件中断时会运行system_call函数,这个函数在system_call.s实现。初始化的流程如下: main()sched_init()set_system_gate(0x80, &system_call)_set_gate 3.1.2 初始化宏_set_gate的原型 /* 传入的四个参数说明如下: gate_addr =&idt[0x80]软件中断门的地址。type= 15type为门类型 dpl = 3dpl为请求特权级 addr = &system_call = 0x7119通过查找system.map可以查到中断处理程序的地址 */ #define _set_gate(gate_addr,type,dpl,addr)__asm__(”movw %%dx,%%axnt“ ”movw %0,%%dxnt“ ”movl %%eax,%1nt“ ”movl %%edx,%2nt“ : : ”i“((short)(0x8000+(dpl<<13)+(type<<8))), ”o“(*((char *)(gate_addr))), ”o“(*(4+(char *)(gate_addr))), ”d“((char *)(addr)),”a“(0x00080000))3.1.3 分析初始化宏_set_gate的实现 __asm__格式为嵌入式汇编的格式,分析可知代码有5个传入的参数%0,%1,%2,%3,%4如下: %0,立即数 ”i“((short)(0x8000+(dpl<<13)+(type<<8)))这样,%%edx中高16位为addr的高16位,而低16位的P位为1(因为是0x8000),DPL位段为DPL(因为dpl<<3),而D位加上类型位段则为type(因为type<<8)其余各位皆为0 %1 是用内存地址,并且可以加偏移量 ”o“(*((char *)(gate_addr))), gate_addr =&idt[0x80] %2 是用内存地址,并且可以加偏移量 ”o“(*(4+(char *)(gate_addr))), gate_addr =&idt[0x80] %3,edx做为参数 ”d“((char *)(addr)), &system_call = 0x7119 edx = &system_call = 0x7119 %4,eax做为参数 ”a“(0x00080000))eax = 0x00080000 __asm__格式为嵌入式汇编的格式,分析可知四条命令含义如下: ”movw %%dx,%%axnt“ 先将%%dx的低16位移入%%ax的低16位 这样,在%eax中就形成了所需要的中断门的第一个长整数,其高16位为_KERNEL_CS,而低16位为addr的低16位。 ”movw %0,%%dxnt“ 字操作 16位操作,操作低16位,高16位已经有调用函数的地址.”movl %%eax,%1nt“ 双字操作,为门的0--31位赋值 ”movl %%edx,%2nt“ 双字操作,为门的32--63位赋值 3.2 以_syscall1为例,分析系统调用入口宏的含义。 其中_syscall1是一个宏,在include/unistd.h中定义。将_syscall1(int,close,int,fd)进行宏展开,可以得到: #define _syscall1(type,name,atype,a)type name(atype a){ long __res;__asm__ volatile(”int $0x80“ : ”=a“(__res): ”0“(__NR_##name),”b“((long)(a))); if(__res >= 0)return(type)__res;errno =-__res;return-1;} 传入参数说明: 其中type表示系统调用的返回值类型,name表示该系统调用的名称,atype、a分别表示第1个参数的类型和名称;可以有n个系统调用的传入参数,它们的数目和_syscall后面的数字一样大。 调用接口宏含义说明: 它先将宏__NR_##name存入EAX,将参数fd存入EBX,然后进行0x80中断调用。调用返回后,从EAX取出返回值,存入__res,再通过对__res的判断决定传给API的调用者什么样的返回值。__NR_##name就是系统调用的编号,在include/unistd.h中定义;在上面的例子中,我们添加了两个自己的系统调用接口,如下: #define __NR_whoami 72 #define __NR_iam 73 3.3 对_system_call函数的分析 处理流程图 处理流程分析 _system_call: cmpl $nr_system_calls-1,%eax # 调用号如果超出范围的话就在eax中置-1 并退出。jabad_sys_call push %ds # 保存原段寄存器值。push %es push %fs pushl %edx # ebx,ecx,edx中放着系统调用相应的C 语言函数的调用参数。pushl %ecx# push %ebx,%ecx,%edx as parameters pushl %ebx # to the system call movl $0x10,%edx# set up ds,es to kernel space mov %dx,%ds # ds,es指向内核数据段(全局描述符表中数据段描述符)。mov %dx,%es movl $0x17,%edx # fs points to local data space mov %dx,%fs# fs指向局部数据段(局部描述符表中数据段描述符)。 # 下面这句操作数的含义是:调用地址 = _sys_call_table + %eax * 4。参见列表后的说明。# 对应的C 程序中的sys_call_table在include/linux/sys.h中,其中定义了一个包括72 个 # 系统调用C 处理函数的地址数组表。call _sys_call_table(,%eax,4)pushl %eax# 把系统调用号入栈。 movl _current,%eax# 取当前任务(进程)数据结构地址。 # 下面查看当前任务的运行状态。如果不在就绪状态(state 不等于0)就去执行调度程序。# 如果该任务在就绪状态但counter值等于0,则也去执行调度程序。cmpl $0,state(%eax)# state jne reschedule cmpl $0,counter(%eax)# counter je reschedule 3.4 用户态和内核态之间的传递数据 在内核中主要提供了四个函数实现内核态和用户态的数据传递:copy_to_user(),copy_from_user(),get_fs_byte(),put_fs_byte();上面测试用例中使用的是对字节的操作get_fs_byte(),put_fs_byte()。 通过bochs环境如何验证系统调用 1.1 Bochs+Linux0.11调试环境建立。 可以分为两个部分的工作:搭建调试环境和Bochs命令的使用;这两部分网上资料较多,就不在此描述了。 1.2 测试程序的修改和添加方法。 1.2.1 使用mount命令访问文件系统hdc-0.11.img 要想把测试程序test.c运行起来,一定要放入文件系统才行,也就是一定要把test.c程序放进hdc-0.11.img中去才行,可以用如下的方法打开文件系统: losetup /dev/loop1 hdc-0.11.img losetup-d /dev/loop1 losetup-o 512 /dev/loop1 hdc-0.11.img mkdir/mnt/tempdir mount-t minix /dev/loop1 /mnt/tempdir 说明:用losetup的-d选项把hdc-0.11.img文件与loop1的关联解除,用losetup的-o选项,该选项指明关联的起始字节偏移位置。由上面分区信息可知,这里第1个分区的起始偏移位置是1 * 512 字节。 在把第1个分区与loop1重新关联后,我们就可以使用mount命令来访问其中的文件了。在对分区中文件系统访问结束后,最后请卸载和解除关联。umount /dev/loop1 losetup-d /dev/loop1 1.2.2 编译test.c测试程序 把测试程序放到/mnt/tempdir/user/root目录下,这样就可以任意修改test.c文件的内容,并可以把修改的内容保存到hdc-0.11.img文件系统中去了。 1.3 通过bochs调试观察,是如何把0x80的中断函数system_call的地址挂载上去的。1.3.1 通过添加do_nothing()函数,然后在此函数设置断点,可以查看0x80中断处理函数是如何放到中断向量表中去的。 加入调试辅助代码如下: 因为set_system_gate是一个宏,没有办法添加断点,所以就添加了一个函数do_nothing(),在此处设置断点,以方便观察后面宏的运行情况;并且加入了几个nop命令,以方便观察运行情况。 voidsched_init(void){ do_nothing();set_system_gate(0x80,&system_call);} 1.3.2 修改_set_gate宏如下,加入了nop命令,以便调试观察。 #define _set_gate(gate_addr,type,dpl,addr)__asm__(”nop nt“ ”nop nt“ ”nop nt“ ”nop nt“ ”movw %%dx,%%axnt“ ”movw %0,%%dxnt“ ”nop nt“ ”nop nt“ ”movl %%eax,%1nt“ ”movl %%edx,%2nt“ ”nop nt“ ”nop nt“ ”nop nt“ ”nop “ : : ”i“((short)(0x8000+(dpl<<13)+(type<<8))), ”o“(*((char *)(gate_addr))), ”o“(*(4+(char *)(gate_addr))), ”d“((char *)(addr)),”a"(0x00080000)) 1.3.3 可以看到运行的效果如下: 在system.map中,看到do_nothing的线性地址是0x6c1d,可以在此处设置断点。 Figure 1设置断点 Figure 2程序运行到_set_gate宏 Figure 3查看此时寄存器中的数值 调试测试程序test.c和sys_whoami和sys_iam函数 1.4.1 调试系统调用处理函数sys_whoami和sys_iam. 在system.map文件中,找到编译kernel后,函数sys_whoami和sys_iam所在的线性地址。如下所示: 00008dba T sys_iam 00008e57 T sys_whoami 在bochs启动kernel后,在0x8dba和0x8e57处设置断点,然后运行test程序,就会进入系统调用处理函数,运行到设置的断点处,后面可以单步运行,以调试sys_whoami和sys_iam,达到测试系统调用的目的。 如下图所示: 1.4 1.4.2 在linux0.11的系统中编译运行test程序 在运行起来的linux0.11的系统中,通过make test命令编译test.c文件,使生产test应用。运行test程序后,iam()函数就会通过get_fs_byte()函数把“champion”字符串存入到内存中; 操作系统原理课程将操作系统组织成一个逻辑清晰的整体, 依次介绍进程管理、内存分配、输入输出设备、文件管理的策略与方法等, 是计算机科学与技术专业的核心课程。该课程的特点是原理性内容较多, 概念抽象。在教学过程中如果只注重课堂上的理论讲授, 学生难以深入理解, 无法取得良好的教学效果, 因此必须注重操作系统课程的实验教学部分。 2.操作系统实验教学现状分析 目前, 大部分学校采用的操作系统教材都偏向于介绍经典理论, 实验内容大多是在Unix、Linux或Windows系统上实现或模拟传统算法。如今操作系统技术日新月异, 新的操作系统, 如Android、i OS等层出不穷, 已经占领移动终端的大部分份额, 传统的实验教学内容显然不能适应这种变化, 必须及时进行实验教学改革, 以提高学生的应用能力和实践能力。 3.操作系统实验教学改革方案 3.1实验教学内容改革原则 3.1.1紧跟当前操作系统发展热点 Android系统在移动终端中相当流行, 该操作系统是基于Linux内核的开源操作系统, 因此非常适合于教学, 设置与android系统相关的实验有助于学生掌握最新的操作系统理念。 3.1.2实验内容密切联系理论教学内容 如在调度算法的实验中, 安排学生编程实现理论教学内容中的银行家算法, 因为实验与理论联系紧密, 激发了学生用所学知识完成任务的信心和兴趣。 3.2实验内容设置 本门课程的实验改革方案共设置两大类六个实验, 第一类实验主要涉及经典的操作系统算法, 让学生编程实现理论课所讲的一些重要的操作系统算法, 实验内容与具体安排见表1。第二类实验主要基于当前广泛流行的android系统, 共设置两个实验, 具体内容见表2。 4.实验平台搭建 目前, 由于高校场地经费所限, 可采用在普通PC机上使用虚拟机软件创建虚拟机安装Linux系统的方法搭建实验平台。 为了学生方便完成android部分的实验内容, 所有实验室均配置VMware虚拟机, 其中预先安装了学生完成2个android项目所必需的Android和Linux开发工具。 5.实验教学改革效果反馈 为了评价实验教改内容的效果, 组织部分学生进行问卷调查, 调查结果显示实验教改内容获得大部分学生的认可, 其中, 约83.63%的学生认为新的实验内容提高了他们的学习兴趣, 约86.95%的学生认为新的实验内容能够让他们更加深入理解操作系统的工作原理。 在调查问卷中, 也发现实验教改内容存在一定的问题, 如较多学生反映实验工作量大, 无法在规定时间内完成, android系统的实验内容难度过大, 打击了学习兴趣等。这也是下一步教改中需要解决的问题。 摘要:操作系统课程所开设的实验教学内容存在内容陈旧、脱离实际应用等问题, 课题针对平时实验教学中遇到的问题提出实验教学改革方案, 取得了良好的教学效果。 关键词:操作系统,教学改革,android系统 参考文献 [1]Android平台下操作系统课程设计的教学改革[J].计算机教育, 2014 (8) :32-33. 院(系): 班 级: 学 号: 姓 名: 实习内容 Linux的系统操作实习的第一天,尚观科技长期开发高端UNIX/Linux、嵌入式开发、Linux集群、Linux内核、POSIX开发、Oracle集群等课程及相关企业解决方案,由他们的工作人员给我们讲解了Linux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。至于说Linux是基于Unix的,很大程度上也是因为这两者的基本思想十分相近。感觉它与windows相比有很多不同的地方。Linux是一类Unix计算机操作系统的统称。Linux 是以 Unix 操作系统为原型的多任务、多用户的系统。可运行于多种硬件平台:PC、Alpha、SPARC、POWER PC。 今天实习的主要内容是学习了解Linux的安装过程;Linux登录和退出,熟悉Linux操作系统的图形界面。 (一)Linux的安装过程 1)VMware软件的安装。因为我用的是自己的电脑,所以要先安装VMware软件。这个过程十分简单,下载完毕,直接“Next”即可完成安装。 2)虚拟机的安装。打开VMware软件,单击“新建虚拟机”命令,根据提示选择一种要安装的操作系统,一般选择典型设置,然后直接按“下一步”即可。 3)Red Hat Linux 9.0安装。首先单击“编辑虚拟机设置”,改写镜像为“linux9cd1”,然后返回初始界面。点击“启动该虚拟机”,便进入到软件的安装过程。开始是“欢迎使用Red Hat Linux”界面,然后经历语言选择、键盘配置、鼠标配置、磁盘分区设置、选择软件包组、安装软件包等操作后,便安装成功了。 (二)Linux的登录过程 点击“运行”,便进入到Linux的登陆界面。根据安装过程中输入的用户名以及密码进入系统,进入后发现与windows的差别很多,进而对linux操作系统的界面进行了熟悉。 (三)Linux的退出过程 Linux的退出与windows基本相似。 在安装过程中我遇到一些问题:首先是切换虚拟机与主机。安装软件时,发现在进入虚拟平台后,它会屏蔽掉主机计算机的所有鼠标或键盘操作,通过查看资 料,发现按“Ctrl+Alt”组合键即可返回主机系统。然后是虚拟机安装完第一张盘后要进行第二张盘的安装,经过老师的指点,按住“Ctrl+Alt”,将鼠标调出,双击右下方任务栏第一个按钮,依次选择第二、三镜像,继续安装,问题得以解决。 Linux系统操作实习第二天的主要任务为了解一些Linux操作系统命令。首先在虚拟机中打开linux操作系统,然后打开终端。在终端里输入命令,即可完成指令的操作。今天我学到了一些比较基础的Linux操作指令。 (一)有如下指令 关闭重启命令:shutdown、reboot; 目录类命令:cd、mkdir、rmdir、lsmount、umount等; 文件操作类命令:cat、more、less、cp、rm、mv、chmod等; 磁盘操作命令:df、du; 用户管理类命令: useradd、passwd、su、who等; 进程管理类命令: ps、kill、&、df、top等; 网络管理类命令 :ifconfig、ping、netstat、telnet等。 (二)部分指令功能 cat:直接显示文件内容 cp:复制文件。 mv:移动或重新命名文件和目录。 reboot:重新启动计算机,它的使用权限是系统管理者。ls:列出目录内容。pwd:显示当前路径。cd:改变工作目录。mkdir:创建一个目录。rmdir: 删除目录。 第三天熟悉了linux的几个基本命令。当我在使用cat命令时,我发现它可以同时查看多个文件,例如输入“cat 文件名一 文件名二”,便可同时查看两个文件。还有在学习cp命令时,发现如果给出的源是一个目录,那么cp将复制该 目录下所有的子目录和文件,不过要求目标也是一个目录名;如果源是文件名,目标是目录名的话,那么使用cp命令可以指定多个源文件名。 今天是linux实习的第三天,在昨天的学习过程中我掌握了部分操作系统的基本指令,今天又了解到更多的基本指令。学习到的基本指令有: mount和umount:挂载、卸载指定的文件系统。useradd:创建一个新的用户。passwd:为用户创建密码。chmod:设定文件或目录权限。rm:删除文件或目录。 find:在指定目录中搜索文件。 ln:链接文件命令是ln命令。该命令在文件之间创建链接。这种操作实际上是给系统中已有的某个文件指定另外一个可用于访问它的名称。 ps:显示当前系统中由该用户运行的进程列表。kill:结束或终止进程。&:后台执行命令。 经过第三天的学习,已经对linux的基本指令有了初步了解。同时还学到了很多访问权限,例如:w 写访问权限,r 读访问权限,x 执行权限,u(文件拥有者),g(所属用户组),o(其他用户)权限。 此外,我还发现在 Red Hat Linux 7 中有许多文字编辑工具,其中最常用的应该是 vi。首先,可以使用命令“vi 文件名”打开一个文件。由于刚开始不太熟练,所以有时忘记在vi后加上文件名,不能运行程序。其次,在刚启动的时候,vi 处于命令状态,不能够输入任何字符。在这个状态下,可以使用方向键进行移动,而需要输入内容时,你需要输入“a”命令进入编辑状态。同时,编辑完成后,需要按下“ESC”键回到命令状态。在命令状态下,可以输入“:q!”不存盘退出,输入“:wq”存盘退出。 1)挂载U盘,命令为: mount –t vfat /dev/sda1 /mnt/usb 2)创建一个目录,并在里面创建一个文件,命令为: mkdir work vi a.c/work 3)创建一个用户,命令为: useradd aaa passwd aaa 输入密码:111 确认密码:111 4)在新用户下新建一个文件,并设置读、写权限,命令为: vi q chmod 666 q 5)删除新用户命令为:dec aaa 6)在目录下创建一个文件并编写一段C语言代码,命令为: vi a.c C语言代码: void main(){printf(“Hello World!”);} 输入完成后保存并退出,即按下esc键后输入:wq 7)用GCC编译生成可执行文件,命令为:gcc –o a a.c 8)运行a,命令为:./a 9)用GDB进行调试,命令为: 显示:list 设置断点在第1行:b 1 运行:r 运行下一行:n 退出:q 心得体会 带着彷徨与紧张的心情,开始了为期5天的Linux操作系统实习。时至今天,实习结束了,原本迷茫与无知,现如今满载而归。因此十分感谢学院给我们提供了这样好的实习环境和各种优越条件,感谢所有的老师对我们的辛勤教导,让我们拥有了如此良好的实习机会。学习的时间虽然短暂,但是我对于linux系统产生了浓厚的兴趣。它让我们开阔了眼界,认识到计算机世界的无限辽阔,还有很多的知识去学习和探索。 实习开始时,Linux操作系统对我来说是一个很陌生的操作系统。起初不太会使用,也没发现它比Windows的优越性,但经过了几天的实习,发现Linux下的编程是比较实用的。并且跟随老师的知识不断练习,开始适应这种操作方式。因为用惯了Windows 各种编译软件,在使用Linux初期,有点不知所措。对我们这些初出茅庐的新手来说简直不知道该怎么办,还好在老师的帮助下,只需要在Linux上利用GCC编辑器、GDB调试器并在这些软件的帮助下便可以对不同的程序进行编辑、编译和调试。即使这样,也是困难重重。在不断的尝试和摸索中,同时在老师的帮助下,终于成功运行程序。 在这些天的学习中,在几位老师的帮助下,我对linux系统有了初步的认识。在第一天学习了VMware软件的安装,并在此软件下安装虚拟机和linux系统。还学会了Linux登录、退出和Linux操作系统的图形界面。在第二天和第三天学习了一些基本的操作指令。在第四天学会了在linux系统下使用GCC编辑器、Gbd调试器。在Linux下编辑、编译、调试运行C程序。 Linux操作系统实习,让我接触了一种全新的事物,走出Windows走进Linux,我感受到了不同操作系统之间的差别和优缺点,让我学到了很多课本上没有的知道的知识。本次实习,不仅使我开阔了视野,拓宽了思路,增长了知识,而且为今后的学习打下了牢固的基础,也增强我对计算机学习的兴趣。linux操作系统实验报告 第7篇
linux操作系统实验报告 第8篇
Linux操作系统实习报告 第9篇
linux操作系统实验报告
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。


