為QEMU新增新的QMP命令

2021-06-20 01:56:57 字數 2657 閱讀 4890

qmp命令由結構

mon_cmd_t

定義,該結構在

monitor.c

的開頭被定義。注意檢視它的成員以及該結構上面的注釋。

為了新增新的

qmp命令,需要修改

qemu-monitor.hx

注意檢視最開始的說明:

defheading()

用於在help text

和texi

中增加標題頭

處於stexi

和etexi

之間的內容會被拷貝到

texi

版本中,但不會出現在

c版本中

處於sqmp

和eqmp

之間的內容會被拷貝到

qmp文件中,但不會出現在其它格式的版本中

def(command, args, callback, arg_string, help)

用於構造

monitor

命令hxcomm

用於注釋

為了增加新的命令,我們需要在

qemu-monitor.hx

中增加mon_cmd_t

結構的例項。實際的寫法如何可以

參照qemu-monitor.hx

中已有命令以及

monitor.c

開頭的注釋。下面是

drive_del

命令對應的

mon_cmd_t ,

這裡的rfqdn_redhat

在monitor.h

中定義,

#define rfqdn_redhat "__com.redhat_"

新增字首是為了保證當有多個組織往

qmp中新增命令的時候不會重複。

為什麼要加字首,以及為什麼以兩個下劃線開頭,可以參見

qmp/qmp-spec.txt

qmp命令的處理過程:

在qemu-monitor.hx

中的命令,經過預處理之後會生成

x86_64-softmmu/qemu-monitor.h

這裡的x86_64-softmmu

跟cpu

架構有關,不同的架構可能會生成不同的目錄名稱。

在qemu-monitor.h

中就不會出現包含在

stexi, etexi

以及sqmp, eqmp

之間的內容,它的內容

就是所有命令所對應的

mon_cmd_t

結構列表

在monitor.c

中,有以下的**

static const mon_cmd_t mon_cmds = ,

};通過這樣的步驟,

qemu-monitor.hx

中的命令最終就進入到了

qemu

的**中。

qemu

中,對於

info

命令,有一些特別的處理。在

qemu-monitor.hx

中已經定義了

info

命令,其

handler

為do_info

。在do_info

中,又會去查詢

info_cmds(

在monitor.c)

中定義的

子命令。因此,如果需要新增一條新的

info ***

命令,只需要在

monitor.c

中的info_cmds

中新增mon_cmd_t

結構就行了。而不是在

qemu-monitor.hx

中新增mon_cmd_t

結構。但是記得在

qmp-monitor.hx

中要把相應的說明新增進去。

對於支援

qmp的命令,必須設定

mon_cmd_t

的user_print

函式,該函式用於將返回的物件列印到

monitor

控制台上。而且對於

info

命令,必須設定

mhandler.info_new

,其它命令則設定

mhandler.cmd_new

,這兩個函式返回乙個物件,但是不列印任何內容。

返回的物件是

json

的物件表示。如果返回內容是乙個列表,那麼可以先

list = qlist_new()

,然後使用

往裡面新增物件,最後

*ret_data = qobject(list)

如果返回內容是乙個字典,那麼可以使用

qobject_from_jsonf

。乙個較複雜的例子可以參見

info block

的處理函式

bdrv_info

user_print

函式則將返回的物件列印到

monitor

控制台,可以使用

monitor_printf

等函式。

對於只支援

hmp,不支援

qmp的命令,則將

user_print

設定為null

,並且設定相應的

mhandler.info

和mhandler.cmd

函式。

為 Caffe 新增新的 DataLayer

復現 deepid 用 caffe 實現人臉識別時,網路的訓練的框架往往是這樣的 就是說 image list 中的資料是按對整理好的,類內 intra class 類間 inter class 資料交替排列。這樣就可以直接利用 imagedatalayer 獲得乙個個均勻的 batch。現在只要對...

新增新的命令使生效

有時候linux預設安裝的命令版本較低,我們需要安裝較高版本的命令。比如,centos預設安裝的python為2.6.6,安裝2.7版本後,執行python v檢視還是2.6版本的python。此時首先想到的應該是環境變數可能有問題,2.7版本的python安裝在 usr local bin 下,2...

BusyBox 中新增新命令

向 busybox 新增乙個新命令非常簡單,這是因為它具有良好定義的體系結構。第乙個步驟是為新命令的源 選擇乙個位置。我們要根據命令的型別 網路,shell 等 來選擇位置,並與其他命令保持一致。這一點非常重要,因為這個新命令最終會在 menuconfig 的配置選單中出現 在下面的例子中,是 mi...