操作系统实习幻灯片课件

上传人:我*** 文档编号:139259221 上传时间:2020-07-20 格式:PPTX 页数:53 大小:455.85KB
返回 下载 相关 举报
操作系统实习幻灯片课件_第1页
第1页 / 共53页
操作系统实习幻灯片课件_第2页
第2页 / 共53页
操作系统实习幻灯片课件_第3页
第3页 / 共53页
操作系统实习幻灯片课件_第4页
第4页 / 共53页
操作系统实习幻灯片课件_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《操作系统实习幻灯片课件》由会员分享,可在线阅读,更多相关《操作系统实习幻灯片课件(53页珍藏版)》请在金锄头文库上搜索。

1、操作系统实习 Lab1,环境搭建,汇编基础,PC启动,函数调用与终端,环境搭建与基本使用 Bochs简介 ELF文件格式 汇编与内联汇编 JOS系统启动 终端,目录,使用较新的Linux Debian Ubuntu Fedora Redhat均可 推荐使用双系统,可以使用虚拟机 使用恰当的工具链 gcc-3.4,g+-3.4,binutils(2.18) 安装Xwindows开发包 xorg-dev 虚拟机 Bochs 2.2.6 QEMU 新版即可,环境搭建,举例 Ubuntu 选择操作系统版本 8.04(hardy),8.10(intrepid),9.04(jaunty),9.10*(ka

2、rmic) 使用合适的软件源 bjtu,switch(ipv6) 更新系统(非必需) sudo apt-get update sudo apt-get dist-upgrade 选择合适的工具链 sudo apt-get install build-essential gcc-3.4 g+-3.4 补充xorg-dev sudo apt-get install xorg-dev,环境搭建,确定使用正确的编译器 /usr/bin/gcc-3.4 代表gcc-3.4编译器 同理g+-3.4,gcc-4.3,g+4.3 查看当前gcc所代表的版本 gcc v 修改gcc为正确的版本 sudo rm

3、/usr/bin/gcc sudo ln /usr/bin/gcc-3.4 /usr/bin/gcc g+同理 确定使用正确的binutils objdump -v,环境搭建,安装bochs 解压缩 tar xvf bochs*.tar.gz 配置,编译,安装 $./configure -enable-disasm -enable-smp -enable-debugger -enable-new-pit -enable-alloptimizations -enable-4meg-pages -enable-global-pages -enable-pae -disable-reset-ontr

4、iple-fault -with-all-libs -with-x -with-x11 -with-nogui $make $sudo make install,环境搭建,遇到问题 编译过程中出现错误 先找周围的大牛们解决 联系我们 将详细的系统版本,工具链版本,编译时输出的信息记录下来,发给我们。 使用虚拟机时请不要安装Vmware tools 如何在虚拟机和本机之间交换文件? 私人ftp,未名站内等,环境搭建,安装VIM, ctags, cscope sudo apt-get install vim ctags cscope 配置它们 使用演示,基本使用,Bochs是什么 Bochs 是一

5、款用来模拟Intel x86 环境的模拟器。通过配置它可以实现386、486、Pentium、Pentium II、Pentium III、Pentium 4 甚至是x86-64 的模拟,还支持包括MMX、SSEx 与3DNow!这样的扩展指令。Bochs 能够解释从开机到重启机器的每一条指令,同时还可以对键盘、鼠标、显卡、硬盘、始终芯片、网卡等等外围设备进行模拟。因为Bochs 模拟了整个PC 的运行环境,于是在仿真环境中运行的软件会感到它好像就是运行在真实的机器上一样。这样Bochs 便可以使很多的软件不加修改便运行在它所模拟的环境中。在Bochs 中可以运行包括Windows 95/98

6、/NT/2000/XP/Vista、所有的Linux 系列和所有的BSD 系列在内的许多可以运行在x86 架构下的操作系统。,Bochs,使用Bochs进行调试 下断点 vb,lb,pb vb 0008:0 xdeadbeaf lb 0 xdeadbeaf pb 0 xdeadbeaf 查看断点 blist 查看内存 x,xp 察看系统信息 info cpu, info break, info cpu, info gdt 从JOS返回bochs CTRL+C 从bochs退出 q,或者CTRL+D,Bochs,回顾,ELF格式 类似于“字典”,由头部(header)和很多区(也有翻译为节,段,

7、section) 映像 image 可执行体的各种形态,比如内存映像,磁盘映象 常用的可执行体的磁盘映象是以COFF (Common Object File Format)文件形态存在的。,ELF格式与映像加载,COFF文件的例子,ELF格式与映像加载,Portable Executable),ELF格式与映像加载,ELF文件,ELF格式与映像加载,ELF格式与映像加载,描述整个文件的组织,告诉系统如何创建进程映像。用来构造进程映像的目标文件必须具有程序头部表,节区部分包含链接视图的大量信息:指令、数据、符号表、重定位信息等等,包含了描述文件节区的信息,每个节区在表中都有一项,每一项给出诸如节

8、区名称、节区大小这类信息,映像加载的过程,ELF格式与映像加载,GNU 汇编程序GAS(GNU Assembly)和连接程序 我们编写了一个程序后,就需要对其进行汇编和连接。在Linux 下有两种方式,一种是使用汇编程序GAS 和连接程序LD,一种是使用GCC。 GAS 把汇编语言源文件(.S 或.s)转换为目标文件(.o),其基本语法如下: as sourcecode.s -o objfile.o 一旦创建了一个目标文件,就需要把它连接并执行,连接一个目标文件的基本语法为: ld objfile.o -o execode 这里objfile.o 是目标文件名,而execode 是输出(可执行

9、) 文件。 如果要使用GNC 的C 编译器gcc,就可以一步完成汇编和连接,例如: gcc -o execode sourcecode.S 这里,sourcecode.S 是你的汇编程序,输出文件(可执行文件)名为execode。其中,扩展名必须为大写的S,这是因为,大写的S 可以使gcc 自动识别汇编程序中的C 预处理命令,像#include、#define、#ifdef、 #endif 等,也就是说,使用gcc 进行编译,你可以在汇编程序中使用C 的预处理命令。,汇编与内联汇编,.data output: .ascii hello worldn .text .globl _start _s

10、tart: movl $4, %eax movl $1, %ebx movl $output, %ecx movl $12, %edx int $0 x80 movl $1, %eax int $0 x80,汇编与内联汇编,.data节 这种节包含程序已初始化的数据,也就是说,包含具有初值的那些变量,例如: hello : .string Hello world!n hello_len : .long 16 .text 这个节包含程序的代码。需要指出的是,该节是只读节,而.data 和.bss 是可读写的节。,汇编与内联汇编,.bss 这个节包含程序还未初始化的数据,也就是说,包含没有初值的那

11、些变量。当操作系统装入这个程序时将把这些变量都置为0,例如: name : .fill 30 # 用来请求用户输入名字 name_len : .long 0 # 名字的长度(尚未定义) 当这个程序被装入时,name 和 name_len 都被置为0。如果你在.bss 节不小心给一个变量赋了初值,这个值也会丢失,并且变量的值仍为0。 使用.bss 比使用.data 的优势在于,.bss 节在编译后不占用磁盘的空间,这样编译、连接生成的代码的尺寸会比较小。例如,在磁盘上,通常一个长整数(4 个字节)所占用的空间,就足以存放一个.bss 节。 需要注意的是,编译程序往往把.data 和.bss 放在

12、4 字节上对齐,因此,这两个节的起始地址会是4 的倍数。同时,4 字节对齐的要求也会导致.data 节所占用的空间往往会大于它实际所需的空间,且大小为4 的倍数。例如,假设.data 总共有30 字节,在生成代码时,由于它和它之后的.bss 节都需要4 字节对齐,于是.data 节之后的两个字节都不会被用到,也就是说实际给了.data 节32 字节的空间。,汇编与内联汇编,汇编程序指令(Assembler Directive) .ascii 语法:.ascii string. .ascii 表示零个或多个(用逗号隔开)字符串,并把每个字符串(结尾不自动加“0”字符)中的字符放在连续的地址单元。

13、例如例2-2 中的: output: .ascii hello worldn 在这里,字符串output 不会被自动添零,于是在之后的输出过程中程序需要通过edx寄存器来告知系统输出字符串的长度。 还有一个与.ascii 类似的.asciz,z 代表“0”,即每个字符串结尾自动加一个“0”字符,例如定义字符串err_int_msg: err_int_msg: .asciz Unknown interruptn,汇编与内联汇编,.fill 语法:.fill repeat , size , value 其中,repeat,size 和value 都是常量表达式。.fill 的含义是反复拷贝size

14、 个字节,重复repeat 次。repeat 可以大于或者等于0。size 也可以大于等于0,但不能超过8,如果超过8,也只取8。size 个字节的内容将被填充为value 的值,如果size 的大小大于value 的存储所需要的容量,则将高位用0 来填充。例如,size 为8,则最高4 个字节内容为0,最低4 字节内容置为value。 size 和 value 为可选项。如果第二个逗号和value 值不存在,则假定value 为0。如果第一个逗号和size 不存在,则假定size 为1。例如: .fill 30, 8 , 0 即表示反复30 次,每次向8 个字节中拷贝0 值。,汇编与内联汇编

15、,.globl 语法:.globl symbol .globl 使得连接程序(ld)能够看到symbol。如果你的局部程序中定义了symbol,那么,与这个局部程序连接的其他局部程序也能存取symbol,例如: 某个.S 文件的源程序中某一段为如下 . .data .globl number .set number 10 . 而与该文件属于同一个文件夹的另一.S 文件的某一段代码为 . .text movl $number %eax . 可以看到在前一个文件中定义的globl 变量number 在后一个文件中可以被引用。,汇编与内联汇编,.rept .endr 语法: .rept count

16、. .endr 把.rept 指令与.endr 指令之间的行重复count 次,例如: .rept 3 .long 0 .endr 相当于: .long 0 .long 0 .long 0 在这里,.rept 指令比较容易和.fill 指令混淆,它们的区别是.rept 是将.rept 与.endr 之间的指令重复3 次,而.fill 则是单纯的重复填充数据。,汇编与内联汇编,.space 语法:.space size , fill 这个指令保留size 个字节的空间,每个字节的值为fill。size 和fill 都是常量表达式。 如果逗号和fill 被省略,则假定fill 为0。例如: Label: .space 10, 1,汇编与内联汇编,.byte 语法:.byte expressions 预留1 个字节,并将这个字节的内容赋值为expression,如果是用逗号隔开的多个expression,则为预留多个

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号