1.1 hello-world番外篇

整個simulate腳本就是在構(gòu)建qemu仿真的參數(shù)

#!/usr/bin/env python3
#
# Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
#
# SPDX-License-Identifier: BSD-2-Clause
#

import subprocess #用于執(zhí)行外部指令
import sys
import argparse
import time


def parse_args(): #使用parse_args函數(shù)解析命令行參數(shù)
    parser = argparse.ArgumentParser()
    parser.add_argument('-b', '--binary', dest="qemu_sim_binary", type=str,
                        help="QEMU binary", default="qemu-system-x86_64")
    parser.add_argument('-d', '--gdbserver', dest="qemu_gdbserver", action='store_true',
                        help="Tell QEMU to wait for gdb on port 1234")
    parser.add_argument('-M', '--machine', dest="qemu_sim_machine", type=str,
                        help="QEMU Machine", default="")
    parser.add_argument('-c', '--cpu', dest='qemu_sim_cpu', type=str,
                        help="QEMU CPU", default="Nehalem")
    parser.add_argument('-o', '--cpu-opt', dest='qemu_sim_cpu_opt', type=str,
                        help="QEMU CPU Options", default=",-vme,+pdpe1gb,-xsave,-xsaveopt,-xsavec,-fsgsbase,-invpcid,+syscall,+lm,enforce")
    parser.add_argument('-g', '--graphic', dest='qemu_sim_graphic_opt', type=str,
                        help="QEMU Graphic Options", default="-nographic")
    parser.add_argument('-s', '--serial', dest='qemu_sim_serial_opt', type=str,
                        help="QEMU Serial Options", default="-serial mon:stdio")
    parser.add_argument('-m', '--mem-size', dest='qemu_sim_mem_size', type=str,
                        help="QEMU Memory Size Option", default="512M")
    parser.add_argument('-a', '--args', dest='qemu_sim_args', type=str,
                        help="Arguments to pass onto QEMU", default="")
    parser.add_argument('-k', '--kernel', dest='qemu_sim_kernel_file', type=str,
                        help="Kernel file to pass onto QEMU", default="images/kernel-x86_64-pc99")
    parser.add_argument('-i', '--initrd', dest='qemu_sim_initrd_file', type=str,
                        help="Initrd file to pass onto QEMU", default="images/hello-world-image-x86_64-pc99")
    parser.add_argument("-n", '--dry-run', dest='dry_run', action='store_true',
                        help="Output command for QEMU (and GDB), but do not execute it")
    parser.add_argument('--extra-qemu-args', dest='qemu_sim_extra_args', type=str,
                        help="Additional arguments to pass onto QEMU", default="")
    parser.add_argument('--extra-cpu-opts', dest='qemu_sim_extra_cpu_opts', type=str,
                        help="Additional cpu options to append onto the existing CPU options",
                        default="")
    args = parser.parse_args()
    return args


def notice(message): #用輸出帶有程序名稱前綴的log
    # Don't call this without initialising `progname`.
    assert(progname)
    sys.stderr.write("{}: {}".format(progname, message))
    sys.stderr.flush()


if __name__ == "__main__":
    args = parse_args()         #解析命令行參數(shù)并存儲在args變量中
    progname = sys.argv[0]  #獲取腳本自身的名稱(progname)

    if args.qemu_sim_kernel_file == "": #根據(jù)參數(shù)選擇使用哪個內(nèi)核文件(默認(rèn)為images/hello-world-image-x86_64-pc99)
        qemu_sim_images_entry = "-kernel " + args.qemu_sim_initrd_file
    else:
        qemu_sim_images_entry = "-kernel " + args.qemu_sim_kernel_file + " -initrd " + args.qemu_sim_initrd_file

    qemu_sim_cpu_entry = "" #構(gòu)建CPU選項
    if args.qemu_sim_cpu != "":
        qemu_sim_cpu_entry = "-cpu " + args.qemu_sim_cpu + args.qemu_sim_cpu_opt + \
            ("," + args.qemu_sim_extra_cpu_opts if args.qemu_sim_extra_cpu_opts else "")

    qemu_sim_machine_entry = "" #構(gòu)建QEMU機(jī)器選項
    if args.qemu_sim_machine:
        qemu_sim_machine_entry = "-machine " + args.qemu_sim_machine

    qemu_gdbserver_command = "" #如果選擇啟用GDB調(diào)試服務(wù)器外遇,則添加相應(yīng)的參數(shù)
    if args.qemu_gdbserver:
        qemu_gdbserver_command = "-s -S"

    qemu_sim_mem_size_entry = "-m size=" + args.qemu_sim_mem_size  #構(gòu)建內(nèi)存大小選項

    qemu_simulate_command_opts = [args.qemu_sim_binary, qemu_sim_machine_entry, qemu_sim_cpu_entry, args.qemu_sim_graphic_opt,
                                  args.qemu_sim_serial_opt, qemu_sim_mem_size_entry, args.qemu_sim_extra_args, qemu_sim_images_entry,
                                  qemu_gdbserver_command]  #構(gòu)建額外的QEMU參數(shù)
    qemu_simulate_command = " ".join(qemu_simulate_command_opts) #構(gòu)建完整的QEMU命令

    notice('QEMU command: ' + qemu_simulate_command) #輸出構(gòu)建的QEMU命令,如果選擇了dry-run選項則僅輸出不執(zhí)行

    if args.dry_run:
        exit()

    if qemu_gdbserver_command != "": #如果啟用了GDB調(diào)試服務(wù)器,則在端口1234上等待GDB連接
        notice('waiting for GDB on port 1234...')

    qemu_status = subprocess.call(qemu_simulate_command, shell=True) #運(yùn)行QEMU虛擬機(jī),并將返回狀態(tài)存儲在qemu_status中

    if qemu_status != 0: #如果QEMU啟動失敗清蚀,等待一段時間后嘗試重置終端,以確苯稍剩控制臺的正確狀態(tài)
        delay = 5  # in seconds
        # Force a newline onto the output stream.
        sys.stderr.write('\n')
        msg = "QEMU failed; resetting terminal in lwr0ys0 seconds".format(d=delay) \
            + "--interrupt to abort\n"
        notice(msg)
    else:
        delay = 2  # in seconds #如果QEMU啟動成功,也等待一段時間后重置終端

    time.sleep(delay)

    subprocess.call("tput reset", shell=True)

執(zhí)行hello-world是RAM鏡像文件中:

    parser.add_argument('-k', '--kernel', dest='qemu_sim_kernel_file', type=str,
                        help="Kernel file to pass onto QEMU", default="images/kernel-x86_64-pc99")
    parser.add_argument('-i', '--initrd', dest='qemu_sim_initrd_file', type=str,
                        help="Initrd file to pass onto QEMU", default="images/hello-world-image-x86_64-pc99")
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市练般,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锈候,老刑警劉巖薄料,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泵琳,居然都是意外死亡摄职,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門获列,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谷市,“玉大人,你說我怎么就攤上這事击孩∑扔疲” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵巩梢,是天一觀的道長创泄。 經(jīng)常有香客問我,道長括蝠,這世上最難降的妖魔是什么鞠抑? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮忌警,結(jié)果婚禮上搁拙,老公的妹妹穿的比我還像新娘。我一直安慰自己法绵,他們只是感情好箕速,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著礼烈,像睡著了一般弧满。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上此熬,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天庭呜,我揣著相機(jī)與錄音,去河邊找鬼犀忱。 笑死募谎,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阴汇。 我是一名探鬼主播数冬,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拐纱?” 一聲冷哼從身側(cè)響起铜异,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秸架,沒想到半個月后揍庄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡东抹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年蚂子,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缭黔。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡食茎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出馏谨,到底是詐尸還是另有隱情别渔,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布田巴,位于F島的核電站钠糊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏壹哺。R本人自食惡果不足惜抄伍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望管宵。 院中可真熱鬧截珍,春花似錦、人聲如沸箩朴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炸庞。三九已至钱床,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間埠居,已是汗流浹背查牌。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滥壕,地道東北人纸颜。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像绎橘,于是被迫代替她去往敵國和親胁孙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容