zoukankan      html  css  js  c++  java
  • 操作系统GeekOS安装、编译、运行

    1.配置环境

    实验环境:Ubuntu 18.04

    需要的文件:GeekOS[http://geekos.sourceforge.net/]、nasm-2.00(低版本的,高版本的会报错)[https://www.nasm.us/pub/nasm/releasebuilds/?C=M;O=D]

    2.编译

    安装编译环境

    通过sudo apt-get install 来分别安装build-essentialbochsbochs-x

    安装低版本的gcc

    通过gcc -v可以查看当前的gcc版本。需要编译的geekos-0.3版本非常古老,直接编译会出现一堆错误,所以使用同样比较古老的gcc-4.8来进行编译。通过以下命令配置gcc

    #安装低版本的gcc
    $sudo apt-get install gcc-4.8
    #查看已安装的版本
    $ls /usr/bin/gcc* -l
    
    #分别为新旧版本设置优先级
    $ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100
    $ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100
    
    选择不同的gcc版本:
    $ sudo update-alternatives --config gcc
    

    选择gcc版本

    image-20200718165339083

    修改后的gcc版本

    image-20200718165425114

    安装nasm

    下载nasm-2.00.tar.gz压缩包并解压之后,在nasm-2.00目录中打开终端,输入以下指令安装:

    $ ./configure
    $ make
    $ sudo make install
    

    正式编译

    进入geekos-0.3.0/src/project0/build/目录,直接开始编译:

    $ make depend
    $ make
    

    但是当然不会这么顺利,除了上面提到的gcc版本问题,还有一堆可能碰到的问题,顺便附上我的解决方法。每次尝试解决问题之后,可能需要make clean之后再次重新编译。

    可能遇到的问题:

    warnings being treated as errors

    这是因为Makefile中默认的编译选项过于严格,把警告都当成错误来看待,我们可以修改一下Makefile将这个过于严格的编译选项去掉(该文件位于build目录下):
    Makefile的第149行删除-Werror

    配置Makefile

    // 修改前 149行:
    CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
    // 修改后:
    CC_GENERAL_OPTS := $(GENERAL_OPTS)
    

    或者,打开src/project0/include/geekos/segment.h,在第43行加上:8

    //修改前 48行:
    uchar_t baseHigh        PACKED ;
    // 修改后:
    uchar_t baseHigh   : 8  PACKED ;
    

    X86-64与i386输出不兼容

    # Target C compiler.  gcc 2.95.2 or later should work. 100行
    TARGET_CC := $(TARGET_CC_PREFIX)gcc -m32
    
    # Host C compiler.  This is used to compile programs to execute on
    # the host platform, not the target (x86) platform.  On x86/ELF
    # systems, such as Linux and FreeBSD, it can generally be the same
    # as the target C compiler. 106行
    HOST_CC := gcc -m32
    
    # Target linker.  GNU ld is probably to only one that will work.109行
    TARGET_LD := $(TARGET_CC_PREFIX)ld -m elf_i386
    

    bits目录下缺失文件

    这是gcc环境没有安装完善导致的,安装命令:

    $ sudo apt-get install gcc-multilib
    

    __stack_chk_fail未定义

    这是因为gcc在编译时开启了栈保护,打开Makefile,在第148行关闭栈保护:

    # Flags used for all C source files
    // 修改前:148行
    GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS)
    // 修改后:
    GENERAL_OPTS := -O -Wall -fno-stack-protector $(EXTRA_C_OPTS)
    

    最终编译成功之后,会在build目录下生成一个镜像文件fd.img和bochs模拟器的配置文件.bochsrc

    image-20200718193356994

    3.运行

    通过bochs命令运行:

    bochs第一次启动会出现>>PANIC<< .bochsrc:4: vgaromimage directive malformed.错误,打开.bochsrc

    修改

    #第4行注释
    # vgaromimage: /export/home/daveho/linux/bochs-2.0.2/share/bochs/VGABIOS-lgpl-latest
    
    #第5、6行修改
    // 修改前:
    romimage: file=/export/home/daveho/linux/bochs-2.0.2/share/bochs/BIOS-bochs-latest, address=0xf0000
    // 修改后:
    romimage: file=$BXSHARE/BIOS-bochs-latest 
    
    #第16、18、22行注释
    # floppy_command_delay: 500 
    # ips:  1000000 
    # newharddrivesupport: enabled=1
    

    如果新弹出的bochs窗口黑屏,可能是进入了调试模式,在终端中输入c回车,就可以了。

    运行结果

    image-20200718194105997

    配置完成

  • 相关阅读:
    内核驱动系列中断和定时器
    apue2 阅读笔记第四章
    apue2 阅读笔记 第五章
    apue2阅读笔记 第6.7章
    再试试windows7版得writer
    内核驱动系列内核调试方法
    apue2 阅读笔记第三章
    杂谈关于代码库
    know everything about something
    React的父子传值(父传子)
  • 原文地址:https://www.cnblogs.com/thresh/p/13365903.html
Copyright © 2011-2022 走看看