一、实验目的
配置环境和工具,学习启动加载内核流程,学习编写代码运行。
二、实验环境
Vmware Pro 15.5
Centos 6
三、实验内容
设置共享目录
(1)指定一个 windows 系统上的文件目录
(2)挂载目录,可以显示共享的目录:
(3)拷贝压缩包到共享目录下面, 在 windows 可以看到:
(4)在 Centos 可以看到:
拷贝压缩包到/root/目录下:
下面先利用远程连接工具PuTTY连接虚拟机,这样可以远程操作。
首先获取虚拟机地址,ip addr
在PuTTY上操作
连接成功。
下面首先处理nasm
切换到 root 目录,cd /root/解压指定文件,并编译。
用指令 tar jxvf nasm-2.14.02.tar.bz2 解压;
编译 nasm 编译器,建议切换到 root 用户编译和安装,可以避免权限设置问题。
找到 nasm-2.14.02 目录,cd nasm-2.14.02
运行脚本:./autogen.sh
./configure
编译 make
安装 make install
查看安装成功
处理gcc相关
设置环境变量,在文件/etc/profile,建议切换到 root 用户编译和安装,可 以避免权限设置问题。
cd /root/ 切换目录
解压 i386-elf-gcc 编译器:tar zxvf i386-elf-gcc.tar.gz
将 bin 目录添加到环境变量 PATH 中:vi /etc/profile
输入i进入编辑模式,添加语句
export PATH=/root/i386-elf-gcc/bin:$PATH
Esc 键退出编辑
:wq 保存并退出
生效命令:source /etc/profile
输入命令检验是否成功:i386-elf-gcc -v
处理i386-elf-binutils-linux-i686
同理解压 i386-elf-binutils-linux-i686.tar.bz2
tar jxvf i386-elf-binutils-linux-i686.tar.bz2
设置环境变量:vi /etc/profile
输入 i 进入编辑模式
添加语句:export PATH=/root/i386-elf-binutils/bin:$PATH
Esc 退出编辑
:wq 保存并退出
输入生效命令:source /etc/profile
输入命令检验是否成功:i386-elf-ld -v
下面是Grub安装
解压 grub 压缩包:tar zxvf grub-2.04.tar.gz
切换目录:cd grub-2.04
配置路径:./configure
编译:make
安装:make install
查看安装成功:grub-mkrescue -v
安装 xorriso
yum install xorriso
进入 2st 目录:cd /mnt/hgfs/centos666/sel4/kernelclass/2st
解压文件:tar zxvf grub-boot.tar.gz
进入目录生成 iso 镜像:cd grub-boot
make iso
在 Windows 目录下可以看到生成了镜像
命令行启动镜像进入 grub 界面
查看可用的命令:help
裸机启动
编译第一个汇编程序来裸机启动。
编译,在 centos666\sel4\kernelclass\2st 目录下运行:
nasm -f bin boot_ sect_ simple.asm -o boot_ sect_ simple.bin
之后用 ls 指令可以看见多了 boot_sect_simple.bin 文件,可知编译成功
Windows 下命令行输入:
qemu-system-i386 “D:\centos666\sel4\kernelclass\2st\boot_sect_simple.bin”
也就是说:boot_sect_simple.bin 是一个硬盘。
1.1 打印
mov ah , 0x0e ; ah 中写入 0x0e,代表 scrolling teletype BIOS routine,可以在屏幕输出字符 int 0x10; 调入软中断,BIOS 显示功能 int 是中断指令,后面是中断的数字。
1.1.1 常量
编译,在 centos666\sel4\kernelclass\2st 目录下运行:
nasm -f bin boot_ sect_hello.asm -o boot_ sect_ hello.bin
之后用 ls 指令可以看见多了 boot_sect_hello.bin 文件,可知编译成功
Windows 下命令行输入:
qemu-system-i386
“D:\centos666\sel4\kernelclass\2st\boot_sect_hello.bin”
1.1.2 指针
编译,在 centos666\sel4\kernelclass\2st 目录下运行:
nasm -f bin boot_ sect_memory.asm -o boot_ sect_ memory.bin
之后用 ls 指令可以看见多了 boot_sect_memory.bin 文件,可知编译成功
Windows 下命令行输入:
qemu-system-i386
“D:\centos666\sel4\kernelclass\2st\boot_sect_memory.bin”
提示:当前代码结构,数据段 the_secret 偏移位置在 ox2d。
1.1.3 堆栈
编译,在 centos666\sel4\kernelclass\2st 目录下运行:
nasm -f bin boot_ sect_stack.asm -o boot_ sect_ stack.bin
之后用 ls 指令可以看见多了 boot_sect_stack.bin 文件,可知编译成功
Windows 下命令行输入:
qemu-system-i386
“D:\centos666\sel4\kernelclass\2st\boot_sect_stack.bin”
1.1.4 函数调用
编译,在 centos666\sel4\kernelclass\2st 目录下运行:
nasm -f bin boot_ sect_main.asm -o boot_ sect_ main.bin
之后用 ls 指令可以看见多了 boot_sect_main.bin 文件,可知编译成功
Windows 下命令行输入:
qemu-system-i386 “D:\centos666\sel4\kernelclass\2st\boot_sect_main.bin”
注意:[org 0x7c00];这是全局偏移声明,bx 不需要每次都加 0x7c00 偏移了。
1.1.5 段
编译,在 centos666\sel4\kernelclass\2st 目录下运行:
nasm -f bin boot_ sect_segmentation.asm -o boot_sect_segmentation.bin
之后用 ls 指令可以看见多了 boot_sect_segmentation.bin 文件,可知编译成功
Windows 下命令行输入:
qemu-system-i386
“D:\centos666\sel4\kernelclass\2st\boot_sect_segmentation.bin”
1.1.6 磁盘/硬盘
“boot_sect_main.asm”准备磁盘读取的参数并调用“disk_load”。
编译,在 centos666\sel4\kernelclass\2st 目录下运行:
nasm -f bin boot_ sect_disk_main.asm -o boot_ sect_ disk_main.bin
之后用 ls 指令可以看见多了 boot_sect_disk_main.bin 文件,可知编译成功。
Windows 下命令行输入:
qemu-system-i386
“D:\centos666\sel4\kernelclass\2st\boot_sect_disk_main.bin”
1.2 32位保护模式
gcc工具链配置
vi /etc/profile
存盘退出之后:
source /etc/profile
使环境变量在当前命令窗口生效
1.2.1 模式切换
编译,在 centos666\sel4\kernelclass\2st 目录下运行:
nasm -f bin 32bit-main.asm -o 32bit-main.bin
之后用 ls 指令可以看见多了 32bit-main.bin文件,可知编译成功
Windows 下命令行输入:
qemu-system-i386 -hda
“D:\centos666\sel4\kernelclass\2st\32bit-main.bin”
1.2.2 内核引导
编译,在 centos666\sel4\kernelclass\2st\bootsect 目录下运行:
make os-image.bin
之后用 ls 指令可以看见多了 os-image.bin文件,可知编译成功
Windows 下命令行输入:
qemu-system-i386 -fda
“D:\centos666\sel4\kernelclass\2st\bootsect\os-image.bin”
注意左上角的 X 字样。这说明内核加载成功。
作业:
1 画一个裸机启动加载内核的流程图。
2 设计一个启动内核后的运行代码,比如打印 hello world
Centos666\sel4\kernelclass\2st 目录下新建 boot_ sect_hellolinux.asm
在 centos666\sel4\kernelclass\2st 目录下运行:
nasm -f bin boot_ sect_helloworld.asm -o boot_ sect_ helloworld.bin
之后用 ls 指令可以看见多了 boot_sect_hellolinux.bin 文件,可知编译成功
Windows 下命令行输入:
qemu-system-i386
“D:\centos666\sel4\kernelclass\2st\boot_sect_helloworld.bin”
注意事项:
- 重启虚拟机时共享文件夹,需要重新挂载目录
vmhgfs-fuse .host:/ /mnt/hgfs/