OS实验一 操作系统的引导


草,我还以为延时要付费呢

指令备忘

  • 编译内核cd ./linux-0.11/然后make all
  • 删除编译make clean
  • 运行编译好的内核cd ~/oslab/然后./run
  • 汇编级调试:./dbg-asm
  • C语言级调试:先cd ~/oslab然后./dbg-c;之后cd ~/oslab然后./rungdb
  • 访问linux0.11:cd ~/oslab/然后sudo ./mount-hdc(启动挂载脚本)之后hdc下就是和0.11内核一样的文件系统了
  • 密码是shiyanlou
  • 读写完毕,卸载文件系统cd ~/oslab/然后sudo umount hdc
  • 注意 1:不要在 0.11 内核运行的时候 mount 镜像文件,否则可能会损坏文件系统。同理,也不要在已经 mount 的时候运行 0.11 内核。
  • 注意 2:在关闭 Bochs 之前,需要先在 0.11 的命令行运行 “sync”,确保所有缓存数据都存盘后,再关闭 Bochs。

操作系统的引导实验

下面将给出一些更具体的 “提示”。这些提示并不是实验的一步一步的指导,而是罗列了一些实验中可能遇到的困难,并给予相关提示。它们肯定不会涵盖所有问题,也不保证其中的每个字都对完成实验有帮助。所以,它们更适合在你遇到问题时查阅,而不是当作指南一样地亦步亦趋。本课程所有实验的提示都是秉承这个思想编写的。

所以还是先自己做一遍吧~难度不大

改写bootsect.s

1.解压缩文件

# 进入到 oslab 所在的文件夹
$ cd /home/shiyanlou/oslab/

# 解压,并指定解压到 /home/shiyanlou/
# 这样的话,在 /home/shiyanlou/oslab/ 中就能找到解压后的所有文件
$ tar -zxvf hit-oslab-linux-20110823.tar.gz \
  -C /home/shiyanlou/

# 查看是否解压成功
$ ls -al
# 除了压缩包 hit-oslab-linux-20110823.tar.gz 之外,其他的就是压缩包中的内容

2.gedit打开Linux 0.11 文件夹中的 boot/bootsect.s、boot/setup.s 和 tools/build.c
3.更改关键代码
bootsect.s

Print some inane message mov ah,#0x03!read cursor pos xor bh,bh int 0×10
mov Cx,#23
mov bx,#0x0007 !page 0,attribute 7(normal)
mov bp,#msg1
mov ax,#0×07c0
mov es,ax mov ax,#0x1301 !write string,move cursor int 0x10
inf loop: jmp inf loop
msg1:
	.byte 13,10
	.ascii  "treblez's OS desu"
	.byte 13,10,13,10

.org 510

boot_flag:
	.word 0xAA55

4.进行编译

cd ./linux-0.11/然后make all

5.编译之后得到了好多文件,之后我们编译连接

$ as86 -0 -a -o bootsect.o bootsect.s
$ ld86 -0 -s -o bootsect bootsect.o

这里讲解一下,.s.o和.S

.s 汇编语言源程序; 操作: 汇编
.S汇编语言源程序; 操作: 预处理 + 汇编
.o文件 只编译不链接形成.o文件。里面包含了对各个函数的入口标记,描述,当程序要执行时还需要链接(link).链接就是把多个.o文件链成一个可执行文件。

-0(注意:这是数字 0,不是字母 O)表示生成 8086 的 16 位目标程序,-a 表示生成与 GNU as 和 ld 部分兼容的代码,-s 告诉链接器 ld86 去除最后生成的可执行文件中的符号信息。
6.去除bootsect中的可执行文件头部(只留下引导扇区的512字节)

dd bs=1 if=bootsect of=Image skip=32
# 当前的工作路径为 /home/shiyanlou/oslab/linux-0.11/boot/
# 将刚刚生成的 Image 复制到 linux-0.11 目录下
$ cp ./Image ../Image
# 执行 oslab 目录中的 run 脚本
$ ../../run

然后就出现了一个从dosbox就开始写,从virualbox也写过,然后现在又写了一遍的字符串显示窗口。
在这里插入图片描述

改写setup.s

bootsect.s

SETUPLEN=2
SETUPSEG=0x07e0
entry _start
_start:
    mov ah,#0x03
    xor bh,bh
    int 0x10
    mov cx,#36
    mov bx,#0x0007
    mov bp,#msg1
    mov ax,#0x07c0
    mov es,ax
    mov ax,#0x1301
    int 0x10
load_setup:
    mov dx,#0x0000
    mov cx,#0x0002
    mov bx,#0x0200
    mov ax,#0x0200+SETUPLEN
    int 0x13
    jnc ok_load_setup
    mov dx,#0x0000
    mov ax,#0x0000
    int 0x13
    jmp load_setup
ok_load_setup:
    jmpi    0,SETUPSEG
msg1:
    .byte   13,10
    .ascii  "Hello OS world, my name is LZJ"
    .byte   13,10,13,10
.org 510
boot_flag:
    .word   0xAA55

setup.s

! Print Now we are in SETUP
    mov     ax,#SETUPSEG
    mov     es,ax
    mov     ah,#0x03                ! read cursor pos
    xor     bh,bh
    int     0x10

    mov     cx,#23
    mov     bx,#0x0007              ! page 0, attribute 7 (normal)
    mov     bp,#msg_code
    mov     ax,#0x1301              ! write string, move cursor
    int     0x10
msg_code:
    .byte 13,10
    .ascii "Now we are in SETUP"
    .byte 13,10,13,10

posted @ 2020-05-30 23:49  treblez  阅读(568)  评论(0编辑  收藏  举报