当前位置: 首页 > news >正文

网站如何收费建立公司网站要多少钱

网站如何收费,建立公司网站要多少钱,天津建站费用,做网站报价表文章目录 1.添加qmp接口1.1.添加接口原型1.2.添加接口函数体1.3.测试接口1.3.1.启动虚拟机1.3.2.执行测试命令1.3.3.查看编译后自动生成的代码 2.添加hmp命令2.1.添加命令行2.2.添加调用函数3.增加外设接口3.1.在设备代码文件中增加测试函数 3.2.在qdev中调用pci函数3.3.在pci中… 文章目录 1.添加qmp接口1.1.添加接口原型1.2.添加接口函数体1.3.测试接口1.3.1.启动虚拟机1.3.2.执行测试命令1.3.3.查看编译后自动生成的代码 2.添加hmp命令2.1.添加命令行2.2.添加调用函数3.增加外设接口3.1.在设备代码文件中增加测试函数 3.2.在qdev中调用pci函数3.3.在pci中调用设备函数reference 本文是一个简单的demo基于开源qemu2.8演示了如何添加qmp和hmp接口同时实现从hmp命令打通到底层外设函数的通道此处为i6300esb 1的测试函数。注意此处的调用路径仅供演示实际上并不合理会出现一些告警而在实际云平台编译环境中rpmbuild编译链接是不允许的warning存在的若想添加接口还是应该参考已有的接口走回调函数的方式或者使用object property方式注册处理函数。 1.添加qmp接口 1.1.添加接口原型 在qapi-schema.json末尾添加接口原型daxiatou-watchdog-set-timeout { command: daxiatou-watchdog-set-timeout ,data:{*time:int}} int对应的int64_t正常应该是在这一步先执行编译再进行下一步此处节省篇幅一步搞定详细用法查阅qemu官方文档《writing-qmp-commands.txt》 1.2.添加接口函数体 /*qmp.c*/void qmp_daxiatou_watchdog_set_timeout(bool has_time, int64_t time, Error **errp){if (has_time){printf(%ld\n, time);}else{ printf(Please input time\n); }} 1.3.测试接口 1.3.1.启动虚拟机 qemu启动脚本需要增加以下参数 -chardev socket,idqmp,port4444,hostlocalhost,server -mon chardevqmp,modecontrol,prettyon 这样qemu monitor就可以接受qmp协议报文随后另起一个shell使用如下命令连接qemu monitor [rootlocalhost qemu-2.8.0]# telnet localhost 4444Trying ::1...Connected to localhost.Escape character is ^].{QMP: {version: {qemu: {micro: 0,minor: 8,major: 2},package: },capabilities: []}} 1.3.2.执行测试命令 打开command mode { execute: qmp_capabilities } 执行带参数命令 { execute: daxiatou-watchdog-set-timeout, arguments: { time: 1000 } } 查看qemu端的效果 (qemu) 1000 执行不带参数的命令 { execute: daxiatou-watchdog-set-timeout} 查看qemu端的效果 (qemu) Please input time 1.3.3.查看编译后自动生成的代码 [rootlocalhost qemu-2.8.0]# grep -rn daxiatouqapi-types.h:1936:typedef struct q_obj_daxiatou_watchdog_set_timeout_arg q_obj_daxiatou_watchdog_set_timeout_arg;qapi-types.h:5596:struct q_obj_daxiatou_watchdog_set_timeout_arg {qapi-visit.c:15673:void visit_type_q_obj_daxiatou_watchdog_set_timeout_arg_members(Visitor *v, q_obj_daxiatou_watchdog_set_timeout_arg *obj, Error **errp)qapi-visit.h:986:void visit_type_q_obj_daxiatou_watchdog_set_timeout_arg_members(Visitor *v, q_obj_daxiatou_watchdog_set_timeout_arg *obj, Error **errp);Binary file qmp.o matchesqmp-commands.h:97:void qmp_daxiatou_watchdog_set_timeout(bool has_time, int64_t time, Error **errp);qmp-commands.h:98:void qmp_marshal_daxiatou_watchdog_set_timeout(QDict *args, QObject **ret, Error **errp);qmp.c:719:void qmp_daxiatou_watchdog_set_timeout(bool has_time, int64_t time, Error **errp)Binary file qemu-nbd matchesqmp-introspect.c:91: {\arg-type\: \67\, \meta-type\: \command\, \name\: \daxiatou-watchdog-set-timeout\, \ret-type\: \17\}, Binary file x86_64-softmmu/qemu-system-x86_64 matchesqmp-marshal.c:1286:void qmp_marshal_daxiatou_watchdog_set_timeout(QDict *args, QObject **ret, Error **errp)qmp-marshal.c:1290: q_obj_daxiatou_watchdog_set_timeout_arg arg {0};qmp-marshal.c:1297: visit_type_q_obj_daxiatou_watchdog_set_timeout_arg_members(v, arg, err);qmp-marshal.c:1306: qmp_daxiatou_watchdog_set_timeout(arg.has_time, arg.time, err);qmp-marshal.c:1313: visit_type_q_obj_daxiatou_watchdog_set_timeout_arg_members(v, arg, NULL);qmp-marshal.c:6147: qmp_register_command(daxiatou-watchdog-set-timeout, qmp_marshal_daxiatou_watchdog_set_timeout, QCO_NO_OPTIONS);Binary file qapi-visit.o matchesBinary file qemu-io matchesBinary file qmp-introspect.o matchesBinary file qemu-img matchesBinary file qmp-marshal.o matchesqapi-schema.json:4779:{ command: daxiatou-watchdog-set-timeout ,data:{*time:int}}Binary file i386-softmmu/qemu-system-i386 matchesBinary file libqemuutil.a matchesBinary file qemu-ga matches 会生成很多东西绝大多数不用理会主要看这两个地方 /* qmp-marshal.c*/void qmp_marshal_daxiatou_watchdog_set_timeout(QDict *args, QObject **ret, Error **errp){Error *err NULL;Visitor *v;q_obj_daxiatou_watchdog_set_timeout_arg arg {0};v qobject_input_visitor_new(QOBJECT(args), true);visit_start_struct(v, NULL, NULL, 0, err);if (err) {goto out;}visit_type_q_obj_daxiatou_watchdog_set_timeout_arg_members(v, arg, err);if (!err) {visit_check_struct(v, err);}visit_end_struct(v, NULL);if (err) {goto out;}qmp_daxiatou_watchdog_set_timeout(arg.has_time, arg.time, err);out:error_propagate(errp, err);visit_free(v);v qapi_dealloc_visitor_new();visit_start_struct(v, NULL, NULL, 0, NULL);visit_type_q_obj_daxiatou_watchdog_set_timeout_arg_members(v, arg, NULL);visit_end_struct(v, NULL);visit_free(v);}qmp_register_command(daxiatou-watchdog-set-timeout, qmp_marshal_daxiatou_watchdog_set_timeout, QCO_NO_OPTIONS); qmp_register_command会注册一个qmp命令行daxiatou-watchdog-set-timeout上一节中使用到的命令就是这里注册的相关联的函数qmp_marshal_daxiatou_watchdog_set_timeout会调用1.2节里面添加的自定义函数qmp_daxiatou_watchdog_set_timeout这种设计方式可以让’qmp_开头的函数在另外的文件内单独定义函数体而不影响框架自动生成的代码。 2.添加hmp命令 HMP就是humanmonitor,在qemu monitor敲的命令就属于这一类这是面向用户直接使用的命令 2.1.添加命令行 /*hmp-commands.hx */{.name daxiatou-watchdog-set-timeout,.args_type time:i?,.params daxiatou2 [time],.help set timeout of i6300esb,.cmd hmp_daxiatou_watchdog_set_timeout,},STEXIitem daxiatou-watchdog-set-timeout var{message}Print message to the standard outputETEXI 第一个参数.name代表命令本身的名字 第三个参数.params的作用是显示使用方式如下所示 (qemu) help daxiatou-watchdog-set-timeoutdaxiatou-watchdog-set-timeout daxiatou2 [time] -- set timeout of i6300esb 2.2.添加调用函数 添加函数声明 /*hmp.h*/void hmp_daxiatou_watchdog_set_timeout(Monitor *mon, const QDict *qdict); 添加函数体 /*hmp.c*/void hmp_daxiatou_watchdog_set_timeout(Monitor *mon, const QDict *qdict){int time qdict_get_try_int(qdict, time,30);Error *err NULL;qmp_daxiatou_watchdog_set_timeout(!!time, time, err);if (err) {monitor_printf(mon, %s\n, error_get_pretty(err));error_free(err);return;}} 查看运行效果 (qemu) daxiatou-watchdog-set-timeout 100100(qemu) daxiatou-watchdog-set-timeout30 3.增加外设接口 此处希望通过命令行能直接操作i6300esb的相关变量首先需要让命令行的函数感知到设备的存在 3.1.在设备代码文件中增加测试函数 /*code 3-1*//*hw/watchdog/wdt_i6300esb.c*/static void i6300esb_test(void){i6300esb_debug(daxiatou-i6300esb\n);} 在命令行中直接增加以上函数i6300esb_test()的调用 /*code 3-2 qmp.c*/void qmp_daxiatou_watchdog_set_timeout(bool has_time, int64_t time, Error **errp){if (has_time){printf(%ld\n, time);i6300esb_test();}else{ printf(Please input time\n); }} 编译失败 [rootlocalhost qemu-2.8.0]# make -j4CHK version_gen.hCC hw/watchdog/wdt_i6300esb.ohw/watchdog/wdt_i6300esb.c:467:13: warning: ‘i6300esb_test’ defined but not used [-Wunused-function]static void i6300esb_test(void)^LINK i386-softmmu/qemu-system-i386LINK x86_64-softmmu/qemu-system-x86_64../qmp.o: In function qmp_daxiatou_watchdog_set_timeout:/home/qemu-2.8.0/qmp.c:741: undefined reference to i6300esb_testcollect2: error: ld returned 1 exit statusmake[1]: *** [qemu-system-i386] Error 1make: *** [subdir-i386-softmmu] Error 2make: *** Waiting for unfinished jobs....../qmp.o: In function qmp_daxiatou_watchdog_set_timeout:/home/qemu-2.8.0/qmp.c:741: undefined reference to i6300esb_testcollect2: error: ld returned 1 exit statusmake[1]: *** [qemu-system-x86_64] Error 1make: *** [subdir-x86_64-softmmu] Error 2 说明这两个c文件无法直接感知对方的存在中间走了很多层现在需要借助qemu自带的接口一级级寻找能够操作到设备的路线 //qmp.cvoid qmp_daxiatou_watchdog_set_timeout(bool has_time, int64_t time, Error **errp){const char *id watchdog0;Error *err NULL;qmp_device_del(id, err);if (has_time){printf(%ld\n, time);//i6300esb_test();}else{ printf(Please input time\n); }} 可以成功调用删除函数但是qmp_device_del内部的语句无法被识别因此只能模仿qmp_device_del函数移动到qdev-monitor.c中定义顺着这条路往下跟 3.2.在qdev中调用pci函数 //qdev-monitor.cvoid qmp_daxiatou_watchdog_set_timeout(bool has_time, int64_t time, Error **errp){const char *id watchdog0;Error *err NULL;DeviceState *dev find_device_state(id, errp);PCIDevice *pci_dev (PCIDevice *)dev;//PCIDeviceClass *pc PCI_DEVICE_GET_CLASS(pci_dev);qdev_daxiatou_watchdog_set_timeout(dev,errp);// qmp_device_del(id, err);if (has_time){printf(%ld\n, time);//i6300esb_test();}else{ printf(Please input time\n); }} //include/hw/qdev-core.hvoid qdev_daxiatou_watchdog_set_timeout(DeviceState *dev, Error **errp); //hw/core/qdev.cvoid qdev_daxiatou_watchdog_set_timeout(DeviceState *dev, Error **errp){PCIDevice *pci_dev (PCIDevice *)dev;DeviceClass *dc DEVICE_GET_CLASS(dev);printf(daxiatou %p\n,dc);pci_daxiatou();} //include/hw/pci/pci.hvoid pci_daxiatou( ); //hw/pci/pci.cvoid pci_daxiatou( ){printf(daxiatou-pci-test\n);} 说明在以上代码块中定义函数qdev可以调用下一步就是要在pci的函数里面调用到具体设备的函数了此处是i6300esb测试效果如下 (qemu) daxiatou-watchdog-set-timeoutdaxiatou 0x558e01bdb090daxiatou-pci-test30 3.3.在pci中调用设备函数 和3.2节中的方式一样直接调用i6300esb_test函数 //hw/pci/pci.c//extern void i6300esb_test(void);如果不添加这个会告警void pci_daxiatou(){printf(daxiatou-pci-test\n);i6300esb_test();} 编译会产生告警这是因为没有在头文件中声明此处没有同名的头文件先暂时忽略告警强行安装运行 [rootlocalhost qemu-2.8.0]# make -j4CHK version_gen.hCC hw/watchdog/wdt_i6300esb.ohw/watchdog/wdt_i6300esb.c:467:6: warning: no previous prototype for ‘i6300esb_test’ [-Wmissing-prototypes]void i6300esb_test(void)^LINK x86_64-softmmu/qemu-system-x86_64LINK i386-softmmu/qemu-system-i386 成功调用到设备源代码中的函数 (qemu) daxiatou-watchdog-set-timeoutdaxiatou 0x55b4dff00090daxiatou-pci-testi6300esb: i6300esb_test: daxiatou-i6300esb30 reference qemu intel i6300esb watchdog虚拟外设分析 ↩︎
http://www.w-s-a.com/news/253135/

相关文章:

  • 网站域名所有权证明引流推广接单
  • 做网站百度百科孟州网站建设
  • 服务网站建设企业广州模板建站系统
  • 怎么做属于自己的免费网站浏览器游戏网址
  • 上海城乡住房建设厅网站西安网站推广慧创科技
  • 做策划网站推广怎么写简历互联网公司手机网站
  • 怎么做宣传网站网站建设采购项目合同书
  • 网站的空间和域名备案做网站要会写什么
  • wap 网站源码企业网站被转做非法用途
  • 下载网站模板怎么使用做物流网站的公司
  • 网站 商城 app 建设建设银行江苏省行网站
  • 广州网站开发建设西安广告公司联系方式
  • 怎么用腾讯云服务器做网站个人网站开发视频
  • 网站建设技术代码坦洲网站建设公司哪家好
  • 阿里云对象存储做静态网站怎样做网站性能优化
  • 怎样做理财投资网站装修平面图用什么软件简单
  • 建手机wap网站大概多少钱苏州网站设计公司有哪些
  • 网站建设需求文件学校网站建设方案及报价
  • 网站开发一般多少钱wordpress打赏赞插件
  • 做中国o2o网站领导唐山网站制作软件
  • 门户网站简介做网站一天能接多少单
  • 论坛类网站建设遵义网站制作外包
  • vps服务器购买网站小视频做网站怎么赚钱
  • 网站用图片wordpress同步发布
  • 织梦图片自适应网站源码网页美工的设计要点
  • 渝快办官方网站wordpress产品图片怎么改
  • 高端网站特色深圳建网站哪
  • 宝塔搭建网站软文小故事200字
  • 公司网站设计免费虚拟主机网站源码
  • 怎样做好网站用户体验申请网站空间