• 关于学习MIT6.828操作系统课程lab1记录



    今天把第一课的实验过一遍,然后看了一下前512字节的bootloader的代码。对bios的int0x10 软中断服务程序进行了一点实验。整个过过程遇到些问题,记录一下,以免忘了没有地方找!

    1:在编译lab下代码时遇到的问题:

    lib/printfmt.c:42:对‘__udivdi3’未定义的引用
    lib/printfmt.c:50:对‘__umoddi3’未定义的引用

    原因:由于在printfmt.c文件中用了libgcc.a中的库函数,但是我的开发环境是64位的gcc,所以找不到这个库文件

    解决:

     sudo apt-get install gcc-multilib
    sudo apt-get install ia32-libs lib32gcc1 lib32stdc++6


    安装完上面的库后,在GNUmakefile中将GCC_LIB改为下面这样:

    GCC_LIB :=-L /usr/lib/gcc/x86_64-linux-gnu/4.7.2/32 -lgcc

    如果我们编译时用的gcc是64位的,大多人都是64位的,在cc和ld时,要在makefile中加入下面这样生成32位代码的选项:

    LDFLAGS := -m elf_i386
    CFLAGS += -Wall -Wno-format -Wno-unused -Werror -gstabs -m32


    上面那样,基本上就没有什么问题了。

    安装qemu,pc虚拟机:

    这个比较简单,没有多大问题:

    git clone http://pdos.csail.mit.edu/6.828/qemu.git -b 6.828-0.15

    ./configure --disable-kvm --target-list="i386-softmmu x86_64-softmmu"

    make && sudo make install


    安装比较顺利。

    下面是用qemu的过程:

    在lab1g下面,make后,如果生成了kernel.img就行了,

    然后make qemu就能启动我们的kernel.img内核了。

    问题:如果在make的时候,生成的boot文件过大,超过了512字节,

    解决:那是编译器的问题,我换成了gcc4.5

    sudo apt-get install gcc4.5


    问题:在用gdb来和qemu联合调试时,不能正常的通过.gdbinit文件加载kernel文件,

    解决: gdb -q -iex "set auto-load safe-path /home/administrator"


    对boot.S和main.c稍微看了一下:

    boot.S做了如下工作:

    1:enable A20地址线

    2:设置好gdt,转换成32位的protected mode

    3:设置好栈指针

    4:跳转到main.c的bootmain函数


    main.c做了如下工作:

    1:复制8个sector大小的kernel文件到ram中,

    2:给程序发配segment地址,不太了解

    3:跳转到kernel部分运行


    kenel文件是elf格式的,从在qemu中运行,可以知道kernel只是读取我们输入的内容,然后打印出一些信息。

    目前是两个命令:help ,kerninfo。


    学习这个真是比较麻烦!come on!


  • 相关阅读:
    c#结构体、打他table、excel、csv互转
    WPF 自定义图表(柱状图,曲线图)
    NemaStudio船舶模拟软件下载及破解
    点双连通分量
    HDU4612 Warm up
    边双连通分量
    [Jsoi2010]连通数
    Intern Day73
    Intern Day72
    Intern Day70
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3100579.html
Copyright © 2020-2023  润新知