0%

HIT-OSLab0

cHIT-OSLab0

实验环境搭建:

1
2
3
git clone https://github.com/DeathKing/hit-oslab.git
cd hit-oslab
./setup.sh
  • 在用户目录下会生成一个 oslab 目录,这里面就是实验的环境(阉割版的 Linux 0.11)

Linux 0.11 需要 gcc-3.4 进行编译,使用如下命令添加并切换 gcc-3.4 的链接组:

1
2
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-3.4 50
sudo update-alternatives --config gcc

再使用如下命令进行切换:

1
2
3
4
5
6
7
8
  选择       路径            优先级  状态
------------------------------------------------------------
0 /usr/bin/gcc-5 50 自动模式
1 /usr/bin/gcc-11 50 手动模式
* 2 /usr/bin/gcc-3.4 50 手动模式
3 /usr/bin/gcc-5 50 手动模式
4 /usr/bin/gcc-7 50 手动模式
5 /usr/bin/gcc-9 50 手动模式

Linux 0.11 是 Linux 操作系统的第一版本,于 1991 年发布,它的源码结构反映了 Linux 的发展历程和设计思想

Linux 0.11 的源码结构比较简单,主要由以下几个部分组成:

  • 内核(kernel)
  • 系统调用(syscall)
  • 用户空间应用程序(userland apps)
  • 配置文件(config files)

实验目录的结构如下:(部分缺失的功能将由后续实验完成)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
.
├── bochs /* QEMU模拟器插件 */
│   ├── BIOS-bochs-latest
│   ├── bochsrc.bxrc
│   ├── bochsrc-gdb.bxrc
│   └── vgabios.bin
├── files
│   ├── memtest
│   ├── process.c
│   ├── stat_log.py
│   ├── testlab2.c
│   └── testlab2.sh
├── hdc
│   └── umounted
├── hdc-0.11.img
├── linux-0.11 /* linux-0.11源码 */
│   ├── boot /* 引导程序 */
│   │   ├── bootsect.s
│   │   ├── head.s
│   │   └── setup.s
│   ├── fs /* 内核文件系统 */
│   │   ├── bitmap.c
│   │   ├── block_dev.c
│   │   ├── buffer.c
│   │   ├── char_dev.c
│   │   ├── exec.c
│   │   ├── fcntl.c
│   │   ├── file_dev.c
│   │   ├── file_table.c
│   │   ├── inode.c
│   │   ├── ioctl.c
│   │   ├── Makefile
│   │   ├── namei.c
│   │   ├── open.c
│   │   ├── pipe.c
│   │   ├── read_write.c
│   │   ├── stat.c
│   │   ├── super.c
│   │   └── truncate.c
│   ├── include /* 内核头文件 */
│   │   ├── a.out.h
│   │   ├── asm
│   │   │   ├── io.h
│   │   │   ├── memory.h
│   │   │   ├── segment.h
│   │   │   └── system.h
│   │   ├── const.h
│   │   ├── ctype.h
│   │   ├── errno.h
│   │   ├── fcntl.h
│   │   ├── linux
│   │   │   ├── config.h
│   │   │   ├── fdreg.h
│   │   │   ├── fs.h
│   │   │   ├── hdreg.h
│   │   │   ├── head.h
│   │   │   ├── kernel.h
│   │   │   ├── mm.h
│   │   │   ├── sched.h
│   │   │   ├── sched.h.cur1
│   │   │   ├── sched.h.old
│   │   │   ├── sys.h
│   │   │   └── tty.h
│   │   ├── signal.h
│   │   ├── stdarg.h
│   │   ├── stddef.h
│   │   ├── string.h
│   │   ├── sys
│   │   │   ├── stat.h
│   │   │   ├── times.h
│   │   │   ├── types.h
│   │   │   ├── utsname.h
│   │   │   └── wait.h
│   │   ├── termios.h
│   │   ├── time.h
│   │   ├── unistd.h
│   │   └── utime.h
│   ├── init /* init进程 */
│   │   └── main.c
│   ├── kernel /* 内核 */
│   │   ├── asm.s
│   │   ├── blk_drv /* 内核块驱动 */
│   │   │   ├── blk.h
│   │   │   ├── floppy.c
│   │   │   ├── hd.c
│   │   │   ├── ll_rw_blk.c
│   │   │   ├── Makefile
│   │   │   └── ramdisk.c
│   │   ├── chr_drv /* 内核字符驱动 */
│   │   │   ├── console.c
│   │   │   ├── keyboard.S
│   │   │   ├── Makefile
│   │   │   ├── rs_io.s
│   │   │   ├── serial.c
│   │   │   ├── tty_io.c
│   │   │   └── tty_ioctl.c
│   │   ├── exit.c
│   │   ├── fork.c
│   │   ├── Makefile
│   │   ├── math
│   │   │   ├── Makefile
│   │   │   └── math_emulate.c
│   │   ├── mktime.c
│   │   ├── panic.c
│   │   ├── printk.c
│   │   ├── sched.c
│   │   ├── signal.c
│   │   ├── sys.c
│   │   ├── system_call.s
│   │   ├── traps.c
│   │   └── vsprintf.c
│   ├── lib /* 系统调用的实现 */
│   │   ├── close.c
│   │   ├── ctype.c
│   │   ├── dup.c
│   │   ├── errno.c
│   │   ├── execve.c
│   │   ├── _exit.c
│   │   ├── Makefile
│   │   ├── malloc.c
│   │   ├── open.c
│   │   ├── setsid.c
│   │   ├── string.c
│   │   ├── wait.c
│   │   └── write.c
│   ├── Makefile
│   ├── mm /* 内核进程管理 */
│   │   ├── Makefile
│   │   ├── memory.c
│   │   └── page.s
│   ├── tags
│   └── tools
│   └── build.c
├── linux-0.11.tar.gz
├── mount-hdc
└── run

常见报错处理

1
bochs-x 已经是最新版 (2.6.11+dfsg-1build1)
1
2
3
sudo ./configure --with-x11 --with-x --enable-all-optimizations --enable-readline  --enable-debugger-gui --enable-x86-debugger --enable-a20-pin --enable-fast-function-calls --enable-debugger --prefix=/home/yhellow/hit-oslab-all/oslab/bochs-2.6.11/test
make -j8
make install
  • 然后将编译好的二进制文件放入 bochs 目录
1
2
Bochs is exiting with the following message:
[ ] dlopen failed for module 'vga_update_interval' (libbx_vga_update_interval.so): file not found
  • /bochs/bochsrc.bxrc 中注释 vga_update_interval: 300000
1
2
Bochs is exiting with the following message:
[ ] ./bochs/bochsrc.bxrc:10: 'keyboard_serial_delay' is deprecated - use 'keyboard' option instead.
  • /bochs/bochsrc.bxrc 中注释 keyboard_serial_delay: 200
1
2
Bochs is exiting with the following message:
[ ] ./bochs/bochsrc.bxrc:11: 'keyboard_paste_delay' is deprecated - use 'keyboard' option instead.
  • /bochs/bochsrc.bxrc 中注释 keyboard_paste_delay: 100000
1
2
Bochs is exiting with the following message:
[ ] dlopen failed for module 'i440fxsupport' (libbx_i440fxsupport.so): file not found
  • /bochs/bochsrc.bxrc 中注释 i440fxsupport: enabled=0
1
2
Bochs is exiting with the following message:
[ ] ./bochs/bochsrc.bxrc:19: display library 'sdl' not available
  • /bochs/bochsrc.bxrc 中注释 display_library: sdl
1
2
Bochs is exiting with the following message:
[HD ] ata0-0: could not open hard drive image file './hdc-0.11.img'
  • 删除 hdc-0.11.img.lock 文件
1
2
Bochs is exiting with the following message:
[BIOS ] No bootable device.
  • 没有编译 Linux 0.11 内核,需要先切换 gcc-3.4 然后在 linux-0.11 中执行 make all

搭建效果展示