197. 00_6.828Preparation

工具下载安装

下载

安装

安装的一般命令

  1. 解压: tar -xvf xxx.tar.bz
  2. cd xxx
  3. 配置: ./configure --prefix=/usr/local (这里的配置命令可能各不相同, 可以参见官网或者这里)
  4. 编译: make
  5. 安装: sudo make install

安装全部命令

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
tar xjf gmp-5.0.2.tar.bz2
cd gmp-5.0.2
./configure --prefix=/usr/local
make
make install # This step may require privilege (sudo make install)
cd ..

tar xjf mpfr-3.1.2.tar.bz2
cd mpfr-3.1.2
./configure --prefix=/usr/local
make
make install # This step may require privilege (sudo make install)
cd ..

tar xzf mpc-0.9.tar.gz
cd mpc-0.9
./configure --prefix=/usr/local
make
make install # This step may require privilege (sudo make install)
cd ..


tar xjf binutils-2.21.1.tar.bz2
cd binutils-2.21.1
./configure --prefix=/usr/local --target=i386-jos-elf --disable-werror
make
make install # This step may require privilege (sudo make install)
cd ..

i386-jos-elf-objdump -i
# Should produce output like:
# BFD header file version (GNU Binutils) 2.21.1
# elf32-i386
# (header little endian, data little endian)
# i386...


tar xjf gcc-core-4.6.4.tar.bz2
cd gcc-4.6.4
mkdir build # GCC will not compile correctly unless you build in a separate directory
cd build
../configure --prefix=/usr/local \
--target=i386-jos-elf --disable-werror \
--disable-libssp --disable-libmudflap --with-newlib \
--without-headers --enable-languages=c MAKEINFO=missing
make all-gcc
make install-gcc # This step may require privilege (sudo make install-gcc)
make all-target-libgcc
make install-target-libgcc # This step may require privilege (sudo make install-target-libgcc)
cd ../..

i386-jos-elf-gcc -v
# Should produce output like:
# Using built-in specs.
# COLLECT_GCC=i386-jos-elf-gcc
# COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/i386-jos-elf/4.6.4/lto-wrapper
# Target: i386-jos-elf


tar xjf gdb-7.3.1.tar.bz2
cd gdb-7.3.1
./configure --prefix=/usr/local --target=i386-jos-elf --program-prefix=i386-jos-elf- \
--disable-werror
make all
make install # This step may require privilege (sudo make install)
cd ..

安装过程中出现的问题

  1. 库找不到问题

    1. 手动添加库的路径到环境变量里: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

实验用的源码

1
$ git clone https://pdos.csail.mit.edu/6.828/2018/jos.git lab

基础知识

基本概念

CPU

16位CPU: 意味着它内部的寄存器都是16位的

寄存器

概念

CPU可以直接使用的小、快速的存储空间, 在执行命令时, 寄存器是直接参与运算的

分类

  • 段寄存器

    • CS
    • DS
    • ES
    • SS
  • 通用寄存器

    • AX
    • BX
    • CX
    • DX
  • 其他寄存器

    • IP
    • SP
    • BP
    • SI
    • DI
    • FLAG

使用

为什么不把立即数直接赋值给数据段寄存器?

  • 由于8086CPU不允许我们这样做

  • 可能防止由于轻易改变DS而造成一些混乱

内存

CPU外部的存储空间, 他跟CPU通过地址总线, 数据总线和控制总线相连. 若使用内存中的数据, 必须通过这些总线与内存取得联系, 而且CPU直接使用的都是寄存器中的数据, 内存中的数据必须先装载在到寄存器中才能参与运算.

布局

  • BIOS ROM

    • 地址空间范围

      • 8086: 0xF0000 -> 0xFFFFF
    • 作用

      是系统上电时最先执行的代码, 比操作系统还要早, 是计算机厂商在出厂时固化的一段代码. 负责上电自检(开机自检), 加载磁盘的活动分区

      • 上电自检(Power On self Test): 检查各个硬件是否正常

      • 加载磁盘的第一个可引导扇区

        一个扇区512Byte, 如果最后两个字节是 0xaa55, 则BIOS判定该扇区可引导, 并将该扇区加载到 0x0000:0x7c00 的内存簇, 然后使用跳转指令跳到该簇(CS=0x0000, IP=0x7c00)执行, 将执行流交给了 0x0000:0x7c00 处的代码

    • 我们能做什么

      就是在磁盘的第一个扇区存放我们的代码