1、Linux实验报告Linux 内核实验报告实验一、 linux 内核开发环境一、实验目的掌握 linux 内核开发环境的安装、调试二、实验内容:虚拟机 bochs 和 virtual PC 的安装、运行使用 nasm 编写简单例程,生成一个简单的引导程序的设计image 文件,并在虚拟机中调试三、实验环境:操作系统 windows 、linux软件工具:见实验配套软件( tools中)其它: 1.44 空白软盘一张四、实验步骤及截图A、虚拟机 bochs 和 virtual PC 的安装、运行使用记事本打开 C:Program FilesBochs-2.3dlxlinux 中的 bochsrc
2、.bxrc 配置文件,浏览该配置文件的内容并回答该 demo linux 模拟启动的方式是软盘。B、windows 环境使用 virtual PC1、建立虚拟机1、进入实验文件夹 Microsoft Virtual PC, 安装并运行 virtual pc 软件。2、按照 virtualPC 的帮助说明,建立一台虚拟计算机。2、使用 nasm 编写简单例程,生成 image 文件1、记事本编辑代码sample.asm:org 07c00h; 告诉编译器程序加载到7c00 处movax, csmovds, axmoves, axcallDispStr; 调用显示字符串例程jmp$; 无限循环Di
3、spStr:movax, BootMessagemovbp, ax; ES:BP =串地址movcx, 16; CX =串长度movax, 01301h; AH = 13, AL = 01hmovbx, 000ch; 页号为 0(BH = 0) 黑底红字 (BL = 0Ch,高亮 )movdl, 0int10h; 10h 号中断retBootMessage:dbHello, OS world!times510-($-$)db0; 填充剩下的空间,使生成的二进制代码恰好为512 字节dw0xaa55; 结束标志2、对该文件进行编译。生成 sample.bin 文件在命令方式中进入实验目录 ,运行
4、命令: nasmw sample.asm o sample.bin 。3、在该目录下以命令方式运行: bximage.exe 选择创建软盘镜像 (fd)文件 sample.img4、将 sample.bin 写入到空白软盘镜像文件中。命令方式运行 :partcopy sample.bin 0 200 sample.img 05、将 sample.img 复制到 bochs 的安装目录,可以新建一个目录比如 sample ,并放入 sample.img 。将 dlx linux 中的配置文件以及批处理文件 run.bat 复制到 sample 。对这两个文件进行适当的修改。并运行。bochsrc
5、 里面修改:floppya: image=sample.img, status=inserted ( 1_44=a 改为 image=sample.img )# floppyb: 1_44=floppyb.img, status=inserted (注释此行)boot: a ( c 改为 a)# hard disk (以下 3 行都注释掉)#ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14#ata0-master: type=disk, path=hd10meg.img, cylinders=306, #heads=4, spt=176
6、、如果使用了真正的软盘,请使用该软盘引导计算机,观察并记录结果。或者直接在 bochs 中使用软驱设备(配置文件需要修改 floppya: 1_44=a:,status=inserted )。7、运行 virtual PC 载入 sample.img 进行模拟。3、建立虚拟机一个简单的引导程序的设计1、打开文件boot.asm ;prog.asm.2、使用实验二的方法进行编译,并生成image 文件,在bochs中模拟运行(以上两步可能用到的命令:nasmw boot.asm o boot.bin nasmw prog.asm o prog.bin partcopy boot.bin 0 20
7、0 floppy.img 0 partcopy prog.bin 0 200 floppy.img 200)3、复制 bochs 中的 run.bat 文件为 rundbg.bat, 并修改有关语句 : .bochsdbg -q -f bochsrc.bxrc4、双击运行 rundbg.bat ,进入调试模式。5、输入 bochs 的调试命令进行调试,观察上述引导程序的执行过程。记录结果。常用 Bochs 的调试命令:help command 查看命令帮助c 连续执行s count 执行 count 条指令,默认为 1 条(仅键入 s 为单步运行 )q 退出调试ctrl-c 定制执行,回到命令
8、行vbreak seg:0ff 设置断点 (比如 vbreak 0x0000:0x7c00)n 单步运行,不跟踪进入子程序u 返汇编info r 查看当前 cpu 寄存器内容dump_cpu 查看 cpu 所有寄存器内容和状态值print-stack 显示当前堆栈的内容详细内容可以查看 bochs 的联机帮助(在 bochs 安装主目录 docs 下)五、实验体会本次实验内容主要是熟悉虚拟机和 Linux 系统操作,因为之前学习操作系统的时候用过 linux,所以觉得操作方面不太难。不过做的时候还是出现了写错误,比如修改 bochsrc的时候 boot 和 floppy 没有对应,runbat
9、 修改的时候忘记修改 img名称等等。经过一番折腾,最终做出实验结果的时候非常开心。此外,之前没用过虚拟机的单步调试, 学习了之后发现非常有帮助, 以后可以考虑把代码放在虚拟机里跑,这样可以互不干扰而且方便文件管理。 通过实验学习到了很多, 之后的实验我会更加认真对待。实验二、 Linux0.01 内核编译环境一、实验目的掌握 linux0.01 内核的编译方法掌握使用虚拟机软件进行内核开发调试的方法二、实验内容:在 virtualPC 和 BOCHS下建立 LINUX0.01 内核开发环境linux0.01 的编译和调试三、实验环境:操作系统 windows 、linux软件工具:见实验配套
10、软件 ( ex2 中)其它:移动存储设备用于保存实验环境四、实验步骤及截图A、在 virtualPC 和 BOCHS 下建立 LINUX0.01 内核开发环境1、VirtualPC 中运行 redhat7.12、virtualPC 虚拟和 windows 的文件互访1、制作虚拟软盘文件。(使用 winimage 新建一个 1.44 软盘文件,将 下的 linux.tar.gz拖到该文件中。然后保存为 a.vfd。这是 virtualPc 默认的虚拟软盘镜像文件格式。2、启动虚拟机 linux7.1 ,以账户 root 登录,口令为 aaaaaa。注意,如果运行时系统提示内存不够,请重新设置虚拟
11、机的内存,比如 64mb。3、加载步骤 1 建立的虚拟软盘文件。则该文件就成为虚拟机的软盘。4、将该软盘挂载到 linux 的 /mnt/floppy 下。命令如下:rootlocalhost /root# mount -t vfat /dev/fd0 /mnt/floppy5、运行命令: cd /mnt/floppyls 如果正常就可以看见软盘中的linux.tar.gz文件。6、可以将该文件复制到虚拟操作系统的其他路径中,比如,复制到在 /home/floppy 中,可以这样操作:rootlocalhost floppy# mkdir /home/floppy rootlocalhost
12、floppy# cp /mnt/floppy/* /home/floppy rootlocalhost floppy# ls /home/floppy新建一个目录复制到新目录中浏览新目录Linux.tar.gz3、将虚拟机系统中的文件输出到宿主机windows中1、如果使用虚拟软盘镜像文件, 则将虚拟机中的文件输出到 windows 中,也可以先按照上面步骤 6 的方法进行,只不过是将文件复制到虚拟软盘挂载到的路径上,比如,要将虚拟机 /tmp/ 下的 install.log 文件复制到虚拟软盘镜像中,可如下操作:rootlocalhost /tmp# cp /tmp/install.log
13、/mnt/floppyrootlocalhost /tmp# ls /mnt/floppyinstall.log Linux.tar.gz2、如果要将该文件从虚拟软盘中读出来, 首先需要先将该虚拟软盘文件从虚拟机操作系统的文件系统中卸载,然后释放改虚拟软盘。运行命令:rootlocalhost /tmp# umount /mnt/floppyrootlocalhost /tmp#3、运行 winimage 打开 a.vfd。将需要的文件拖到 windows 中即可。B、linux0.01 的编译和调试1、linux0.01 的编译1、按照实验一, 任务 2 的方法, 把 linux0.01 源
14、代码压缩包 linux.tar.gz 复制到虚拟机的 /home/myfile 下。2、使用 cd /home/myfile 命令进入该目录,然后运行如下命令解压缩到目录中多出一个新的目录 linux ,此目录存放的就是 linux0.01,完成后可以看的源代码。rootlocalhost /tmp# cd /home/myfilerootlocalhost myfile# lsLinux.tar.gzrootlocalhost myfile# gzip d Linux.tar.gzrootlocalhost myfile# tar xvf Linux.tarrootlocalhost myf
15、ile# lslinux Linux.tar3、编译 linux0.01 ,注意首先要修改 tools/build 和 ndisasm 的文件属性,给它加上可执行权。然后在 linux 目录中执行 make。rootlocalhost myfile# cd linuxrootlocalhost linux# cd toolsrootlocalhost tools# chmod +x ./tools/build#修改文件属性,增加可执行权rootlocalhost tools# chmod +x./ndisasmrootlocalhost tools# ls -ltotal 20-rwxr-xr
16、-x1 rootroot13019 Sep 182001 build-rw-r-r-1 rootroot1722 Sep 182001 build.crootlocalhost tools# cd ./.rootlocalhost linux# make4、按如上方法编译成功后,在linux目录下应该有Image 和 System.map,System.asm文件。5、制作 linux0.01 引导盘。首先使用 bximage.exe 创建一个虚拟软盘文件 a.img。将该文件载入到虚拟机。或者插入一个真正的软盘,然后载入到虚拟机。6、运行命令 make disk ,生成能够的 linux0.
17、01 系统引导盘。7、运行命令 init 0 关闭虚拟机(请特别注意不要直接复位或关闭虚拟机) ,然后重新启动。在启动过程中请载入刚才生成的系统引导盘,虚拟机将会被引导进入 linux0.01 。8、系统引导後,按动键盘如果打印出按键的 ascii 码则表示引导成功。9、将编译生成的 System.map 输出到 windows 中,方法如下:10、重新进入 redhat7.1 建立一个虚拟软盘 b.img,载入到虚拟机。11、运行命令格式化该虚拟软盘为 msdos 格式。然后 mount ,进行复制。rootlocalhost linux# mformat a:rootlocalhost l
18、inux# mount /dev/fd0 /mnt/floppyrootlocalhost linux# cp System.map /mnt/floppyrootlocalhost linux# umount /mnt/floppy2、linux0.01 在 bochs 中调试1、使用任务 1 生成的 linux0.01 引导软盘镜像文件 a.img。在 bochs 中进行引导2、参考上次实验内容在 bochs 中调试 linux0.01 的运行情况,特别是观察 boot.s 和head.s 部分代码的运行情况。3、可以在线性地址 0 处设置断点,查看 System.map,找出 main
19、的入口地址,并设置断点,观察 head.s 的运行情况,根据观察结果,请回答 head.s 运行完后,页目录和页表部分的值是什么。 2、对该文件进行编译。生成 sample.bin 文件五、实验体会本次实验内容主要是熟悉使用 linux 内核的编译方法和调试方法。较实验一来说,实验难度有所增加, 所以做的时候的确遇到了不少问题。 比如修改文件属性的时候 chmod 指令中忘了加 .而且文件所在目录进入有误导致结果不对,后来查了指令集后才弄清楚。 还有单步调试的时候开始不会设断点, 问过同学之后才学会。通过本次实验比上次实验收获得更多, 自己动手才会有收获, 相信接下来的实验中我会更加认真,也会
20、学到更多。实验三、 linux 任务切换实验一、实验目的通过一个在内核中预先设置的任务切换,理解 linux 任务运行和切换的机制。二、实验内容:Linux0.00 的编译和修改说明:本例是 linux0.00 版的源代码, boot.s 和 head.s 的功能基本如课程中介绍,但略有修改, head.s 中增加了两个任务( task),并且通过时钟中断轮流进行任务的切换,这两个任务通过系统调用向终端显示字符。三、实验环境:操作系统 windows 、virPC,BOCHS四、实验步骤及截图1、下载实验目录中的 linux000 文件 (boot.s,head.s,makefile)2、 根
21、据前面实验的方法,在 virtualPC 的 linux7.1 环境中编译,用生成的 image 制作一个引导软盘镜像。3、 用该软盘镜像引导系统,观察结果。 ( AB 交替循环出现)4、在 bochs 中观察任务切换时 cpu 的各个寄存器的变化。5、根据观察试着阐述 linux000 中,gdt,ldt,idt 中的描述符都有哪些, 作用如何,本例中任务调用的方式有哪些进一步思考题:试着修改 head.s,增加一个任务,并让三个任务进行轮流切换。( 1)增加任务 2 的 TSS和 LDT 的选择符TSS2_SEL = 0x40LDT2_SEL= 0x48( 2)修改中断处理timer_in
22、terrupt:push %dspushl %eaxmovl $0x10, %eaxmov %ax, %dsmovb $0x20, %aloutb %al, $0x20movl $1, %eaxcmpl %eax, currentje 1f# 当前为任务1,则跳转为任务0jl 3f# 当前为任务0,则跳转为任务2movl %eax, currentljmp $TSS1_SEL, $0jmp 2f# 当前为任务2,则跳转为任务11:movl $0, currentljmp $TSS0_SEL, $0jmp 2f3:movl $2, currentljmp $TSS2_SEL, $02: popl
23、 %eax pop %ds iret( 3)任务 2 的 ldt 和 tss 段ldt2: .quad 0x0000000000000000.quad 0x00c0fa00000003ff# 0x0f, base = 0x00000.quad 0x00c0f200000003ff# 0x17tss2: .long 0/* back link */.long krn_stk2, 0x10/* esp0, ss0 */.long 0, 0, 0, 0, 0/* esp1, ss1, esp2, ss2, cr3 */.long task2, 0x200/* eip, eflags */.long
24、0, 0, 0, 0/* eax, ecx, edx, ebx */.long usr_stk2, 0, 0, 0/* esp, ebp, esi, edi */.long 0x17,0x0f,0x17,0x17,0x17,0x17 /* es, cs, ss, ds, fs, gs */.long LDT2_SEL, 0x8000000/* ldt, trace bitmap */.fill 128,4,0krn_stk2:( 4)增加任务 2,打印 C task2:movl $0x17, %eaxmovw %ax, %dsmovb $68, %al /* print D C 在系统中断时会
25、显示 */ int $0x80movl $0xfff, %ecx1: loop 1b jmp task2.fill 128,4,0usr_stk2:修改后结果:五、实验体会本次实验因为有修改代码的部分, 所以感觉还是比较有难度的。 第一步跟上个实验比较相似,把给定文件拷贝到虚拟机里新建的文件夹中然后再 make disk一个软盘镜像, 然后再用其引导系统, 做出实验结果的时候还是比较顺利的。 改代码的部分就不大容易了, 虽然照着原来的代码和注释进行修改, 但也一直无法编译或者运行总是跳出到系统中断中, 最后不断的调试、又问了同学才做出结果。要学习的还有好多,虽然实验已经结束了,但相信之后要用到虚拟机和 linux 系统的机会还有很多。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1