2021-06-24

Ubuntu20.04源码编译 QEMU

Ubuntu20.04源码编译 QEMU


对于嵌入式开发工程师而言 ,QEMU 是一款 很好 用的 开源 软件 ,可以 模拟调试 edk2 ( UEFI的具体实现 ),
u-boot , linuxkernel , ARM开发版 vexpress-a9 , 64位 aarch64 ARM板 Juno , 等等 。
而 Android 的 虚拟机 就是 用的 QEMU .。

开发时 系统自带的 qemu (使用 sudo apt install qemu qemu-system-arm ) 更新慢, 不能 满足 特定的需求, 不利于 开发调试,就需要 自己 编译 定制 QEMU 。 下面 我记录一下 ,遇到的 问题 和 解决 办法 。

下载源码

加速 设置

修改 文件 ~/.gitconfig 没有 就 创建 这个是 用户的 git 全局配置文件

[user]
	email = user@163.com
	name = larphy

[color]
	ui = auto

[url "https://hub.fastgit.org/"]
	insteadof = https://github.com/

[url "https://mirrors.bfsu.edu.cn/git/AOSP/"]
	insteadof = https://android.googlesource.com/

[url "https://raw.githubusercontent.com/"]
	insteadof = https://raw.sevencdn.com/

[http]
	lowSpeedLimit = 1000
	lowSpeedTime = 600
	postBuffer = 5368709120

[credential]
	helper = store

使用 命令 git config --list 查看 :

filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
user.email=user@163.com
user.name=larphy
color.ui=auto
url.https://hub.fastgit.org/.insteadof=https://github.com/
url.https://mirrors.bfsu.edu.cn/git/AOSP/.insteadof=https://android.googlesource.com/
url.https://raw.githubusercontent.com/.insteadof=https://raw.sevencdn.com/
http.lowspeedlimit=1000
http.lowspeedtime=600
http.postbuffer=5368709120
credential.helper=store

源码下载

  git  clone   https://gitlab.com/qemu-project/qemu.git  

  git   submodule   update   --init   --recursive  

子模组 'capstone'(https://gitlab.com/qemu-project/capstone.git)已对路径 'capstone' 注册
子模组 'dtc'(https://gitlab.com/qemu-project/dtc.git)已对路径 'dtc' 注册
子模组 'meson'(https://gitlab.com/qemu-project/meson.git)已对路径 'meson' 注册
子模组 'roms/QemuMacDrivers'(https://gitlab.com/qemu-project/QemuMacDrivers.git)已对路径 'roms/QemuMacDrivers' 注册
子模组 'roms/SLOF'(https://gitlab.com/qemu-project/SLOF.git)已对路径 'roms/SLOF' 注册
子模组 'roms/edk2'(https://gitlab.com/qemu-project/edk2.git)已对路径 'roms/edk2' 注册
子模组 'roms/ipxe'(https://gitlab.com/qemu-project/ipxe.git)已对路径 'roms/ipxe' 注册
子模组 'roms/openbios'(https://gitlab.com/qemu-project/openbios.git)已对路径 'roms/openbios' 注册
子模组 'roms/opensbi'(https://gitlab.com/qemu-project/opensbi.git)已对路径 'roms/opensbi' 注册
子模组 'roms/qboot'(https://gitlab.com/qemu-project/qboot.git)已对路径 'roms/qboot' 注册
子模组 'roms/qemu-palcode'(https://gitlab.com/qemu-project/qemu-palcode.git)已对路径 'roms/qemu-palcode' 注册
子模组 'roms/seabios'(https://gitlab.com/qemu-project/seabios.git/)已对路径 'roms/seabios' 注册
子模组 'roms/seabios-hppa'(https://gitlab.com/qemu-project/seabios-hppa.git)已对路径 'roms/seabios-hppa' 注册
子模组 'roms/sgabios'(https://gitlab.com/qemu-project/sgabios.git)已对路径 'roms/sgabios' 注册
子模组 'roms/skiboot'(https://gitlab.com/qemu-project/skiboot.git)已对路径 'roms/skiboot' 注册
子模组 'roms/u-boot'(https://gitlab.com/qemu-project/u-boot.git)已对路径 'roms/u-boot' 注册
子模组 'roms/u-boot-sam460ex'(https://gitlab.com/qemu-project/u-boot-sam460ex.git)已对路径 'roms/u-boot-sam460ex' 注册
子模组 'roms/vbootrom'(https://gitlab.com/qemu-project/vbootrom.git)已对路径 'roms/vbootrom' 注册
子模组 'slirp'(https://gitlab.com/qemu-project/libslirp.git)已对路径 'slirp' 注册
子模组 'tests/fp/berkeley-softfloat-3'(https://gitlab.com/qemu-project/berkeley-softfloat-3.git)已对路径 'tests/fp/berkeley-softfloat-3' 注册
子模组 'tests/fp/berkeley-testfloat-3'(https://gitlab.com/qemu-project/berkeley-testfloat-3.git)已对路径 'tests/fp/berkeley-testfloat-3' 注册
子模组 'ui/keycodemapdb'(https://gitlab.com/qemu-project/keycodemapdb.git)已对路径 'ui/keycodemapdb' 注册
正克隆到 '/home/larphy/work/qemu/capstone'...
正克隆到 '/home/larphy/work/qemu/dtc'...
正克隆到 '/home/larphy/work/qemu/meson'...
正克隆到 '/home/larphy/work/qemu/roms/QemuMacDrivers'...
正克隆到 '/home/larphy/work/qemu/roms/SLOF'...
正克隆到 '/home/larphy/work/qemu/roms/edk2'...
正克隆到 '/home/larphy/work/qemu/roms/ipxe'...
正克隆到 '/home/larphy/work/qemu/roms/openbios'...
正克隆到 '/home/larphy/work/qemu/roms/opensbi'...
正克隆到 '/home/larphy/work/qemu/roms/qboot'...
正克隆到 '/home/larphy/work/qemu/roms/qemu-palcode'...
正克隆到 '/home/larphy/work/qemu/roms/seabios'...
正克隆到 '/home/larphy/work/qemu/roms/seabios-hppa'...
正克隆到 '/home/larphy/work/qemu/roms/sgabios'...
正克隆到 '/home/larphy/work/qemu/roms/skiboot'...
正克隆到 '/home/larphy/work/qemu/roms/u-boot'...
正克隆到 '/home/larphy/work/qemu/roms/u-boot-sam460ex'...
正克隆到 '/home/larphy/work/qemu/roms/vbootrom'...
正克隆到 '/home/larphy/work/qemu/slirp'...
正克隆到 '/home/larphy/work/qemu/tests/fp/berkeley-softfloat-3'...
正克隆到 '/home/larphy/work/qemu/tests/fp/berkeley-testfloat-3'...
正克隆到 '/home/larphy/work/qemu/ui/keycodemapdb'...
子模组路径 'capstone':检出 'f8b1b833015a4ae47110ed068e0deb7106ced66d'
子模组路径 'dtc':检出 '85e5d839847af54efab170f2b1331b2a6421e647'
子模组路径 'meson':检出 '776acd2a805c9b42b4f0375150977df42130317f'
子模组路径 'roms/QemuMacDrivers':检出 '90c488d5f4a407342247b9ea869df1c2d9c8e266'
子模组路径 'roms/SLOF':检出 '33a7322de13e9dca4b38851a345a58d37e7a441d'
子模组路径 'roms/edk2':检出 '06dc822d045c2bb42e497487935485302486e151'
子模组 'SoftFloat'(https://github.com/ucb-bar/berkeley-softfloat-3.git)已对路径 'roms/edk2/ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3' 注册
子模组 'BaseTools/Source/C/BrotliCompress/brotli'(https://github.com/google/brotli)已对路径 'roms/edk2/BaseTools/Source/C/BrotliCompress/brotli' 注册
子模组 'CryptoPkg/Library/OpensslLib/openssl'(https://github.com/openssl/openssl)已对路径 'roms/edk2/CryptoPkg/Library/OpensslLib/openssl' 注册
子模组 'MdeModulePkg/Library/BrotliCustomDecompressLib/brotli'(https://github.com/google/brotli)已对路径 'roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli' 注册
子模组 'MdeModulePkg/Universal/RegularExpressionDxe/oniguruma'(https://github.com/kkos/oniguruma)已对路径 'roms/edk2/MdeModulePkg/Universal/RegularExpressionDxe/oniguruma' 注册
子模组 'UnitTestFrameworkPkg/Library/CmockaLib/cmocka'(https://git.cryptomilk.org/projects/cmocka.git)已对路径 'roms/edk2/UnitTestFrameworkPkg/Library/CmockaLib/cmocka' 注册
正克隆到 '/home/larphy/work/qemu/roms/edk2/ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3'...
正克隆到 '/home/larphy/work/qemu/roms/edk2/BaseTools/Source/C/BrotliCompress/brotli'...
正克隆到 '/home/larphy/work/qemu/roms/edk2/CryptoPkg/Library/OpensslLib/openssl'...
正克隆到 '/home/larphy/work/qemu/roms/edk2/MdeModulePkg/Library/BrotliCustomDecompressLib/brotli'...
正克隆到 '/home/larphy/work/qemu/roms/edk2/MdeModulePkg/Universal/RegularExpressionDxe/oniguruma'...
正克隆到 '/home/larphy/work/qemu/roms/edk2/UnitTestFrameworkPkg/Library/CmockaLib/cmocka'...
子模组路径 'roms/edk2/ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3':检出 'b64af41c3276f97f0e181920400ee056b9c88037'
子模组路径 'roms/edk2/BaseTools/Source/C/BrotliCompress/brotli':检出 '666c3280cc11dc433c303d79a83d4ffbdd12cc8d'
子模组 'research/esaxx'(https://github.com/hillbig/esaxx)已对路径 'roms/edk2/BaseTools/Source/C/BrotliCompress/brotli/research/esaxx' 注册
子模组 'research/libdivsufsort'(https://github.com/y-256/libdivsufsort.git)已对路径 'roms/edk2/BaseTools/Source/C/BrotliCompress/brotli/research/libdivsufsort' 注册
正克隆到 '/home/larphy/work/qemu/roms/edk2/BaseTools/Source/C/BrotliCompress/brotli/research/esaxx'...
正克隆到 '/home/larphy/work/qemu/roms/edk2/BaseTools/Source/C/BrotliCompress/brotli/research/libdivsufsort'...
子模组路径 'roms/edk2/BaseTools/Source/C/BrotliCompress/brotli/research/esaxx':检出 'ca7cb332011ec37a8436487f210f396b84bd8273'
子模组路径 'roms/edk2/BaseTools/Source/C/BrotliCompress/brotli/research/libdivsufsort':检出 '5f60d6f026c30fb4ac296f696b3c8b0eb71bd428'
子模组路径 'roms/edk2/CryptoPkg/Library/OpensslLib/openssl':检出 'e2e09d9fba1187f8d6aafaa34d4172f56f1ffb72'
子模组 'boringssl'(https://boringssl.googlesource.com/boringssl)已对路径 'roms/edk2/CryptoPkg/Library/OpensslLib/openssl/boringssl' 注册
子模组 'krb5'(https://github.com/krb5/krb5)已对路径 'roms/edk2/CryptoPkg/Library/OpensslLib/openssl/krb5' 注册
子模组 'pyca.cryptography'(https://github.com/pyca/cryptography.git)已对路径 'roms/edk2/CryptoPkg/Library/OpensslLib/openssl/pyca-cryptography' 注册
正克隆到 '/home/larphy/work/qemu/roms/edk2/CryptoPkg/Library/OpensslLib/openssl/boringssl'...

boringssl 问题

同步 roms/edk2/CryptoPkg/Library/OpensslLib/openssl 目录下面 的 boringssl 出错

因为 找不到 URL https://boringssl.googlesource.com/boringssl 国内 屏蔽了 google 的下载 。

解决问题 :

打开 快速 github 网页 https://hub.fastgit.org/

搜索 关键字 boringssl

可以搜到 https://hub.fastgit.org/google/boringssl.git 这个 就是 github 的 仓

转到 目录 roms/edk2/CryptoPkg/Library/OpensslLib/openssl 下, 执行

cd   roms/edk2/CryptoPkg/Library/OpensslLib/openssl  

git  clone   https://hub.fastgit.org/google/boringssl.git

gedit  .gitmodules  &

cd -

并且 修改 隐藏文件 .gitmodules 文件 将 boringssl 的 URL 改为 https://hub.fastgit.org/google/boringssl.git

可以保证 下次升级 也不会 报错 了。

返回 qemu 源码 目录下 ,再次 执行 git submodule update --init --recursive 就可以 pass .

至此, 下载到 完整的 QEMU 源码 。

我的 配置 结果 如下 :

# 为了 保持 源码的 整洁 ,建议  返回 源码 上级 目录   创建 build  文件夹 。 
#  执行  
../qemu/configure    --prefix=/usr/local/qemu  \
  --target-list=arm-softmmu,aarch64-softmmu,x86_64-softmmu,riscv32-softmmu,riscv64-softmmu   \
  --audio-drv-list=alsa,pa     --enable-bpf   \
  --enable-vhost-vsock   --enable-vhost-net    --enable-profiler  \
  --enable-plugins    --gdb=/usr/local/bin/gdb   --enable-gprof  \
  --enable-gcov    --enable-modules  --enable-libudev   --enable-kvm  \
  --enable-vvfat  --enable-opengl      --enable-debug    --enable-fuse   \
  --enable-fuse-lseek    --enable-multiprocess       --enable-avx512f   \
  --enable-lto       --enable-linux-aio    --enable-libnfs     --enable-vhost-crypto  \
  --enable-vhost-kernel     --enable-gtk

通过 命令

../qemu/configure     --help 

查看 相关的 配置 说明 。

libbpf 问题

配置 选项 –enable-bpf 需要 库 libbpf 支持 。

而 Ubuntu 20.04 没有 该库包 而是 提供了 libbcc .

解决问题

  • 求助 万能的 github

到 网站 https://hub.fastgit.org/ 而不是 https://github.com/ (太慢,有时还打不开)

搜索 关键字 libbpf

https://hub.fastgit.org/libbpf/libbpf

git clone https://hub.fastgit.org/libbpf/libbpf

,按照 README.md 文件 的 提示 --> 编译 并安装 , 注意 libbpf.pc 文件 复制到 PKG_CONFIG_PATH 可以找到 的 路径

如 我的

/usr/lib/pkgconfig:/usr/share/pkgconfig:/usr/lib/x86_64-linux-gnu/pkgconfig

sudo   cp    libbpf.pc    /usr/lib/x86_64-linux-gnu/pkgconfig

这样 配置 和编译 选项 –enable-bpf 都可以 PASS 。

还有 其他的 配置 需要的 库 或者 其他 的可行文件 。 类似 方法 解决 问题 。

解决思路

  • 通过 sudo apt search libxxx 或者 sudo apt search XXXX , 找到相关的 库, 并安装 , 再 配置
  • 求助 于 github . 如上所述 。
  • ​ 查看 官网的 相关 解决办法 。

不能解决的问题

硬件不支持

如 有的 老机器 不支持 浮点运算, 不支持 openGL ,不支持 KVM 等等 。。。

相关的 使能 选项 没有 意义。 正所谓 “巧妇难为无米之炊

需要 链接符号 或者 debug信息的 release 库

比如 选项 –enable-tsan –enable-sanitizers

都会 报出 链接 错误 。。。 。。。

配置结果

Build targets in project: 568

qemu 6.0.50

  Directories
                   Install prefix: /usr/local/qemu
                   BIOS directory: share/qemu
                    firmware path: /usr/local/qemu/share/qemu-firmware
                 binary directory: bin
                library directory: lib
                 module directory: lib/qemu
                libexec directory: libexec
                include directory: include
                 config directory: /usr/local/qemu/etc
            local state directory: /usr/local/qemu/var
                 Manual directory: share/man
                    Doc directory: /usr/local/qemu/share/doc
                  Build directory: /home/larphy/embed/qemu/build
                      Source path: /home/larphy/embed/qemu/source/qemu
                   GIT submodules: ui/keycodemapdb meson tests/fp/berkeley-testfloat-3 tests/fp/berkeley-softfloat-3 dtc capstone slirp

  Host binaries
                              git: git
                             make: make
                           python: /usr/bin/python3 (version: 3.8)
                     sphinx-build: YES
                              gdb: /usr/local/bin/gdb
                      genisoimage: /usr/bin/genisoimage
                             smbd: "/usr/sbin/smbd"

  Configurable features
                    Documentation: YES
            system-mode emulation: YES
              user-mode emulation: NO
                      block layer: YES
                    Install blobs: YES
                   module support: YES
          alternative module path: NO
                   plugin support: YES
                  fuzzing support: NO
                    Audio drivers: alsa pa
                   Trace backends: log
                    QOM debugging: YES
             vhost-kernel support: YES
                vhost-net support: YES
             vhost-crypto support: YES
               vhost-scsi support: YES
              vhost-vsock support: YES
               vhost-user support: YES
    vhost-user-blk server support: YES
            vhost-user-fs support: YES
               vhost-vdpa support: YES
                build guest agent: YES

  Compilation
                         host CPU: x86_64
                  host endianness: little
                       C compiler: cc
                  Host C compiler: cc
                     C++ compiler: c++
                          ARFLAGS: rv
                           CFLAGS: -O0 -g
                         CXXFLAGS: -O0 -g
                      QEMU_CFLAGS: -p -m64 -mcx16 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv  -Wold-style-declaration -Wold-style-definition -Wtype-limits -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wempty-body -Wnested-externs -Wendif-labels -Wexpansion-to-defined -Wimplicit-fallthrough=2 -Wno-missing-include-dirs -Wno-shift-negative-value -Wno-psabi -fstack-protector-strong
                     QEMU_LDFLAGS: -Wl,--warn-common -p -Wl,-z,relro -Wl,-z,now -m64  -fstack-protector-strong
                         profiler: YES
     link-time optimization (LTO): YES
                              PIE: YES
                     static build: NO
              malloc trim support: YES
                       membarrier: NO
                   preadv support: YES
                        fdatasync: YES
                          madvise: YES
                    posix_madvise: YES
                   posix_memalign: YES
                debug stack usage: NO
                  mutex debugging: YES
                 memory allocator: system
                avx2 optimization: YES
             avx512f optimization: YES
                    gprof enabled: YES
                             gcov: YES
                 thread sanitizer: NO
                      CFI support: NO
                   strip binaries: NO
                           sparse: NO
                  mingw32 support: NO
                        arm tests: arm-linux-gnueabihf-gcc
                    aarch64 tests: aarch64-linux-gnu-gcc
                     x86_64 tests: cc
                    riscv64 tests: riscv64-linux-gnu-gcc via debian-riscv64-cross

  Targets and accelerators
                      KVM support: YES
                      HAX support: NO
                      HVF support: NO
                     WHPX support: NO
                     NVMM support: NO
                      Xen support: YES
                 xen ctrl version: 41100
                      TCG support: YES
                      TCG backend: native (x86_64)
                TCG debug enabled: YES
                      target list: arm-softmmu aarch64-softmmu x86_64-softmmu riscv32-softmmu riscv64-softmmu
                  default devices: YES
         out of process emulation: YES

  Block layer support
                coroutine backend: ucontext
                   coroutine pool: YES
             Block whitelist (rw): 
             Block whitelist (ro): 
                   VirtFS support: YES
            build virtiofs daemon: YES
             Live block migration: YES
              replication support: YES
                    bochs support: YES
                    cloop support: YES
                      dmg support: YES
                  qcow v1 support: YES
                      vdi support: YES
                    vvfat support: YES
                      qed support: YES
                parallels support: YES
                     FUSE exports: YES

  Crypto
                     TLS priority: "NORMAL"
                   GNUTLS support: YES
                        libgcrypt: NO
                           nettle: YES
                              XTS: YES
                     crypto afalg: NO
                         rng-none: NO
                    Linux keyring: YES

  Dependencies
                      SDL support: NO
                SDL image support: NO
                      GTK support: YES
                           pixman: YES
                      VTE support: YES
                    slirp support: system
                         libtasn1: YES
                              PAM: NO
                    iconv support: YES
                   curses support: YES
                    virgl support: YES
                     curl support: YES
                Multipath support: NO
                      VNC support: YES
                 VNC SASL support: YES
                 VNC JPEG support: YES
                  VNC PNG support: YES
                   brlapi support: YES
                      vde support: NO
                   netmap support: NO
                Linux AIO support: YES
           Linux io_uring support: NO
               ATTR/XATTR support: YES
                     RDMA support: YES
                   PVRDMA support: YES
                      fdt support: system
                libcap-ng support: YES
                      bpf support: YES
                    spice support: YES
                      rbd support: YES
                   xfsctl support: YES
                smartcard support: YES
                      U2F support: NO
                           libusb: YES
                    usb net redir: YES
                   OpenGL support: YES
                              GBM: YES
                 libiscsi support: YES
                   libnfs support: YES
                  seccomp support: YES
                GlusterFS support: NO
                      TPM support: YES
                   libssh support: YES
                      lzo support: NO
                   snappy support: NO
                    bzip2 support: YES
                    lzfse support: NO
                     zstd support: NO
                NUMA host support: YES
                          libxml2: YES
                         capstone: internal
                  libpmem support: YES
                libdaxctl support: NO
                          libudev: YES
                       FUSE lseek: YES

  Subprojects
                    libvhost-user: YES

Found ninja-1.10.0 at /usr/bin/ninja


编译 和 安装

make   -j8

sudo  make  install

验证结果

/usr/local/qemu/bin$ ./qemu-system-arm   -M  help./qemu-system-arm: error while loading shared libraries: libbpf.so.0: cannot open shared object file: No such file or directory

查看 上面提到 的 libbpf.pc 文件


libbpf/src$ cat   libbpf.pc
# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)

prefix=/usr
libdir=${prefix}/lib64
includedir=${prefix}/include

Name: libbpf
Description: BPF library
Version: 0.5.0
Libs: -L${libdir} -lbpf
Requires.private: libelf zlib
Cflags: -I${includedir}

发现 库文件的 路径 再 /usr/lib64 目录下面 默认 找不到 。

执行 命令 :

libbpf/src$   sudo  cp  -fp  libbpf.so*    /usr/lib

libbpf/src$   sudo  cp  -fp  libbpf.so*    /usr/lib/x86_64-linux-gnu/

就可以 解决 问题 了 。

/usr/local/qemu/bin$ ./qemu-system-arm    --version
QEMU emulator version 6.0.50 (v6.0.0-1902-gb22726abdf-dirty)
Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers
_mcleanup: gmon.out: Permission denied

还有 其他的

/usr/local/qemu/bin$ ls
elf2dmp    qemu-ga   qemu-io      qemu-nbd        qemu-storage-daemon  qemu-system-arm      qemu-system-riscv64
qemu-edid  qemu-img  qemu-keymap  qemu-pr-helper  qemu-system-aarch64  qemu-system-riscv32  qemu-system-x86_64

添加环境变量使用新编译版本

在 ubuntu 种 存在 三种 生效 环境变量的 文件 。 分别是 :

  • $HOME/.bashrc 每次 重启 终端 都会生效 。
  • $HOME/.profile 用户 注销后再次登录 就会 生效 。
  • /etc/profile 重启,开机登录 后, 生效 。

针对不同 用户 ,不同 场景 用法 不同 。

终极 即时 生效 命令 source (上面 三个文件 之一)

如 :

source ~/.bashrc

添加原则: 尽量不影响 原来的 环境 。

我是 修改 $HOME/.profile 实现的 。如下 所示 。

#  add compiled qemu envs for developer
if [ -d "/usr/local/qemu/bin" ] ; then
	export QEMU_HOME=/usr/local/qemu
	export PATH=$QEMU_HOME/bin:$QEMU_HOME/libexec:$PATH
	export LD_LIBRARY_PATH=$QEMU_HOME/lib/qemu:$LD_LIBRARY_PATH
	export MANPATH=$QEMU_HOME/share/man:$MANPATH
fi

使用 source ~/.profile 即时 生效 。

至此 可以 完全 使用 自己编译的 qemu .

根据 实际需求 调试 安装 不同的 开发 版本 。

哈哈 !!

热门文章

暂无图片
编程学习 ·

C语言二分查找详解

二分查找是一种知名度很高的查找算法,在对有序数列进行查找时效率远高于传统的顺序查找。 下面这张动图对比了二者的效率差距。 二分查找的基本思想就是通过把目标数和当前数列的中间数进行比较,从而确定目标数是在中间数的左边还是右边,将查…
暂无图片
编程学习 ·

GMX 命令分类列表

建模和计算操作命令: 1.1 . 创建拓扑与坐标文件 gmx editconf - 编辑模拟盒子以及写入子组(subgroups) gmx protonate - 结构质子化 gmx x2top - 根据坐标生成原始拓扑文件 gmx solvate - 体系溶剂化 gmx insert-molecules - 将分子插入已有空位 gmx genconf - 增加…
暂无图片
编程学习 ·

一文高效回顾研究生课程《数值分析》重点

数值分析这门课的本质就是用离散的已知点去估计整体,就是由黑盒子产生的结果去估计这个黑盒子。在数学里这个黑盒子就是一个函数嘛,这门课会介绍许多方法去利用离散点最大化地逼近这个函数,甚至它的导数、积分,甚至微分方程的解。…
暂无图片
编程学习 ·

在职阿里5年,一个28岁女软测工程师的心声

简单的先说一下,坐标杭州,14届本科毕业,算上年前在阿里巴巴的面试,一共有面试了有6家公司(因为不想请假,因此只是每个晚上去其他公司面试,所以面试的公司比较少) ​ 编辑切换为居中…
暂无图片
编程学习 ·

字符串左旋c语言

目录 题目: 解题思路: 第一步: 第二步: 第三步: 总代码: 题目: 实现一个函数,可以左旋字符串中的k个字符。 例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符…
暂无图片
编程学习 ·

设计模式--观察者模式笔记

模式的定义与特点 观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式&#xf…
暂无图片
编程学习 ·

睡觉突然身体动不了,什么是睡眠痽痪症

很多朋友可能有这样的体验,睡觉过程中突然意识清醒,身体却动弹不了。这时候感觉非常恐怖,希望旁边有一个人推自己一下。阳光以前也经常会碰到这样的情况,一年有一百多次,那时候很害怕晚上到来,睡觉了就会出…
暂无图片
编程学习 ·

深入理解C++智能指针——浅析MSVC源码

文章目录unique_ptrshared_ptr 与 weak_ptrstd::bad_weak_ptr 异常std::enable_shared_from_thisunique_ptr unique_ptr 是一个只移型别(move-only type,只移型别还有std::mutex等)。 结合一下工厂模式,看看其基本用法&#xff…
暂无图片
编程学习 ·

@TableField(exist = false)

TableField(exist false) //申明此字段不在数据库存在,但代码中需要用到它,通知Mybatis-plus在做写库操作是忽略它。,.
暂无图片
编程学习 ·

Java Web day15

第十二章文件上传和下载 一、如何实现文件上传 要实现Web开发中的文件上传功能,通常需要完成两步操作:一.是在Web页面中添加上传输入项;二是在Servlet中读取上传文件的数据,并保存到本地硬盘中。 需要使用一个Apache组织提供一个…
暂无图片
编程学习 ·

【51nod 2478】【单调栈】【前缀和】小b接水

小b接水题目解题思路Code51nod 2478 小b接水 题目 输入样例 12 0 1 0 2 1 0 1 3 2 1 2 1输出样例 6解题思路 可以发现最后能拦住水的都是向两边递减高度(?) 不管两个高积木之间的的积木是怎样乱七八糟的高度,最后能用来装水的…
暂无图片
编程学习 ·

花了大半天写了一个UVC扩展单元调试工具

基于DIRECTSHOW 实现的,用的是MFC VS2019. 详见:http://www.usbzh.com/article/detail-761.html 获取方法 加QQ群:952873936,然后在群文件\USB调试工具&测试软件\UVCXU-V1.0(UVC扩展单元调试工具-USB中文网官方版).exe USB中文网 USB中文…
暂无图片
编程学习 ·

贪心(一):区间问题、Huffman树

区间问题 例题一:区间选点 给定 N 个闭区间 [ai,bi]请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式 第一行包含整数 N,表示区间数。 接下来 …
暂无图片
编程学习 ·

C语言练习实例——费氏数列

目录 题目 解法 输出结果 题目 Fibonacci为1200年代的欧洲数学家,在他的着作中曾经提到:「若有一只免子每个月生一只小免子,一个月后小免子也开始生产。起初只有一只免子,一个月后就有两只免子,二个月后有三只免子…
暂无图片
编程学习 ·

Android开发(2): Android 资源

个人笔记整理 Android 资源 Android中的资源,一般分为两类: 系统内置资源:Android SDK中所提供的已经定义好的资源,用户可以直接拿来使用。 用户自定义资源:用户自己定义或引入的,只适用于当前应用的资源…
暂无图片
编程学习 ·

零基础如何在短时间内拿到算法offer

​算法工程师是利用算法处理事物的职业 算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。 如果一个算法有缺陷,或不适合于某个问题,执…
暂无图片
编程学习 ·

人工智能:知识图谱实战总结

人工智能python,NLP,知识图谱,机器学习,深度学习人工智能:知识图谱实战前言一、实体建模工具Protegepython,NLP,知识图谱,机器学习,深度学习 人工智能:知识图…
暂无图片
编程学习 ·

【无标题】

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…