{"id":154,"date":"2026-09-11T04:05:45","date_gmt":"2026-09-10T20:05:45","guid":{"rendered":"https:\/\/blog.rtfsc8.top\/?p=154"},"modified":"2026-09-11T04:09:59","modified_gmt":"2026-09-10T20:09:59","slug":"%e5%9f%ba%e4%ba%8eubuntu22-04-5lts%e6%90%ad%e5%bb%baqemu%e5%92%8clinux%e5%86%85%e6%a0%b8%e4%bb%a3%e7%a0%81%e8%b0%83%e8%af%95%e7%8e%af%e5%a2%83","status":"publish","type":"post","link":"https:\/\/blog.rtfsc8.top\/index.php\/2026\/09\/11\/%e5%9f%ba%e4%ba%8eubuntu22-04-5lts%e6%90%ad%e5%bb%baqemu%e5%92%8clinux%e5%86%85%e6%a0%b8%e4%bb%a3%e7%a0%81%e8%b0%83%e8%af%95%e7%8e%af%e5%a2%83\/","title":{"rendered":"\u57fa\u4e8eUbuntu22.04.5LTS\u642d\u5efaQEMU\u548cLinux\u5185\u6838\u4ee3\u7801\u8c03\u8bd5\u73af\u5883"},"content":{"rendered":"<h1>\u57fa\u7840\u73af\u5883<\/h1>\n<p>\u64cd\u4f5c\u7cfb\u7edf\uff1a Ubuntu 22.04.5 LTS<br \/>\n\u5b9e\u9a8c\u6839\u76ee\u5f55\uff1a \/data\/linux-kernel-lab<br \/>\n\u4f7f\u7528\u5de5\u5177\uff1a VS code\u3001gcc\u3001wget\u3001git<br \/>\n\u4f7f\u7528\u6e90\u7801\uff1a<\/p>\n<ol>\n<li><a href=\"https:\/\/busybox.net\/downloads\/busybox-1.38.0.tar.bz2\" title=\"busybox-1.38.0.tar.bz2\">busybox-1.38.0.tar.bz2<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/torvalds\/linux\/\" title=\"linux v6.18-rc7\">linux v6.18-rc7<\/a><\/li>\n<li><a href=\"https:\/\/visualstudio.microsoft.com\/zh-hans\/downloads\/\" title=\"VS code\u591a\u5e73\u53f0\u5b89\u88c5\u5305\u4e0b\u8f7d\">VS code\u591a\u5e73\u53f0\u5b89\u88c5\u5305\u4e0b\u8f7d<\/a><\/li>\n<li><a href=\"https:\/\/code.visualstudio.com\/download\" title=\"VS code\u591a\u5e73\u53f0\u5b89\u88c5\u5305\u4e0b\u8f7d2\">VS code\u591a\u5e73\u53f0\u5b89\u88c5\u5305\u4e0b\u8f7d2<\/a><\/li>\n<\/ol>\n<h1>\u642d\u5efa\u9605\u8bfb\u73af\u5883<\/h1>\n<h2>\u672c\u5730\u9605\u8bfb\u6e90\u7801<\/h2>\n<p><em>VS code<\/em> + <em>clangd<\/em>\u63d2\u4ef6<\/p>\n<h3>\u751f\u6210<em>compile_commands.json<\/em><\/h3>\n<pre><code class=\"language-bash\">#== \n#-- \u8fdb\u5165\u5185\u6838\u6e90\u7801\u6839\u76ee\u5f55\ncd linux-kernel\n\n#-- \u6267\u884c\u547d\u4ee4\u751f\u6210 compile_commands.json\npython3 scripts\/clang-tools\/gen_compile_commands.py\n\n#-- \u786e\u8ba4\u6587\u4ef6\u5728\u6e90\u7801\u6839\u76ee\u5f55\u751f\u6210\nls -alh compile_commands.json\n\n#== End<\/code><\/pre>\n<p><em>clangd<\/em>\u63d2\u4ef6\u901a\u8fc7<em>compile_commands.json<\/em>\u6765\u7406\u89e3\u5185\u6838\u7684\u590d\u6742\u7684\u5b8f\u5b9a\u4e49\u3001\u6761\u4ef6\u7f16\u8bd1\u548c\u5305\u542b\u8def\u5f84\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.rtfsc8.top\/wp-content\/uploads\/2026\/09\/image-1789070635362.png\" alt=\"file\" \/><\/p>\n<h2>\u5728\u7ebf\u9605\u8bfb\u6e90\u7801<\/h2>\n<p>\u5728\u7ebf\u9605\u8bfb<em>Linux Kernel<\/em>\u6e90\u7801\u53ef\u4ee5\u4f7f\u7528<a href=\"https:\/\/elixir.bootlin.com\/linux\/v6.18-rc7\/source\" title=\"linux v6.18-rc7\u5728\u7ebf\u9605\u8bfb\u6e90\u7801\">linux v6.18-rc7\u5728\u7ebf\u9605\u8bfb\u6e90\u7801<\/a>\uff0c\u652f\u6301\u6240\u6709\u5185\u6838\u7248\u672c\u7684\u5b8c\u7f8e\u8df3\u8f6c\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.rtfsc8.top\/wp-content\/uploads\/2026\/09\/image-1789070574893.png\" alt=\"file\" \/><\/p>\n<h1>\u642d\u5efa\u8c03\u8bd5\u73af\u5883<\/h1>\n<p>\u4ee3\u7801\u4e0d\u80fd\u5149\u201c\u770b\u201d\uff0c\u8fd8\u8981\u201c\u8dd1\u201d\u8d77\u6765\u770b\uff01\u6240\u4ee5\uff0c\u6211\u4eec\u9700\u8981\u642d\u5efa\u4e00\u5957\u8c03\u8bd5\u73af\u5883\u3002<\/p>\n<p>\u9996\u5148\uff0c\u6211\u4eec\u9700\u8981\u4e00\u4e2a\u6781\u7b80\u7684\u6839\u6587\u4ef6\u7cfb\u7edf\uff0c\u6211\u4eec\u8fd9\u91cc\u91c7\u7528<em>BusyBox<\/em>\u6784\u5efa\u6839\u6587\u4ef6\u7cfb\u7edf\u3002\u5176\u6b21\uff0c\u6211\u4eec\u9700\u8981\u4e0b\u8f7d<em>Linux Kernel<\/em>\u4ee3\u7801\u5728\u672c\u5730\u7f16\u8bd1\uff0c\u7f16\u8bd1\u91c7\u7528<em>gcc<\/em>\u7f16\u8bd1\u5668\uff0c\u8fd9\u4e2a\u5728<em>Linux<\/em>\u4e0a\u81ea\u5e26\u3002\u6700\u540e\uff0c\u6211\u4eec\u8fd8\u9700\u8981\u4e00\u4e2a\u865a\u62df\u673a\u73af\u5883\u6765\u8fd0\u884c\u5185\u6838\uff0c\u8fd9\u91cc\u91c7\u7528<em>QEMU<\/em>\u505a\u4e3a\u8fd0\u884c\u73af\u5883\uff0c\u8fc7\u7a0b\u4e2d\u91c7\u7528<em>gcc<\/em>\u81ea\u5e26\u7684<em>gdb<\/em>\u8fdb\u884c\u65ad\u70b9\u8c03\u8bd5\u4ee3\u7801\u3002<\/p>\n<p>\u6574\u4f53\u64cd\u4f5c\u4e0b\u6765\u6bd4\u8f83\u7e41\u7410\uff0c\u8fd9\u91cc\u63d0\u70bc\u6210\u4e86\u51e0\u4e2a<em>shell<\/em>\u811a\u672c\u6587\u4ef6\uff0c\u8fb9\u7528\u8fb9\u8c03\u6574\u3002\u5b9e\u9a8c\u4e2d\u6d89\u53ca\u5230\u7684\u811a\u672c\u6587\u4ef6\u5982\u65e0\u7279\u522b\u58f0\u660e\uff0c\u5219\u5747\u4fdd\u5b58\u5728<strong>\u5b9e\u9a8c\u6839\u76ee\u5f55<\/strong>\u4e0b\u3002<\/p>\n<h2>BusyBox \u6e90\u7801\u5305\u4e0b\u8f7d<\/h2>\n<p>\u535a\u4e3b\u8fd9\u8fb9\u901a\u8fc7\u811a\u672c\u81ea\u52a8\u4e0b\u8f7d\u7ecf\u5e38\u51fa\u9519\uff0c\u6240\u4ee5\u53ea\u80fd\u63d0\u524d\u624b\u52a8\u4e0b\u8f7d\u597d\u3002\u5982\u679c\u6309\u7167\u4e0b\u9762\u6d41\u7a0b\u4f7f\u7528\u811a\u672c\u81ea\u52a8\u4e0b\u8f7d\u51fa\u9519\uff0c\u5efa\u8bae\u624b\u52a8\u4e0b\u8f7d\u597d\u518d\u6267\u884c\u811a\u672c\u3002<\/p>\n<h2>\u516c\u5171\u73af\u5883\u53d8\u91cf<\/h2>\n<blockquote>\n<p>\u516c\u5171\u73af\u5883\u53d8\u91cf\u914d\u7f6e\u6587\u4ef6<br \/>\nfilename: env.src<\/p>\n<\/blockquote>\n<pre><code class=\"language-bash\"># \u8f6f\u4ef6\u4f9d\u8d56\u6e05\u5355\uff0c\u7f16\u8bd1\u8fc7\u7a0b\u4e2d\u9047\u5230\u7f3a\u5c11\u7684\u968f\u65f6\u8865\u5145\u66f4\u65b0\nPACKAGES_LIST=(bc bison build-essential cpio flex gzip libncurses-dev wget)\n# \u8bbe\u7f6e\u57fa\u76ee\u5f55\nBASE_DIR=$(dirname $(readlink -f $0))\n# \u8bbe\u7f6e Linux Kernel \u6e90\u7801\u76ee\u5f55\nKERNEL_SRC_DIR=$BASE_DIR\/linux-kernel\n# \u8bbe\u7f6e rootfs \u6784\u5efa\u6839\u76ee\u5f55\nBASE_ROOTFS_DIR=$BASE_DIR\/rootfs_build\n# \u6839\u76ee\u5f55\nROOTFS_DIR=$BASE_ROOTFS_DIR\/rootfs\n# BusyBox \u6e90\u7801\u5305 URL\nSRC_URL=https:\/\/busybox.net\/downloads\/busybox-1.38.0.tar.bz2\n# BusyBox \u6e90\u7801\u5305\u6587\u4ef6\u540d\nSRC_FILE=$(basename $SRC_URL)\n# BusyBox \u76ee\u5f55\u540d\nSRC_NAME=${SRC_FILE%%\\.tar*}\n# BusyBox \u6e90\u7801\u76ee\u5f55\nBASE_ROOTFS_SRC=$BASE_ROOTFS_DIR\/$SRC_NAME\n# BusyBox \u5b89\u88c5\u76ee\u5f55\nBUSYBOX=$BASE_ROOTFS_SRC\/_install\n# initramfs \u955c\u50cf\nINITRAMFS=$KERNEL_SRC_DIR\/rootfs.cpio.gz\n# qemu command\nCOMMAND_QEMU=qemu-system-x86_64\n\n#== End<\/code><\/pre>\n<h2>\u524d\u7f6e\u4f9d\u8d56\u5305\u68c0\u67e5<\/h2>\n<p>\u8fd9\u91cc\u5199\u4e86\u4e00\u4e2a\u811a\u672c\u6765\u5e2e\u52a9\u68c0\u67e5\u4f9d\u8d56\u5305\u5b89\u88c5\u60c5\u51b5\uff0c<\/p>\n<blockquote>\n<p>filename: 01-check-packages.sh<\/p>\n<\/blockquote>\n<pre><code class=\"language-bash\">#!\/bin\/bash\n# \u52a0\u8f7d\u516c\u5171\u914d\u7f6e\nsource env.src\n\nfunction check_package() {\n  dpkg --status $1 2&gt;1 &gt;\/dev\/null\n  if [ $? == 0 ]; then\n    echo -e \"\\033[032m==INFO=&gt; $1 installed.\\033[0m\"\n  else\n    echo -e \"\\033[031m==ERROR=&gt; $1 uninstall.\\033[0m\"\n    sudo apt -y install $1\n  fi\n}\n\nfor package_name in ${PACKAGES_LIST[@]}; do\n  check_package $package_name\ndone\n<\/code><\/pre>\n<p>\u6267\u884c\u6548\u679c\u5982\u56fe\u6240\u793a\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.rtfsc8.top\/wp-content\/uploads\/2026\/09\/image-1789065930441.png\" alt=\"file\" \/><\/p>\n<h2>\u7f16\u8bd1 BuxyBox<\/h2>\n<blockquote>\n<p>filename: 02-build-busybox.sh<\/p>\n<\/blockquote>\n<pre><code class=\"language-bash\">#!\/bin\/bash\n# \u52a0\u8f7d\u516c\u5171\u914d\u7f6e\nsource env.src\n\n# \u521b\u5efa\u76ee\u5f55\n[[ ! -e ${BASE_ROOTFS_DIR} ]] &amp;&amp; mkdir -p ${BASE_ROOTFS_DIR}\n[[ -e $BASE_ROOTFS_SRC ]] &amp;&amp; \\rm -rf $BASE_ROOTFS_SRC\n[[ -e $ROOTFS_DIR ]] &amp;&amp; \\rm -rf $ROOTFS_DIR\nmkdir $ROOTFS_DIR\n\n# \u4e0b\u8f7d\u6e90\u7801\u6587\u4ef6\uff0c\u7f51\u901f\u6162\u7684\u53ef\u4ee5\u63d0\u524d\u4e0b\u8f7d\u597d\uff0c\u4e0b\u8f7d\u5b8c\u6210\u540e\u518d\u6b21\u6267\u884c\u672c\u811a\u672c\u5373\u53ef\u3002\nif [ ! -e $SRC_FILE ]; then\n  wget -c -o $SRC_FILE $SRC_URL\nfi\n\nif [ $? != 0 ]; then\n  echo \"Download $SRC_URL failed.\"\n  exit\nfi\n\ntar xf $SRC_FILE -C $BASE_ROOTFS_DIR\n\nif [ -e $BASE_ROOTFS_SRC ]; then\n  #-- 1.0. \u8fdb\u5165\u6e90\u7801\u76ee\u5f55\uff0c\u51c6\u5907\u9759\u6001\u7f16\u8bd1 BusyBox\n  cd $BASE_ROOTFS_SRC\n  # 1.1. \u751f\u6210\u9ed8\u8ba4\u914d\u7f6e\n  make defconfig\n  # 1.2. \u5f00\u542f\u9759\u6001\u7f16\u8bd1\u9009\u9879\n  sed -i 's\/# CONFIG_STATIC is not set\/CONFIG_STATIC=y\/' .config\n  # 1.3. \u4f7f\u7528\u6240\u6709 CPU \u6838\u5fc3\u7f16\u8bd1\n  make -j$(nproc)\n  # 1.4. \u5c06\u7f16\u8bd1\u597d\u7684 busybox \u53ca\u5176\u7b26\u53f7\u94fe\u63a5\u5b89\u88c5\u5230\u5f53\u524d\u76ee\u5f55\u7684 _install \u4e2d\n  make install\n  #-- 2.0. \u8fdb\u5165 rootfs \u76ee\u5f55\uff0c\u51c6\u5907\u6784\u5efa\u6839\u6587\u4ef6\u7cfb\u7edf\u7684\u76ee\u5f55\u7ed3\u6784\n  cd $ROOTFS_DIR\n  # 2.1. \u590d\u5236 BusyBox\u7f16\u8bd1\u51fa\u7684\u57fa\u7840\u547d\u4ee4\n  cp -r $BUSYBOX\/* .\n  # 2.2. \u521b\u5efa Linux \u6807\u51c6\u7684\u76ee\u5f55\u7ed3\u6784\n  mkdir -p proc sys dev etc\/init.d tmp root home mnt\n  # 2.3. \u8bbe\u7f6e\u76ee\u5f55\u6743\u9650\n  chmod 1777 tmp\n  #-- 3.0 \u521b\u5efa\u6838\u5fc3\u8bbe\u5907\u8282\u70b9 \n  # \u521b\u5efa \/dev\/console \uff08\u4e3b\u8bbe\u5907\u53f75,\u6b21\u8bbe\u5907\u53f71\uff09\n  sudo mknod dev\/console c 5 1\n  sudo chmod 622 dev\/console\n  # \u521b\u5efa \/dev\/null \uff08\u4e3b\u8bbe\u5907\u53f71,\u6b21\u8bbe\u5907\u53f73\uff09\n  sudo mknod dev\/null c 1 3\n  sudo chmod 666 dev\/null\n  # \u521b\u5efa \/dev\/tty \uff08\u4e3b\u8bbe\u5907\u53f75,\u6b21\u8bbe\u5907\u53f70\uff09\n  sudo mknod dev\/tty c 5 0\n  sudo chmod 666 dev\/tty\n  # \u521b\u5efa \/dev\/ttyS0 \uff08\u4e3b\u8bbe\u5907\u53f74,\u6b21\u8bbe\u5907\u53f764\uff09\n  sudo mknod dev\/ttyS0 c 4 64\n  sudo chmod 666 dev\/ttyS0\n  # \u6dfb\u52a0 root \u5206\u7ec4\u4fe1\u606f\n  cat &lt;&lt;EOF &gt;etc\/group\nroot:x:0:\nEOF\n  # \u6dfb\u52a0 root \u7528\u6237\u4fe1\u606f\n  cat &lt;&lt;EOF &gt;etc\/passwd\nroot:x:0:0:root:\/root:\/bin\/sh\nEOF\n  chmod 644 etc\/group etc\/passwd\n#-- \u542f\u52a8\u5fc5\u9700\u6587\u4ef6\uff0c\u7f3a\u5c11\u5b83\u5185\u6838\u65e0\u6cd5\u6b63\u5e38\u542f\u52a8\n  cat &lt;&lt;EOF &gt;init\n#!\/bin\/bash\n\n# 1. \u6253\u5370\u542f\u52a8\u6210\u529f\u4fe1\u606f\uff08\u5e26\u70b9\u4eea\u5f0f\u611f\uff09\necho \"=============================================\"\necho \"  Welcome to Minimal Linux (BusyBox + v6.18)!\"\necho \"=============================================\"\n\n# 2. \u542f\u52a8\u4e00\u4e2a\u4ea4\u4e92\u5f0f\u7684 ash shell\n# -i \u8868\u793a\u4ea4\u4e92\u5f0f\uff0c\u8ba9\u7cfb\u7edf\u505c\u5728\u8fd9\u91cc\u7b49\u5f85\u4f60\u7684\u8f93\u5165\uff0c\u800c\u4e0d\u662f\u76f4\u63a5\u9000\u51fa\nexec \/bin\/sh -i\nEOF\n#-- \u542f\u52a8\u5fc5\u9700\u6587\u4ef6\uff0c\u7f3a\u5c11\u5b83\u5185\u6838\u65e0\u6cd5\u6b63\u5e38\u542f\u52a8\n  cat &lt;&lt;EOF &gt;etc\/init.d\/rcS\n#!\/bin\/sh\n# \/etc\/init.d\/rcS\n\n# 1. \u6302\u8f7d\u5185\u6838\u63d0\u4f9b\u7684\u865a\u62df\u6587\u4ef6\u7cfb\u7edf\uff08proc\u3001sys\u3001dev\uff09\n# \u8fd9\u662f\u7528\u6237\u6001\u7a0b\u5e8f\u4e0e\u5185\u6838\u4ea4\u4e92\u7684\u6865\u6881\uff0c\u6781\u5176\u91cd\u8981\uff01\nmount -t proc none \/proc\nmount -t sysfs none \/sys\nmount -t devtmpfs none \/dev\n\n# 2. \u8bbe\u7f6e\u4e3b\u673a\u540d\nhostname rtfsc8.rtfsc8.top\n\necho \"============ System Initialized. ============\"\nEOF\n  # \u8d4b\u4e88\u6267\u884c\u6743\u9650\n  chmod +x init\n  chmod +x etc\/init.d\/rcS\nfi\n<\/code><\/pre>\n<p>\u811a\u672c\u6267\u884c\u6548\u679c\u5982\u4e0b\u56fe\u6240\u793a\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.rtfsc8.top\/wp-content\/uploads\/2026\/09\/image-1789066092784.png\" alt=\"file\" \/><\/p>\n<h2>\u6253\u5305\u6839\u6587\u4ef6\u7cfb\u7edf\u955c\u50cf<\/h2>\n<blockquote>\n<p>filename: 03-package-initramfs.sh<\/p>\n<\/blockquote>\n<pre><code class=\"language-bash\">#!\/bin\/bash\n# \u52a0\u8f7d\u516c\u5171\u914d\u7f6e\nsource env.src\n\nif [ -e $ROOTFS_DIR ]; then\n  # \u8fdb\u5165\u6839\u6587\u4ef6\u7cfb\u7edf\u76ee\u5f55\n  cd $ROOTFS_DIR\n  # \u5f00\u59cb\u6253\u5305\n  find . -print0 | \\\n    cpio --null -ov --format=newc | \\\n    gzip -9 &gt; ${INITRAMFS}\nfi\n<\/code><\/pre>\n<p>\u6839\u6587\u4ef6\u7cfb\u7edf\u6253\u5305\u6548\u679c\u5982\u4e0b\u56fe\u6240\u793a\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.rtfsc8.top\/wp-content\/uploads\/2026\/09\/image-1789066127587.png\" alt=\"file\" \/><\/p>\n<p>\u6839\u6587\u4ef6\u7cfb\u7edf\u538b\u7f29\u5305\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.rtfsc8.top\/wp-content\/uploads\/2026\/09\/image-1789066188978.png\" alt=\"file\" \/><\/p>\n<h2>\u7f16\u8bd1<em>Linux<\/em>\u5185\u6838<\/h2>\n<blockquote>\n<p>filename: build-kernel.sh<\/p>\n<\/blockquote>\n<pre><code class=\"language-bash\">#!\/bin\/bash\n# \u52a0\u8f7d\u516c\u5171\u914d\u7f6e\nsource env.src\n\nif [ -e $KERNEL_SRC_DIR ]; then\n  # \u8fdb\u5165\u6e90\u7801\u76ee\u5f55\n  cd $KERNEL_SRC_DIR\n  cat &lt;&lt;EOF &gt;debug.config\n# \u5f00\u542f\u8c03\u8bd5\u4fe1\u606f\nCONFIG_DEBUG_INFO_NONE=n\nCONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y\nCONFIG_DEBUG_KERNEL=y\nCONFIG_FRAME_POINTER=y\n# \u53ef\u9009\u4f46\u63a8\u8350\uff1a\u6539\u5584 GDB \u8c03\u8bd5\u4f53\u9a8c\nCONFIG_GDB_SCRIPTS=y\nCONFIG_KALLSYMS=y\nCONFIG_KALLSYMS_ALL=y\nEOF\n  # \u5f00\u59cb\u7f16\u8bd1\n  make clean &amp;&amp; make defconfig &amp;&amp; \\\n    .\/scripts\/kconfig\/merge_config.sh .config debug.config &amp;&amp; \\\n    make olddefconfig &amp;&amp; \\\n    make -j$(nproc) &amp;&amp; \\\n    echo \"================ Show Debug Info ================\" &amp;&amp; \\\n    readelf -S vmlinux | grep debug_info\nfi\n<\/code><\/pre>\n<p>\u5185\u6838\u6e90\u7801\u7f16\u8bd1\u622a\u56fe\u5982\u4e0b\uff1a<\/p>\n<p>\u8c03\u8bd5\u5f00\u5173\u914d\u7f6e\u5408\u5e76\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.rtfsc8.top\/wp-content\/uploads\/2026\/09\/image-1789066338933.png\" alt=\"file\" \/><\/p>\n<p>\u7f16\u8bd1\u5b8c\u6210\uff0c\u68c0\u67e5\u5185\u6838\u5b58\u5728\u8c03\u8bd5\u4fe1\u606f\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.rtfsc8.top\/wp-content\/uploads\/2026\/09\/image-1789066674106.png\" alt=\"file\" \/><\/p>\n<h2>\u542f\u52a8<em>QEMU<\/em><\/h2>\n<blockquote>\n<p>filename: start-kernel.sh<\/p>\n<\/blockquote>\n<pre><code class=\"language-bash\">#!\/bin\/bash\n# \u52a0\u8f7d\u516c\u5171\u914d\u7f6e\nsource env.src\n\nif [ -e $KERNEL_SRC_DIR ]; then\n  # \u8fdb\u5165\u6e90\u7801\u76ee\u5f55\n  cd $KERNEL_SRC_DIR\n  # \u5f00\u59cb\u542f\u52a8QEMU\n  exec $COMMAND_QEMU \\\n    -kernel arch\/x86\/boot\/bzImage \\\n    -initrd rootfs.cpio.gz \\\n    -append \"console=ttyS0 root=\/dev\/ram rdinit=\/init nokaslr\" \\\n    -nographic -m 512M\n  # -nographic: \u7981\u7528\u56fe\u5f62\u754c\u9762\uff0c\u5c06\u865a\u62df\u673a\u7684\u4e32\u53e3\u8f93\u51fa\u91cd\u5b9a\u5411\u5230\n  #             \u5f53\u524d\u7ec8\u7aef(\u914d\u5408 console=ttyS0)\n  # root=\/dev\/ram: \u544a\u8bc9\u5185\u6838\u6839\u6587\u4ef6\u7cfb\u7edf\u5728\u5185\u5b58\u91cc\n  # rdinit=\/init: \u660e\u786e\u544a\u8bc9\u5185\u6838\u542f\u52a8\u540e\u6267\u884c\u6839\u76ee\u5f55\u4e0b\u7684 \/init \u811a\u672c\n  # nokaslr: \u5173\u952e\u8c03\u8bd5\u53c2\u6570\uff01\u5173\u95ed\u5185\u6838\u5730\u5740\u7a7a\u95f4\u5e03\u5c40\u968f\u673a\u5316\uff0c\n  #          \u5426\u5219\u6bcf\u6b21\u542f\u52a8\u5185\u6838\u51fd\u6570\u7684\u5185\u5b58\u5730\u5740\u90fd\u4f1a\u53d8\uff0cGDB \n  #          \u65ad\u70b9\u4f1a\u5168\u90e8\u5931\u6548\nfi\n<\/code><\/pre>\n<p>\u5185\u6838\u8fd0\u884c\u6548\u679c\u5982\u4e0b\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.rtfsc8.top\/wp-content\/uploads\/2026\/09\/image-1789066774286.png\" alt=\"file\" \/><\/p>\n<p>\u5185\u6838\u4fe1\u606f\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.rtfsc8.top\/wp-content\/uploads\/2026\/09\/image-1789066820568.png\" alt=\"file\" \/><\/p>\n<p>\u5173\u673a\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.rtfsc8.top\/wp-content\/uploads\/2026\/09\/image-1789066894270.png\" alt=\"file\" \/><\/p>\n<h2>\u542f\u52a8<em>QEMU<\/em>\u8fdc\u7a0b\u8c03\u8bd5<\/h2>\n<blockquote>\n<p>filename: start-qemu.sh<\/p>\n<\/blockquote>\n<pre><code class=\"language-bash\">#!\/bin\/bash\n# \u52a0\u8f7d\u516c\u5171\u914d\u7f6e\nsource env.src\n\nif [ -e $KERNEL_SRC_DIR ]; then\n  # \u8fdb\u5165\u6e90\u7801\u76ee\u5f55\n  cd $KERNEL_SRC_DIR\n  # \u5f00\u59cb\u542f\u52a8QEMU\n  exec $COMMAND_QEMU \\\n    -kernel arch\/x86\/boot\/bzImage \\\n    -initrd rootfs.cpio.gz \\\n    -append \"console=ttyS0 root=\/dev\/ram rdinit=\/init nokaslr\" \\\n    -nographic -m 512M \\\n    -s -S\n  # -nographic: \u7981\u7528\u56fe\u5f62\u754c\u9762\uff0c\u5c06\u865a\u62df\u673a\u7684\u4e32\u53e3\u8f93\u51fa\u91cd\u5b9a\u5411\u5230\n  #             \u5f53\u524d\u7ec8\u7aef(\u914d\u5408 console=ttyS0)\n  # root=\/dev\/ram: \u544a\u8bc9\u5185\u6838\u6839\u6587\u4ef6\u7cfb\u7edf\u5728\u5185\u5b58\u91cc\n  # rdinit=\/init: \u660e\u786e\u544a\u8bc9\u5185\u6838\u542f\u52a8\u540e\u6267\u884c\u6839\u76ee\u5f55\u4e0b\u7684 \/init \u811a\u672c\n  # nokaslr: \u5173\u952e\u8c03\u8bd5\u53c2\u6570\uff01\u5173\u95ed\u5185\u6838\u5730\u5740\u7a7a\u95f4\u5e03\u5c40\u968f\u673a\u5316\uff0c\n  #          \u5426\u5219\u6bcf\u6b21\u542f\u52a8\u5185\u6838\u51fd\u6570\u7684\u5185\u5b58\u5730\u5740\u90fd\u4f1a\u53d8\uff0cGDB \n  #          \u65ad\u70b9\u4f1a\u5168\u90e8\u5931\u6548\n  # -s: \u76f8\u5f53\u4e8e -gdb tcp::1234\uff0c\u5728 1234 \u7aef\u53e3\u5f00\u542f gdb \u670d\u52a1\n  # -S: \u542f\u52a8\u65f6\u51bb\u7ed3 CPU\uff0c\u76f4\u5230 GDB \u53d1\u51fa continue \u547d\u4ee4\u3002\u6b64\u65f6\u7ec8\u7aef\n  #     \u4f1a\u5361\u4f4f\uff0c\u6ca1\u6709\u4efb\u4f55\u8f93\u51fa\u3002\nfi\n<\/code><\/pre>\n<p>\u521a\u542f\u52a8\u8c03\u8bd5\u6a21\u5f0f\uff0c\u7b49\u5f85\u8c03\u8bd5\u4e2d\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.rtfsc8.top\/wp-content\/uploads\/2026\/09\/image-1789066955195.png\" alt=\"file\" \/><\/p>\n<p>\u9010\u884c\u6267\u884c\uff0c\u5f53<em>console_init()<\/em>\u6267\u884c\u5b8c\u6210\u540e\uff0c\u63a7\u5236\u53f0\u5f00\u59cb\u51fa\u73b0\u6587\u5b57\u4fe1\u606f\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.rtfsc8.top\/wp-content\/uploads\/2026\/09\/image-1789067492901.png\" alt=\"file\" \/><\/p>\n<p>\u6267\u884c\u5b8c<em>rest_init()<\/em>\uff0c\u7cfb\u7edf\u542f\u52a8\u5b8c\u6210\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.rtfsc8.top\/wp-content\/uploads\/2026\/09\/image-1789067682452.png\" alt=\"file\" \/><\/p>\n<p>\u6309\u4e0b<em>Enter<\/em>\u952e\u8fdb\u5165\u547d\u4ee4\u884c\uff0c\u6267\u884c\u547d\u4ee4\u5982\u4e0b\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.rtfsc8.top\/wp-content\/uploads\/2026\/09\/image-1789067836583.png\" alt=\"file\" \/><\/p>\n<p>\u6267\u884c<em>poweroff<\/em>\u547d\u4ee4\u540e\uff0c<em>qemu<\/em>\u9000\u51fa\u6267\u884c\uff0c<em>gdb<\/em>\u8c03\u8bd5\u81ea\u52a8\u65ad\u5f00\u8fdc\u7a0b\u8fde\u63a5\u3002<\/p>\n<h2>\u542f\u52a8\u8c03\u8bd5<\/h2>\n<blockquote>\n<p>filename: start-gdb.sh<\/p>\n<\/blockquote>\n<pre><code class=\"language-bash\">#!\/bin\/bash\n# \u52a0\u8f7d\u516c\u5171\u914d\u7f6e\nsource env.src\n\nif [ -e $KERNEL_SRC_DIR ]; then\n  # \u8fdb\u5165\u6e90\u7801\u76ee\u5f55\n  cd $KERNEL_SRC_DIR\n  cat &lt;&lt;EOF &gt;gdb.cmd\nfile vmlinux\ntarget remote localhost:1234\nbreak start_kernel\ncontinue\ninfo sources\ninfo breakpoints\nEOF\n  # \u5f00\u59cb\u8c03\u8bd5\n  # gdb vmlinux\n  gdb -x gdb.cmd\nfi\n<\/code><\/pre>\n<p>\u8fdc\u7a0b\u8c03\u8bd5\u8fde\u63a5\u542f\u52a8\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.rtfsc8.top\/wp-content\/uploads\/2026\/09\/image-1789067038524.png\" alt=\"file\" \/><\/p>\n<p>\u5f00\u59cb\u9010\u884c\u8c03\u8bd5\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.rtfsc8.top\/wp-content\/uploads\/2026\/09\/image-1789067177673.png\" alt=\"file\" \/><\/p>\n<p>\u67e5\u770b\u53d8\u91cf\u4fe1\u606f\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.rtfsc8.top\/wp-content\/uploads\/2026\/09\/image-1789067295676.png\" alt=\"file\" \/><\/p>\n<p><em>qemu<\/em>\u9000\u51fa\u540e\uff0c<em>gdb<\/em>\u7a97\u53e3\u81ea\u52a8<em>detach<\/em>\uff0c\u7136\u540e\u8f93\u5165<em>exit<\/em>\u6216<em>quit<\/em>\u9000\u51fa\u8c03\u8bd5\u3002<\/p>\n<h2>\u624b\u52a8\u6740\u6b7b<em>qemu<\/em>\u8fdb\u7a0b<\/h2>\n<blockquote>\n<p>\u82e5\u662f\u51fa\u73b0<em>qemu<\/em>\u865a\u62df\u673a\u65e0\u6cd5\u64cd\u4f5c\uff0c\u53ef\u4f7f\u7528\u4ee5\u4e0b\u811a\u672c\u624b\u52a8\u6740\u6b7b\u8fdb\u7a0b\u3002<br \/>\nfilename: stop-qemu.sh<\/p>\n<\/blockquote>\n<pre><code class=\"language-bash\">#!\/bin\/bash\n# \u52a0\u8f7d\u516c\u5171\u914d\u7f6e\nsource env.src\n\necho \"================ Begin searching $COMMAND_QEMU process...\"\n\\ps -ef | grep $COMMAND_QEMU\n\necho \"================ Begin killing $COMMAND_QEMU process...\"\n\\ps -ef | grep $COMMAND_QEMU | \\\n  grep -v grep | \\\n  awk '{print $2}' | \\\n  xargs kill -9 2&gt;\/dev\/null\n\necho \"================ Kill done.\"\n<\/code><\/pre>\n<h2>\u811a\u672c\u4f7f\u7528\u6d41\u7a0b\u8bf4\u660e<\/h2>\n<blockquote>\n<p>\u5b8c\u6574\u6d41\u7a0b\u5982\u4e0b\u56fe\u6240\u793a\u3002<\/p>\n<ol>\n<li>\u82e5\u66f4\u65b0\u6839\u6587\u4ef6\u7cfb\u7edf\u76f8\u5173\u6587\u4ef6\uff0c\u5219\u91cd\u65b0\u4f9d\u6b21\u6267\u884c<em>02-build-busybox.sh<\/em>\u3001<em>03-package-initramfs.sh<\/em>\u811a\u672c\uff1b<\/li>\n<li>\u82e5\u4fee\u6539\u5185\u6838\u4ee3\u7801\uff0c\u5219\u91cd\u65b0\u6267\u884c<em>build-kernel.sh<\/em>\u811a\u672c\uff1b<\/li>\n<\/ol>\n<p>\u7136\u540e\u91cd\u65b0\u542f\u52a8<em>start-qemu.sh<\/em>\u548c<em>start-gdb.sh<\/em>\u8c03\u8bd5\u3002<\/p>\n<\/blockquote>\n<pre><code class=\"language-mermaid\">flowchart TB;\n  check[01-check-packages.sh \u524d\u7f6e\u4f9d\u8d56\u5305\u68c0\u67e5];\n  subgraph buildBusybox [BusyBox\u6839\u6587\u4ef6\u7cfb\u7edf\u6784\u5efa]\n    building[02-build-busybox.sh \u7f16\u8bd1BusyBox];\n    package[03-package-initramfs.sh \u6253\u5305\u6839\u6587\u4ef6\u7cfb\u7edf];\n  end\n  subgraph kernel [\u7f16\u8bd1Linux\u5185\u6838\u4ee3\u7801]\n    buildKernel[build-kernel.sh \u7f16\u8bd1\u5185\u6838];\n  end\n  subgraph commands [\u6267\u884c\u547d\u4ee4\u9a8c\u8bc1\u5185\u6838]\n    cmd_id[id \u547d\u4ee4\u67e5\u770b\u5f53\u524d\u7528\u6237];\n    cmd_groups[groups \u547d\u4ee4\u67e5\u770b\u7ec4\u540d];\n    cmd_whoami[whoami \u547d\u4ee4\u67e5\u770b\u5f53\u524d\u7528\u6237];\n  end\n  subgraph debugCommands [gdb\u8c03\u8bd5\u547d\u4ee4]\n    gdb_file[file vmlinux \u52a0\u8f7d\u643a\u5e26\u8c03\u8bd5\u4fe1\u606f\u7684\u5185\u6838];\n    gdb_target[target remote localhost:1234 \u8fde\u63a5\u8fdc\u7a0b\u8c03\u8bd5];\n    gdb_break[break start_kernel \u5728start_kernel\u51fd\u6570\u8bbe\u7f6e\u65ad\u70b9];\n    gdb_continue[continue \u7ee7\u7eed\u5411\u4e0b\u6267\u884c];\n    gdb_infobp[info breakpoints \u67e5\u770b\u65ad\u70b9\u5217\u8868];\n    gdb_list[list \u67e5\u770b\u4ee3\u7801];\n    gdb_next[next \u6267\u884c\u4e0b\u4e00\u884c];\n    gdb_source[source gdb.cmd \u52a0\u8f7dgdb.cmd\u9884\u5148\u5199\u597d\u7684\u6279\u91cf\u547d\u4ee4\u65b9\u4fbf\u8c03\u8bd5];\n    gdb_detach[detach \u65ad\u5f00\u865a\u62df\u673a\u8fde\u63a5];\n  end\n  startQemu[start-qemu.sh \u542f\u52a8\u5185\u6838\u8fdc\u7a0b\u8c03\u8bd5];\n  startGdb[start-gdb.sh \u8fde\u63a5\u8fdc\u7a0b\u8c03\u8bd5];\n  startKernel[start-kernel.sh \u865a\u62df\u8fd0\u884c\u5185\u6838];\n  stopQemu[stop-qemu.sh \u5f02\u5e38\u60c5\u51b5\u624b\u52a8\u505c\u6b62QEMU];\n  check--&gt;buildBusybox--&gt;kernel;\n  kernel-- 1\u53f7\u7ec8\u7aef\u9a8c\u8bc1\u5185\u6838\u662f\u5426\u8fd0\u884c\u6b63\u5e38 --&gt;startKernel--&gt;commands;\n  kernel-- 2\u53f7\u7ec8\u7aef\u6253\u5f00\u8c03\u8bd5\u6a21\u5f0f --&gt;startQemu-- 3\u53f7\u7ec8\u7aefgdb\u8fdc\u7a0b\u8c03\u8bd5 --&gt;startGdb--&gt;debugCommands;\n  startQemu-- 2\u53f7\u7ec8\u7aef\u5361\u6b7b\u65e0\u6cd5\u64cd\u4f5c\u5219\u57284\u53f7\u7ec8\u7aef\u6267\u884c --&gt;stopQemu;<\/code><\/pre>\n<h1>\u6109\u5feb\u7684\u5f00\u59cb\u9605\u8bfb\u6e90\u7801\u5427<\/h1>\n<p>\u5199\u5230\u8fd9\u91cc\uff0c\u57fa\u4e8e<em>BusyBox<\/em>\u548c<em>QEMU<\/em>\u7684<em>Linux Kernel<\/em>\u4ee3\u7801\u8c03\u8bd5\u73af\u5883\u5df2\u7136\u5b8c\u6210\u642d\u5efa\uff0c\u63a5\u4e0b\u6765\u5c31\u662f\u6109\u5feb\u7684\u9605\u8bfb\u5185\u6838\u6e90\u7801\uff0c\u7075\u6d3b\u8fd0\u7528\u811a\u672c\u5de5\u5177\u53bb\u73a9\u5566\uff5e<\/p>\n<h1>References<\/h1>\n<ol>\n<li><a href=\"https:\/\/busybox.net\/downloads\/busybox-1.38.0.tar.bz2\" title=\"busybox-1.38.0.tar.bz2\">busybox-1.38.0.tar.bz2<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/torvalds\/linux\/\" title=\"linux v6.18-rc7\">linux v6.18-rc7<\/a><\/li>\n<li><a href=\"https:\/\/visualstudio.microsoft.com\/zh-hans\/downloads\/\" title=\"VS code\u591a\u5e73\u53f0\u5b89\u88c5\u5305\u4e0b\u8f7d\">VS code\u591a\u5e73\u53f0\u5b89\u88c5\u5305\u4e0b\u8f7d<\/a><\/li>\n<li><a href=\"https:\/\/code.visualstudio.com\/download\" title=\"VS code\u591a\u5e73\u53f0\u5b89\u88c5\u5305\u4e0b\u8f7d2\">VS code\u591a\u5e73\u53f0\u5b89\u88c5\u5305\u4e0b\u8f7d2<\/a><\/li>\n<li><a href=\"https:\/\/elixir.bootlin.com\/linux\/v6.18-rc7\/source\" title=\"linux v6.18-rc7\u5728\u7ebf\u9605\u8bfb\u6e90\u7801\">linux v6.18-rc7\u5728\u7ebf\u9605\u8bfb\u6e90\u7801<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>\u57fa\u7840\u73af\u5883 \u64cd\u4f5c\u7cfb\u7edf\uff1a Ubuntu 22.04.5 LTS \u5b9e\u9a8c\u6839\u76ee\u5f55\uff1a \/data\/linux-kernel&#8230; &raquo; <a class=\"read-more-link\" href=\"https:\/\/blog.rtfsc8.top\/index.php\/2026\/09\/11\/%e5%9f%ba%e4%ba%8eubuntu22-04-5lts%e6%90%ad%e5%bb%baqemu%e5%92%8clinux%e5%86%85%e6%a0%b8%e4%bb%a3%e7%a0%81%e8%b0%83%e8%af%95%e7%8e%af%e5%a2%83\/\">\u9605\u8bfb\u5168\u6587<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24,16],"tags":[],"class_list":["post-154","post","type-post","status-publish","format-standard","hentry","category-linux","category-note"],"_links":{"self":[{"href":"https:\/\/blog.rtfsc8.top\/index.php\/wp-json\/wp\/v2\/posts\/154","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.rtfsc8.top\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.rtfsc8.top\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.rtfsc8.top\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.rtfsc8.top\/index.php\/wp-json\/wp\/v2\/comments?post=154"}],"version-history":[{"count":2,"href":"https:\/\/blog.rtfsc8.top\/index.php\/wp-json\/wp\/v2\/posts\/154\/revisions"}],"predecessor-version":[{"id":174,"href":"https:\/\/blog.rtfsc8.top\/index.php\/wp-json\/wp\/v2\/posts\/154\/revisions\/174"}],"wp:attachment":[{"href":"https:\/\/blog.rtfsc8.top\/index.php\/wp-json\/wp\/v2\/media?parent=154"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.rtfsc8.top\/index.php\/wp-json\/wp\/v2\/categories?post=154"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.rtfsc8.top\/index.php\/wp-json\/wp\/v2\/tags?post=154"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}