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...