• 《从0开始写一个微内核操作系统》0-环境准备


    环境

    Ubuntu 18.04.6 LTS

    编译工具链

    我们选择GCC的裸机版本(Arm GNU Toolchain Downloads – Arm Developer
    x86_64 Linux hosted cross toolchains --> AArch64 bare-metal target (aarch64-none-elf)

    代码构建

    编译工具:Ninja
    构建工具:GN

    Ninja构建

    安装依赖

    sudo apt install re2c
    re2c --version
    
    • 1
    • 2

    下载Ninja

    git clone https://github.com/ninja-build/ninja.git
    
    • 1

    编译安装

    ./configure.py --bootstrap
    sudo cp ninja /usr/bin
    ninja --version
    
    • 1
    • 2
    • 3

    GN构建

    安装依赖

    sudo apt-get install clang-7
    
    • 1

    修改软链接

    cd /usr/bin
    sudo ln -s clang-7 clang
    sudo ln -s clang++-7 clang++
    sudo ln -s clang-cpp-7 clang-cpp
    clang++ --version
    
    • 1
    • 2
    • 3
    • 4
    • 5

    下载GN

    git clone https://github.com/timniederhausen/gn.git
    
    • 1

    编译安装

    ./build/gen.py
    ninja -C out
    sudo cp ./out/gn /usr/bin
    gn --version
    
    • 1
    • 2
    • 3
    • 4

    仿真运行

    我们选择QEMU作为模拟器进行仿真调试

    QEMU源码安装

    # 7.0
    wget https://download.qemu.org/qemu-7.0.0.tar.xz
    
    • 1
    • 2
    sudo apt install pkg-config
    sudo apt install libglib2.0-dev
    sudo apt install libpixman-1-dev
    sudo apt install bison flex
    
    • 1
    • 2
    • 3
    • 4
    sudo ./configure --target-list=aarch64-softmmu --enable-kvm
    #sudo ./configure --target-list=arm-softmmu --enable-kvm
    
    • 1
    • 2
    sudo make -j8
    sudo make install
    
    • 1
    • 2
    qemu-system-aarch64 --version
    #qemu-system-arm --version
    
    • 1
    • 2

    QEMU board

    board:virt(‘virt’ generic virtual platform (virt) — QEMU 7.1.50 documentation
    默认virt = virt-7.0
    默认gic-version = gicv3(vir >= virt-2.7)
    可根据自己需求进行cpu/memory/device进行定制
    我们选择

    • CPU:cortex-a53
    • Memory:1G

    默认uart = pl011

    根据配置输出DTS信息

    qemu-system-aarch64 -cpu cortex-a53 -m 512 -smp 4 -M virt,gic-version=3,dumpdtb=dump.dtb
    dtc -o dump.dts -O dts -I dtb dump.dtb
    
    • 1
    • 2

    QEMU debug

    启动gdb server

    qemu-system-aarch64 -M virt -cpu cortex-a53 -m 1024 -nographic -kernel ./out/os.elf -S -s
    
    • 1

    启动gdb client

    aarch64-none-elf-gdb --tui ./out/os.elf
    target remote localhost:1234
    
    • 1
    • 2

    常用GDB操作

    break 16          <----------- 设置断点,在源程序第16行处
    break func        <----------- 设置断点,在函数func()入口处
    info break        <----------- 查看断点信息。
    r                 <----------- 运行程序,run命令简写
    n                 <----------- 单条语句执行,next命令简写
    c                 <----------- 继续运行程序,continue命令简写
    p i               <----------- 打印变量i的值,print命令简写
    bt                <----------- 查看函数堆栈
    q                 <----------- 退出gdb
    break *address    <----------- 在程序运行的内存地址处停住
    delete n          <----------- 清除n号断点
    x/<n/f/u> <addr>  <----------- 查看内存
    eg: x/100uh 0x54320:从0x54320读取内容,h双字节为一个单位,100表示3个单位,u
    ctrl+c            <----------- 暂停
    si/ni             <----------- 单步运行
    
    info registers/b  <----------- 查看当前寄存器和断点            
    display /20i $pc  <----------- 查看当前执行及后20行汇编指令
    
    layout split
    layout regs
    layout asm
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    VSCode + QEMU + GDB

    launch.json
    {
        // Use IntelliSense to learn about possible attributes.
        // Hover to view descriptions of existing attributes.
        // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
        "version": "0.2.0",
        "configurations": [
            {
                "name": "kernel qemu debug",
                "type": "cppdbg",
                "request": "launch",
                "program": "${workspaceFolder}/out/os.elf",
                "cwd": "${workspaceFolder}",
                "MIMode": "gdb",
                "miDebuggerPath":"aarch64-none-elf-gdb",
                "miDebuggerServerAddress": "localhost:1234",
                "preLaunchTask": "qemu"
            }
        ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    tasks.json
    {
        // See https://go.microsoft.com/fwlink/?LinkId=733558
        // for the documentation about the tasks.json format
        "version": "2.0.0",
        "tasks": [
            {
                "label": "qemu",
                "type": "shell",
                "command": "qemu-system-aarch64 -M virt -cpu cortex-a53 -m 1024 -nographic -kernel ${workspaceFolder}/out/os.elf -S -s",
                "presentation": {
                    "echo": true,
                    "clear": true,
                    "group": "qemu"
                },
                "isBackground": true,
                "problemMatcher": [],
                "group": {
                    "kind": "build",
                    "isDefault": true
                }
            }
        ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    点击左上角的运行(F5)即可在VSCODE中进行GDB调试
    在这里插入图片描述

  • 相关阅读:
    【C++】string类(详解),常见的函数都在这里,你都了解吗?
    文心一言 VS 讯飞星火 VS chatgpt (67)-- 算法导论6.5 6题
    由于apt-get命令不知道为什么使用不了(可能是关闭了某个访问外网的东西),所以手动在ubuntu上安装mongodb
    课堂练习11 面向对象编程
    公众号查题接口API 无限查题搜题 独立后台控制
    连续信号与系统的频域分析之傅里叶级数
    手机异步发送短信验证码解决方案-Celery+redis
    前端甘特图组件开发(一)
    21.4 Python 使用GeoIP2地图定位
    Java中的反射机制
  • 原文地址:https://blog.csdn.net/GoolyOh/article/details/127638694