Linux操作系统实验指导书.docx

上传人:b****6 文档编号:7513477 上传时间:2023-01-24 格式:DOCX 页数:59 大小:1,021.27KB
下载 相关 举报
Linux操作系统实验指导书.docx_第1页
第1页 / 共59页
Linux操作系统实验指导书.docx_第2页
第2页 / 共59页
Linux操作系统实验指导书.docx_第3页
第3页 / 共59页
Linux操作系统实验指导书.docx_第4页
第4页 / 共59页
Linux操作系统实验指导书.docx_第5页
第5页 / 共59页
点击查看更多>>
下载资源
资源描述

Linux操作系统实验指导书.docx

《Linux操作系统实验指导书.docx》由会员分享,可在线阅读,更多相关《Linux操作系统实验指导书.docx(59页珍藏版)》请在冰豆网上搜索。

Linux操作系统实验指导书.docx

Linux操作系统实验指导书

操作系统

实验指导书

操作系统1

实验指导书1

目录2

实验一 Linux的安装与编译1

1.1实验目的1

1.2背景知识1

1.2.1Linux简史1

1.2.2内核的功能和结构3

1.2.3内核源代码组织结构4

1.2.4内核的功能版本和发行版6

1.2.5学习Linux辅助软件介绍6

1.3实验内容6

1.3.1安装Ubuntu6

1.3.2编译Linux内核9

实验二 Linux基本命令14

2.1实验目的14

2.2背景知识14

2.3实验内容14

实验三进程管理19

3.1实验目的19

3.2背景知识19

3.3实验内容19

3.3.1进程创建19

3.3.2进程控制19

3.3.3参考程序19

实验四进程通信22

4.1实验目的22

4.2背景知识22

4.3实验内容30

实验五 存储管理38

5.1实验目的38

5.2背景知识38

5.3实验内容38

实验六 文件管理49

6.1实验目的49

6.2背景知识49

6.3实验内容49

实验一 Linux的安装与编译

1.1实验目的

●了解Linux发展历史、功能和特点。

●学习和动手安装Linux操作系统。

●学习和动手编译Linux内核。

1.2背景知识

1.2.1Linux简史

1981年IBM公司推出享誉全球的微型计算机IBMPC。

在1981-1991年间,MS-DOS操作系统一直是微型计算机上操作系统的主宰。

此时计算机硬件价格虽然逐年下降,但软件价格仍然是居高不下。

当时Apple的MACs操作系统可以说是性能最好的,但是其天价没人能够轻易靠近。

当时的另一个计算机技术阵营是Unix世界。

但是Unix操作系统就不仅是价格贵的问题了。

为了寻求高利率,Unix经销商将价格抬得极高,PC小用户就根本不能靠近它。

曾经一度受到BellLabs的许可而可以在大学中用于教学的UNIX源代码一直被小心地守卫着不许公开。

对于广大的PC用户,软件行业的大型供应商都始终没有给出有效的解决该问题的手段。

正在此时,出现了MINIX操作系统,并有一本详细的书本描述它的设计实现原理。

由于AST的书写的非常详细,并且叙述有条有理,几乎全世界的计算机爱好者都在看这本书以理解操作系统的工作原理。

其中也包括Linux系统的创始者LinusBenedictTorvalds。

当时(1991年),LinusBenedictTorvalds是赫尔辛基大学计算机科学系的二年级学生,这个21岁的芬兰年轻人喜欢鼓捣计算机,测试计算机的能力和限制。

但当时缺乏的是一个专业级的操作系统。

MINIX虽然很好,但只是一个用于教学目的简单操作系统,而不是一个强有力的实用操作系统。

GNU计划和自由软件基金会(theFreeSoftwareFoundation–FSF)是由RichardM.Stallman于1984年一手创办的。

旨在开发一个类似Unix、并且是自由软件的完整操作系统:

GNU系统。

(GNU是"GNU'sNotUnix"的递归缩写,它的发音为"guh-NEW"。

)到1991年,GNU计划已经开发出了许多工具软件。

最受期盼的GnuC编译器已经出现,但还没有开发出免费的GNU操作系统。

即使是MINIX也开始有了版权,需要购买才能得到源代码。

而GNU的操作系统HURD一直在开发之中,但并不能在几年内完成。

对于Linus来说,已经不能等待了。

从1991年4月份起,他开始酝酿并着手编制自己的操作系统。

刚开始,他的目的很简单,只是为了学习Intel386体系结构保护模式运行方式下的编程技术。

但后来Linux的发展却完全改变了初衷。

1991年初,Linux开始在一台386sx兼容微机上学习minix操作系统。

通过学习,他逐渐不能满足minix系统的现有性能,并开始酝酿开发一个新的免费操作系统。

根据Linus在comp.os.minix新闻组上发布的消息,我们可以知道他逐步从学习minix系统到开发自己的Linux的过程。

Linus第1次向comp.os.minix投递消息是在1991年3月29日。

题目是“gcconminix-386doesn’optimize”,是有关gcc编译器在minix-386上运行的优化问题,由此可知,Linus在1991年的初期已经开始深入研究了minix系统,并在这段时间有了改进minix操作系统的思想,而且在进一步学习minix系统中,逐步演变为想自己重新设计一个基于Intel80386体系结构的新操作系统。

他在回答有人提出minix上的一个问题时,所说的第一句话是“阅读源代码”。

他认为答案就在源程序中。

这也说明了对于学习系统软件来说,你不光需要懂得系统的工作基本原理,还需要结合实际系统,学习实际系统的实现方法。

因为理论毕竟是理论,其中省略了许多枝节,而这些枝节问题虽然没有太多的理论含量,但却是一个系统必要的组成部分,就象麻雀身上的一根羽毛。

从1991年的4月份开始,Linus几乎花了全部时间研究386-minix系统(hackthekernel),并且尝试着移植GNU的软件到该系统上(GNUgcc、bash、gdb等)。

并于4月13日在comp.os.minix上发布说自己已经成功地将bash移植到了minix上,而且已经爱不释手、不能离开这个shell软件了。

1.2.2内核的功能和结构

Linux内核主要由5个模块构成,它们分别是:

进程调度模块、内存管理模块、文件系统模块、进程间通信模块和网络接口模块。

进程调度模块用来负责控制进程对CPU资源的使用。

所采取的调度策略是各进程能够公平合理地访问CPU,同时保证内核能及时地执行硬件操作。

内存管理模块用于确保所有进程能够安全地共享机器主内存区,同时,内存管理模块还支持虚拟内存管理方式,使得Linux支持进程使用比实际内存空间更多大的内存容量。

并可以利用文件系统把暂时不用的内存数据块会被交换到外部存储设备上去,当需要时再交换回来。

文件系统模块用于支持对外部设备的驱动和存储。

虚拟文件系统模块通过向所有的外部存储设备提供一个通用的文件接口,隐藏了各种硬件设备的不同细节。

从而提供并支持与其它操作系统兼容的多种文件系统格式。

进程间通信模块子系统用于支持多种进程间的信息交换方式。

网络接口模块提供对多种网络通信标准的访问并支持许多网络硬件。

这几个模块之间的依赖关系见图

1.2.3内核源代码组织结构

Linux内核作为一个特殊的程序,同样需要经过编译、链接之后才能运行,仅仅是它执行时拥有特殊的权限,位于特定的空间,并且不会也不可能信赖其他的软件罢了。

Linux发展至今,其内核的组织结构日渐清晰,层次日渐分明。

一旦基本系统安装完毕,具有系统管理员权限的用户即可编译内核。

一般来说,Linux系统内核的源码放置在/usr/src/linux目录下,它将依赖于体系结构的代码和独立于体系结构的代码分离开来(前者仅占5%,通常是一些汇编代码和局部的、针对于不同体系结构的局部处理细节,如时钟定时器频率)。

为了更好地理清内核结构,下面列出了几个重要的源码目录:

arch目录该目录的存放具体地依赖于体系结构实现的代码。

在这个目录下,针对不同体系结构所移植的版本都有三个子目录:

kernel、lib和mm。

kernel子目录包含依赖于体系结构实现的一般内核功能,例如信号处理、时钟处理等。

lib子目录包含库函数的本地实现,如果从依赖于体系结构的源码编译,则运行得更快。

mm子目录包含存储管理实现的代码。

drivers目录这个目录拥有50%以上的内核源码,所有的驱动程序源码均位于该目录之下。

fs目录该目录存放所有的系统支持的文件系统的实现代码。

include目录一些重要的头文件。

ipc目录处理进程间通信的全部所需的代码都放在ipc目录下。

init目录该目录存放所有系统的初始化代码,许多重要的文件,例如main.c就位于该目录下。

该文件还包含了许多核心代码--比如实现fork()的代码和最常执行的代码--cpuidle()循环。

lib目录该目录放置内核其他部分经常所需要的代码。

例如,inflate.c就放在这里,它能够在引导时解压内核并装入内存,它也知道如何解压标准PKZIP8位压缩算法。

kernel目录许多最常调用的内核函数放在该目录下。

调度器fork()和timer.c就放在这里。

你还能在这个目录下找到printk.c。

mm目录该目录包含所有Linux实现虚拟内存管理的源码。

net目录所有提供网络支持的代码都放在这个目录下。

Document目录该目录存放了大量的内核代码相关文档,以及用户开发和维护手册。

1.2.4内核的功能版本和发行版

内核版本

一般地,可以从Linux内核版本号来区分系统是否是Linux稳定版还是测试版。

以版本2.4.0为例,2代表主版本号,4代表次版本号,0代表改动较小的末版本号。

在版本号中,序号的第二位为偶数的版本表明这是一个可以使用的稳定版本,如2.2.5,而序号的第二位为奇数的版本一般有一些新的东西加入,是个不一定很稳定的测试版本,如2.3.1。

这样稳定版本来源于上一个测试版升级版本号,而一个稳定版本发展到完全成熟后就不再发展。

发行版本

90年代初期Linux开始出现的时候,仅仅是以源代码形式出现,用户需要在其他操作系统下进行编译才能使用。

后来出现了一些正式版本。

目前最流行的几个正式版本有:

SUSE、RedHat、Fedora、Ubuntu

1.2.5学习Linux辅助软件介绍

虚拟机Vmware,VirtualPC和Bochs等。

Linux源代码阅读工具SourceInsight

1.3实验内容

1.3.1安装Ubuntu

Ubuntu在图形界面下安装十分方便,通过6个步骤完成对安装参数的配置。

1选择语言

2 选择时区,设置时间

3选择使用键盘键盘布局

4进行分区

5设置账号

6确认配置

1.3.2编译Linux内核

1.下载内核源代码

http:

//www.kernel.org/

下载ThelateststableversionoftheLinuxkernelis:

2.6.25.7,点后面的“F”按钮下载

http:

//www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.7.tar.bz2文件。

2.在终端suroot命令切换到root权限,然后把linux-2.6.25.7.tar.bz2文件复制到/usr/src/目录下。

在ubuntu中不能以root身份登录界面,很奇怪

3.cd到/usr/src/目录下,执行tar-jxvflinux-2.6.25.7.tar.bz2  命令解压源代码包。

就会解压到

/usr/src/linux-2.6.25.7,我又把它复制到/usr/src/linux-2.6.25.7-widebrihgt目录下了,/usr/src/

linux-2.6.25.7-widebrihgt  挂载了一个8G的盘。

4.root用户,cd到/usr/src/linux-2.6.25.7-widebright目录下

#makemrproper(该命令可确保源代码目录下没有不正确的.o文件,.config文件等)

内核配置工具

(1)makeconfig(纯字符提示模式)

    

(2)

#makemenuconfig(配置内核各选项,居于ncurse的菜单选择模式)

需要ncurse库的支持,ubuntu中默认没有安装需要安装一下

#apt-getinstalllibncurses5-dev   

(3)

#makexconfig  (X窗口的图形界面,配置内核各选项)  

xconfig基于X11,使用qt库,在Ubuntu中先安装qt库:

#apt-getinstalllibqt3-headerslibqt3-mt-dev

我是安装libncurses5-dev  之后用menuconfig来配置的,都是用他默认配置,除了Generalsetup--->()Localversion-appendtokernelrelease()这个可以在内核版本后面加上个性字符串,我输入了widebrighgt

然后选最后一条,保存配置文件就行了,他会在/usr/src/linux-2.6.25.7-widebright生成.config文件

5.编译内核

只需要运行make就行了

#make

执行之前可以先运行makeclean清空生成的内核文件,或者编译中间有问题了,想重新编译,可以用这

个先清空已经生成的内核文件

我在VirtualBox虚拟机的ubuntu8.04系统里面执行make命令,结果make一次花的编译时间应该在两个

小时以上。

注意/usr/src/linux-2.6.25.7-widebright的剩余空间要在2.5G以上,我一开始mount到一个

2G的盘,结果编译时候提示没有空间。

后来重试了几次,花了很多时间,最后mount了一个8G的盘,终

于编译成功了。

看他完成后,占用的控件大概在1.8G左右。

这个make相当于,手工执行了一下两步:

#makebzImage

#makemodules(编译可加载模块)

其中makebzImage将在/usr/src/linux-2.6.25.7-widebrihgt/arch/i386/boot目录下生成一个名字为

bzImage的内核镜像文件。

makezImage命令其实可以生成内核镜像的,bzImage的区别就是它是压

缩的。

makemodules则是生产大量的*.ko内核文件,就是模块化的内核驱动等等吧,你不把它编译进去

bzImage里面去的都会另外单独生成的一个ko文件了,以后需要的时候再由内核加载这个ko模块。

6.安装内核

(1)执行makeinstall命令        

运行了这一步后,提示需要在GRUBmenu.lst配置文件中把入口点指向/boot/vmlinuz-

2.6.25.7widebright文件。

应该是已经把上面一步生成的bzImage复制到系统的/boot目录去了,ls

-l看一下/boot目录,可以已经把vmlinuz文件链接到vmlinuz-2.6.25.7widebright文件System.map

文件链接到  System.map-2.6.25.7widebright文件,config文件链接到config-2.6.25.7widebright文件。

(2)没有看到模块的配置信息输出,所以我又执行了一下makemodules_install命令,这个是安装模块的。

这个会安装很多ko文件,最后输出DEPMOD2.6.25.7widebright。

不懂这个流程是什么样子的。

不过在/lib/modules/目录下面生成了一个2.6.25.7widebright的目录,下面目录就是上面makemodules生

成的那些ko内核模块文件。

(3)我上面的编译过程好像没有生成initrd镜像文件,不知道怎么回事,只好手工来了。

什么是initrd镜像请看最后附的那篇文章

生成initrd镜像文件,redhat系统下面用new-kernel-pkg命令应该就可以了,后面那篇文章说的mkinitrd命令不知道是什么系统。

ubuntu系统下面在网上搜索了一下,应该是用mkinittramfs命令来生成的。

运行一下"mkinitramfs-oinitrd.img-2.6.25.7widebrihgt  2.6.25.7widebrihgt",将在当前目录下生成

一个名字为initrd.img-2.6.25.7widebrihgt大小7.1M左右的initrd镜像文件。

最后我把它移到/boot/目录里面去。

注意:

最后那个参数“2.6.25.7widebrihgt”是version,指定内核版本,就是/lib/modules/目录下相应的

文件夹名字。

这个一定要指定的,不然他默认使用的是正在运行的系统的版本,最后系统就不能引导成功。

(4)检查一下grub的配置文件

cat/boot/grub/menu.lst,看来makeinstall命令没有自动把新编译的内核的配置写到grub的配置文件里面。

修改timeout属性为10,让等待的时间长一点,然后仿造原有的配置新建一项放在最前面,因为一开始的default的值设置为0的,默认是第一项。

增加的内容如下

title      Ubuntu8.04,kernel2.6.25-7-widebright

root      (hd0,0)

kernel      /boot/vmlinuz-2.6.25.7widebrightroot=UUID=a082d103-894e-443a-bf58-8b128c7e5dd1roquietsplashlocale=zh_CN

initrd      /boot/initrd.img-2.6.25.7widebright

quiet

注意其中的kernel和initrd都指向自己的镜像文件。

root的UUID可能没个人都不一样的,可以参考GRUB的配置文件说明。

做完上面步骤之后,重启系统,等到系统提示按ESC键的时候,可以选择和进入GRUB的菜单。

可以看到自己的内核版本已经显示出来了。

选择进入之后,一切正常。

使用uname-a命令查看,可以看到当前内核已经被更新了

实验二 Linux基本命令

2.1实验目的

1熟悉在Linux操作系统下的基本操作,对Linux操作系统有一个感性认识。

2学会使用vi编辑器编辑简单的C语言程序,并能对其编译和调试

2.2背景知识

1参阅相关Linux的命令参考手册,熟悉Linux下的操作命令。

2C语言源程序的调试和编译知识。

2.3实验内容

2.3.1常用命令练习

1.登录系统:

login用户名称

2.注销(退出)系统:

logout

3.关机命令:

shutdownnow

4.使用man命令帮助,例如:

manls(屏幕显示关于ls命令的帮助信息)

5.ls(显示目录内容)

格式:

ls[选项][目录或是文件]

其中:

-a显示指定目录下所有子目录和文件,包括隐藏文件

-l以长格式来显示文件的详细信息。

-R递归地显示指定目录的各个子目录中的文件

例如:

使用ls查看当前目录内容:

$ls

使用ls查看指定目录内容:

$ls/etc

使用ls–al查看当前目录内容:

$ls-al

使用dir查看当前目录内容:

$dir

6.cd(改变工作目录)

格式:

cd[路径名称]

如:

cd..回到上层目录;cd/回到根目录

7.pwd(显示当前工作目录的绝对路径)

格式:

pwd

8.mkdir(创建目录)

格式:

mkdir[目录名称]

例如:

mkdir/home/s2001/newdir

9.rmdir(删除空目录)

格式:

rmdir[选项][目录名称]

10.cp(文件或目录的复制)

格式:

cp[选项]源文件或目录目标文件或目录

例如:

cp文件名1文件名2

11.mv(文件或目录更名或将文件由一个目录移到另一个目录中)

格式:

mv[选项]源文件或目录目标文件或目录

12.rm(删除文件或目录)

格式:

rm[选项]文件名|目录名

13.cat(显示文件)

格式:

cat[选项]文件列表

例如:

cat文件名

cat命令也可用来建立新文件:

cat>文件名,ctrl+d结束输入

(2)vi编辑器的使用

vi提供二种工作模式:

输入模式(insertmode)和命令模式(commandmode)。

使用者进入vi后,即处在命令模式下,此刻键入的任何字符皆被视为命令,可进行删除、修改、存盘等操作。

要输入信息,应转换到输入模式。

(a)命令模式

在输入模式下,按ESC可切换到命令模式。

命令模式下,可选用下列指令离开vi:

q!

离开vi,并放弃刚在缓冲区内编辑的内容

wq将缓冲区内的资料写入磁盘中,并离开vi

ZZ同wq

x同wq

w将缓冲区内的资料写入磁盘中,但并不离开vi

q离开vi,若文件被修改过,则要被要求确认是否放弃修改的内容,此指令可与:

w配合使用。

(b)输入模式

在命令模式下,按i或a,进入输入模式,此时可以编辑文件内容。

(3)gcc的使用

gcc由GNU之父Stallman所开发的linux下的编译器,全称为GNUCompilerCollection。

在linux下可以直接编译c语言源程序,可生成可执行文件。

例如:

gcchello.c编译hello.c源文件,若通过,会自动生成名称为a.out可执行文件。

例如:

gcchello.c–ohello.exe编译hello.c源文件,若通过,会生成hello.exe可执行文件。

2.3.2使用vi编辑c语言源文件

(1)进入linux的文本模式之后,在命令行键入vifilename.c然后回车。

下面作一些简单的解释:

首先vi命令是打开vi编辑器。

后面的filename.c是用户即将编辑的c文件名字,注意扩展名字是.c;当然,vi编辑器功能很强,可以用它来编辑其它格式的文件,比如汇编文件,其扩展名字是.s;也可以直接用vi打开一个新的未命名的文件,当保存的时候再给它命名,只是这样做不很方便。

(2)最基本的命令i:

当进入刚打开的文件时,不能写入信息,这时按一下键盘上的I键(insert),插入的意思,就可以进入编辑模式了。

如下图所示:

(3)a与i是相同的用法

(4)当文件编辑完后,需要保存退出,这时需要经过以下几个步骤:

1)按一下键盘上的Esc键;2)键入冒号(:

),紧跟在冒号后面是wq(意思是保存并退出)。

如果不想保存退出,则在第二步键入冒号之后,键入q(不带w,不保存退出)。

如下图所示:

(5)退出vi编辑器的编辑模式之后,要对刚才编写的程序进行编译。

编译的命令是:

gccfilename.c[-ooutputfilename],其中gcc是c的编译器。

参数:

filename.c是刚才编辑的c源文件(当然也可以是以前编写好的c文件);后面中括号里面的参数是可选的,它是一个输出文件。

如果不选,默认的输出文件是a.out,选了之后输出文件就是outputfilename.out.

(6)最后一步是运行程序,方法如下:

./outputfilename.out

3.参考c语言

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1