Linux实验报告.docx
《Linux实验报告.docx》由会员分享,可在线阅读,更多相关《Linux实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
Linux实验报告
Linux内核实验报告
实验一、linux内核开发环境
一、实验目的
掌握linux内核开发环境的安装、调试
二、实验内容:
虚拟机bochs和virtualPC的安装、运行
使用nasm编写简单例程,生成一个简单的引导程序的设计
image文件,并在虚拟机中调试
三、实验环境:
操作系统windows、linux
软件工具:
见实验配套软件
(tools
中)
其它:
1.44空白软盘一张
四、实验步骤及截图
A、虚拟机bochs和virtualPC的安装、运行
使用记事本打开C:
\ProgramFiles\Bochs-2.3\dlxlinux中的bochsrc.bxrc配置文件,
浏览该配置文件的内容并回答该demolinux模拟启动的方式是软盘。
B、windows环境使用virtualPC
1、建立虚拟机
1、进入实验文件夹\MicrosoftVirtualPC,安装并运行virtualpc软件。
2、按照virtualPC的帮助说明,建立一台虚拟计算机。
2、使用nasm编写简单例程,生成image文件
1、记事本编辑代码
sample.asm:
org07c00h
;告诉编译器程序加载到
7c00处
mov
ax,cs
mov
ds,ax
mov
es,ax
call
DispStr
;调用显示字符串例程
jmp
$
;无限循环
DispStr:
mov
ax,BootMessage
mov
bp,ax
;ES:
BP=串地址
mov
cx,16
;CX=串长度
mov
ax,01301h
;AH=13,AL=01h
mov
bx,000ch
;页号为0(BH=0)黑底红字(BL=0Ch,高亮)
mov
dl,0
int
10h
;10h号中断
ret
BootMessage:
db
"Hello,OSworld!
"
times
510-($-$$)
db
0;填充剩下的空间,使生成的二进制代码恰好为
512字节
dw
0xaa55
;结束标志
2、对该文件进行编译。
生成sample.bin文件
在命令方式中进入实验目录,运行命令:
nasmwsample.asm–osample.bin。
3、在该目录下以命令方式运行:
bximage.exe选择创建软盘镜像(fd)文件sample.img
4、将sample.bin写入到空白软盘镜像文件中。
命令方式运行:
partcopysample.bin0200sample.img0
5、将sample.img复制到bochs的安装目录,可以新建一个目录比如\sample,并放
入sample.img。
将dlxlinux中的配置文件以及批处理文件run.bat复制到\sample。
对这两个文件进行适当的修改。
并运行。
bochsrc里面修改:
floppya:
image=sample.img,status=inserted(1_44=a改为image=sample.img)
#floppyb:
1_44=floppyb.img,status=inserted(注释此行)
boot:
a(c改为a)
#harddisk(以下3行都注释掉)
#ata0:
enabled=1,ioaddr1=0x1f0,ioaddr2=0x3f0,irq=14
#ata0-master:
type=disk,path="hd10meg.img",cylinders=306,#heads=4,spt=17
6、如果使用了真正的软盘,请使用该软盘引导计算机,观察并记录结果。
或者直接
在bochs中使用软驱设备(配置文件需要修改floppya:
1_44=a:
status=inserted)。
7、运行virtualPC载入sample.img进行模拟。
3、建立虚拟机一个简单的引导程序的设计
1、打开文件
boot.asm;prog.asm.
2、使用实验二的方法进行编译,并生成
image文件,在
bochs
中模拟运行
(以上两步可能用到的命令:
nasmwboot.asm–oboot.binnasmwprog.asm–oprog.binpartcopyboot.bin0200floppy.img0partcopyprog.bin0200floppy.img200
)
3、复制bochs中的run.bat文件为rundbg.bat,并修改有关语句:
..\bochsdbg-q-fbochsrc.bxrc
4、双击运行rundbg.bat,进入调试模式。
5、输入bochs的调试命令进行调试,观察上述引导程序的执行过程。
记录结果。
常用Bochs的调试命令:
help‘command’查看命令帮助
c连续执行
s[count]执行count条指令,默认为1条(仅键入s为单步运行)
q退出调试
ctrl-c定制执行,回到命令行
vbreakseg:
0ff设置断点(比如vbreak0x0000:
0x7c00)
n单步运行,不跟踪进入子程序
u返汇编
infor查看当前cpu寄存器内容
dump_cpu查看cpu所有寄存器内容和状态值
print-stack显示当前堆栈的内容
详细内容可以查看bochs的联机帮助(在bochs安装主目录\docs下)
五、实验体会
本次实验内容主要是熟悉虚拟机和Linux系统操作,因为之前学习操作系统
的时候用过linux,所以觉得操作方面不太难。
不过做的时候还是出现了写错误,
比如修改bochsrc的时候boot和floppy没有对应,runbat修改的时候忘记修改img
名称等等。
经过一番折腾,最终做出实验结果的时候非常开心。
此外,之前没用
过虚拟机的单步调试,学习了之后发现非常有帮助,以后可以考虑把代码放在虚
拟机里跑,这样可以互不干扰而且方便文件管理。
通过实验学习到了很多,之后
的实验我会更加认真对待。
实验二、Linux0.01内核编译环境
一、实验目的
掌握linux0.01内核的编译方法
掌握使用虚拟机软件进行内核开发调试的方法
二、实验内容:
在virtualPC和BOCHS下建立LINUX0.01内核开发环境
linux0.01的编译和调试
三、实验环境:
操作系统windows、linux
软件工具:
见实验配套软件(ex2中)
其它:
移动存储设备用于保存实验环境
四、实验步骤及截图
A、在virtualPC和BOCHS下建立LINUX0.01内核开发环境
1、VirtualPC中运行redhat7.1
2、virtualPC虚拟和windows的文件互访
1、制作虚拟软盘文件。
(使用winimage新建一个1.44软盘文件,将下的linux.tar.gz
拖到该文件中。
然后保存为a.vfd。
这是virtualPc默认的虚拟软盘镜像文件格式。
2、启动虚拟机linux7.1,以账户root登录,口令为aaaaaa。
注意,如果运行时系统
提示内存不够,请重新设置虚拟机的内存,比如64mb。
3、加载步骤1建立的虚拟软盘文件。
则该文件就成为虚拟机的软盘。
4、将该软盘挂载到linux的/mnt/floppy下。
命令如下:
[root@localhost/root]#mount-tvfat/dev/fd0/mnt/floppy
5、运行命令:
cd/mnt/floppy
ls如果正常就可以看见软盘中的
linux.tar.gz
文件。
6、可以将该文件复制到虚拟操作系统的其他路径中,比如,复制到在/home/floppy中,可以这样操作:
[root@localhostfloppy]#mkdir/home/floppy[root@localhostfloppy]#cp/mnt/floppy/*/home/floppy[root@localhostfloppy]#ls/home/floppy
新建一个目录
复制到新目录中
浏览新目录
Linux.tar.gz
3、将虚拟机系统中的文件输出到宿主机
windows
中
1、如果使用虚拟软盘镜像文件,则将虚拟机中的文件输出到windows中,也可以先
按照上面步骤6的方法进行,只不过是将文件复制到虚拟软盘挂载到的路径上,比
如,要将虚拟机/tmp/下的install.log文件复制到虚拟软盘镜像中,可如下操作:
[root@localhost/tmp]#cp/tmp/install.log/mnt/floppy
[root@localhost/tmp]#ls/mnt/floppy
install.logLinux.tar.gz
2、如果要将该文件从虚拟软盘中读出来,首先需要先将该虚拟软盘文件从虚拟机操作系统的文件系统中卸载,然后释放改虚拟软盘。
运行命令:
[root@localhost/tmp]#umount/mnt/floppy
[root@localhost/tmp]#
3、运行winimage打开a.vfd。
将需要的文件拖到windows中即可。
B、linux0.01的编译和调试
1、linux0.01的编译
1、按照实验一,任务2的方法,把linux0.01源代码压缩包linux.tar.gz复制到虚拟机
的/home/myfile下。
2、使用cd/home/myfile命令进入该目录,然后运行如下命令解压缩
到目录中多出一个新的目录linux,此目录存放的就是linux0.01
完成后可以看的源代码。
[root@localhost/tmp]#cd/home/myfile
[root@localhostmyfile]#ls
Linux.tar.gz
[root@localhostmyfile]#gzip–dLinux.tar.gz
[root@localhostmyfile]#tarxvfLinux.tar
[root@localhostmyfile]#ls
linuxLinux.tar
3、编译linux0.01,注意首先要修改tools/build和ndisasm的文件属性,给它加上可执行权。
然后在linux目录中执行make。
[root@localhostmyfile]#cdlinux
[root@localhostlinux]#cdtools
[root@localhosttools]#chmod+x./tools/build
#修改文件属性,增加可执行权
[root@localhosttools]#chmod+x
./ndisasm
[root@localhosttools]#ls-l
total20
-rwxr-xr-x
1root
root
13019Sep18
2001build
-rw-r--r--
1root
root
1722Sep18
2001build.c
[root@localhosttools]#cd../..
[root@localhostlinux]#make
4、按如上方法编译成功后,在
linux
目录下应该有
Image和System.map,System.asm
文件。
5、制作linux0.01引导盘。
首先使用bximage.exe创建一个虚拟软盘文件a.img。
将该文件载入到虚拟机。
或者插入一个真正的软盘,然后载入到虚拟机。
6、运行命令makedisk,生成能够的linux0.01系统引导盘
。
7、运行命令init0关闭虚拟机(请特别注意不要直接复位或关闭虚拟机),然后重
新启动。
在启动过程中请载入刚才生成的系统引导盘,虚拟机将会被引导进入linux0.01。
8、系统引导後,按动键盘如果打印出按键的ascii码则表示引导成功。
9、将编译生成的System.map输出到windows中,方法如下:
10、重新进入redhat7.1建立一个虚拟软盘b.img,载入到虚拟机。
11、运行命令格式化该虚拟软盘为msdos格式。
然后mount,进行复制。
[root@localhostlinux]#mformata:
[root@localhostlinux]#mount/dev/fd0/mnt/floppy
[root@localhostlinux]#cpSystem.map/mnt/floppy
[root@localhostlinux]#umount/mnt/floppy
2、linux0.01在bochs中调试
1、使用任务1生成的linux0.01引导软盘镜像文件a.img。
在bochs中进行引导
2、参考上次实验内容在bochs中调试linux0.01的运行情况,特别是观察boot.s和
head.s部分代码的运行情况。
3、可以在线性地址0处设置断点,查看System.map,找出main的入口地址,并设
置断点,观察head.s的运行情况,根据观察结果,请回答head.s运行完后,页
目录和页表部分的值是什么。
2、对该文件进行编译。
生成sample.bin文件
五、实验体会
本次实验内容主要是熟悉使用linux内核的编译方法和调试方法。
较实验一
来说,实验难度有所增加,所以做的时候的确遇到了不少问题。
比如修改文件属
性的时候chmod指令中忘了加.而且文件所在目录进入有误导致结果不对,后来
查了指令集后才弄清楚。
还有单步调试的时候开始不会设断点,问过同学之后才
学会。
通过本次实验比上次实验收获得更多,自己动手才会有收获,相信接下来
的实验中我会更加认真,也会学到更多。
实验三、linux任务切换实验
一、实验目的
通过一个在内核中预先设置的任务切换,理解linux任务运行和切换的机制。
二、实验内容:
Linux0.00的编译和修改
说明:
本例是linux0.00版的源代码,boot.s和head.s的功能基本如课程中介绍,但略有修改,head.s中增加了两个任务(task),并且通过时钟中断轮流进行任务的切换,这两个任务通过系统调用向终端显示字符。
三、实验环境:
操作系统windows、virPC,BOCHS
四、实验步骤及截图
1、下载实验目录中的linux000文件(boot.s,head.s,makefile)
2、根据前面实验的方法,在virtualPC的linux7.1环境中编译,用生成的image制作一个引导软盘镜像。
3、用该软盘镜像引导系统,观察结果。
(AB交替循环出现)
4、在bochs中观察任务切换时cpu的各个寄存器的变化。
5、根据观察试着阐述linux000中,gdt,ldt,idt中的描述符都有哪些,作用如何,本例中任务调用的方式有哪些
进一步思考题:
试着修改head.s,增加一个任务,并让三个任务进行轮流
切换。
(1)增加任务2的TSS和LDT的选择符
TSS2_SEL=0x40
LDT2_SEL=0x48
(2)修改中断处理
timer_interrupt:
push%ds
pushl%eax
movl$0x10,%eax
mov%ax,%ds
movb$0x20,%al
outb%al,$0x20
movl$1,%eax
cmpl%eax,current
je1f
#当前为任务
1,则跳转为任务
0
jl3f
#当前为任务
0,则跳转为任务
2
movl%eax,current
ljmp$TSS1_SEL,$0
jmp2f
#当前为任务
2,则跳转为任务
1
1:
movl$0,current
ljmp$TSS0_SEL,$0
jmp2f
3:
movl$2,current
ljmp$TSS2_SEL,$0
2:
popl%eaxpop%dsiret
(3)任务2的ldt和tss段
ldt2:
.quad0x0000000000000000
.quad0x00c0fa00000003ff
#0x0f,base=0x00000
.quad0x00c0f200000003ff
#0x17
tss2:
.long0
/*backlink*/
.longkrn_stk2,0x10
/*esp0,ss0*/
.long0,0,0,0,0
/*esp1,ss1,esp2,ss2,cr3*/
.longtask2,0x200
/*eip,eflags*/
.long0,0,0,0
/*eax,ecx,edx,ebx*/
.longusr_stk2,0,0,0
/*esp,ebp,esi,edi*/
.long0x17,0x0f,0x17,0x17,0x17,0x17/*es,cs,ss,ds,fs,gs*/
.longLDT2_SEL,0x8000000
/*ldt,tracebitmap*/
.fill128,4,0
krn_stk2:
(4)增加任务2,打印Ctask2:
movl$0x17,%eax
movw%ax,%ds
movb$68,%al/*print'D'C在系统中断时会显示*/int$0x80
movl$0xfff,%ecx
1:
loop1bjmptask2
.fill128,4,0
usr_stk2:
修改后结果:
五、实验体会
本次实验因为有修改代码的部分,所以感觉还是比较有难度的。
第一步跟上
个实验比较相似,把给定文件拷贝到虚拟机里新建的文件夹中然后再makedisk
一个软盘镜像,然后再用其引导系统,做出实验结果的时候还是比较顺利的。
改代码的部分就不大容易了,虽然照着原来的代码和注释进行修改,但也一直无法编译或者运行总是跳出到系统中断中,最后不断的调试、又问了同学才做出结果。
要学习的还有好多,虽然实验已经结束了,但相信之后要用到虚拟机和linux系统的机会还有很多。