精华内容
下载资源
问答
  • DPDK — CLI 指令行模块
    万次阅读
    2020-06-13 22:05:10

    目录

    DPDK CLI

    当我们开发一个 DPDK App 时,可以利用 DPDK 提供的 CLI 工具为程序添加命令行实现。添加一个命令由四部分组成:

    1. 命令行初始化
    2. 命令行解析
    3. 命令行参数的数据结构
    4. 命令行的功能实现函数

    在 /opt/dpdk-18.08/examples/cmdline 中提供了一个完整的 Demo 可以供参考,也可以基于此 EXAMPLE 进行扩展。下述代码均出于该示例。

    初始化命令行

    初始化命令行,其中命令行功能为 cmd_obj_add_parsed,命令行的格式为 tokens:

    cmdline_parse_inst_t cmd_obj_add = {
       
    	.f 
    更多相关内容
  • 定位到cli指令的代码 还是利用ext3-2中的代码,其0x7c00处的指令是cli,利用ph 0x7c00定位到该指令处。然后在vscode中设置断点,单步进入“BX_CPU_CALL_METHOD(i->execute1, (i));”函数中,代码如下。 ...

    前言

            上篇文章我们讲了如何调试bochs的cpu代码,这篇文章我们尝试结合intel手册来一起研究一下其cpu代码的实现。

    定位到cli指令的代码

            还是利用ext3-2中的代码,其0x7c00处的指令是cli,利用ph 0x7c00定位到该指令处。然后在vscode中设置断点,单步进入“BX_CPU_CALL_METHOD(i->execute1, (i));”函数中,代码如下。

    void BX_CPP_AttrRegparmN(1) BX_CPU_C::CLI(bxInstruction_c *i)
    {
      Bit32u IOPL = BX_CPU_THIS_PTR get_IOPL();
    
      if (protected_mode())
      {
    #if BX_CPU_LEVEL >= 5
        if (BX_CPU_THIS_PTR cr4.get_PVI() && (CPL == 3))
        {
          if (IOPL < 3) {
            BX_CPU_THIS_PTR clear_VIF();
            BX_NEXT_INSTR(i);
          }
        }
        else
    #endif
        {
          if (IOPL < CPL) {
            BX_DEBUG(("CLI: IOPL < CPL in protected mode"));
            exception(BX_GP_EXCEPTION, 0);
          }
        }
      }
      else if (v8086_mode())
      {
        if (IOPL != 3) {
    #if BX_CPU_LEVEL >= 5
          if (BX_CPU_THIS_PTR cr4.get_VME()) {
            BX_CPU_THIS_PTR clear_VIF();
            BX_NEXT_INSTR(i);
          }
    #endif
          BX_DEBUG(("CLI: IOPL != 3 in v8086 mode"));
          exception(BX_GP_EXCEPTION, 0);
        }
      }
    
      BX_CPU_THIS_PTR clear_IF();
    
      BX_NEXT_INSTR(i);
    }

     INTEL手册中对cli的说明

            我们该如何阅读cpu代码的呢,我们计划与Intel的CPU手册中对该指令的解释来进行对比。我们先看intel手册中对该指令的描述(https://www.felixcloutier.com/x86/cli

    in most cases, CLI clears the IF flag in the EFLAGS register and no other flags are affected. Clearing the IF flag causes the processor to ignore maskable external interrupts. The IF flag and the CLI and STI instruction have no effect on the generation of exceptions and NMI interrupts.

    Operation is different in two modes defined as follows:

    • PVI mode (protected-mode virtual interrupts): CR0.PE = 1, EFLAGS.VM = 0, CPL = 3, and CR4.PVI = 1;
    • VME mode (virtual-8086 mode extensions): CR0.PE = 1, EFLAGS.VM = 1, and CR4.VME = 1.

    If IOPL < 3 and either VME mode or PVI mode is active, CLI clears the VIF flag in the EFLAGS register, leaving IF unaffected.

            看Intel手册,其CLI指令清除ELFAGS中的IF标志位,其他的标志位不会受映像。清除IF标志位可以让intel忽视可屏蔽中断,而其余的异常和NMI中断不会受影响,操作在保护模式(PVI)与虚拟8086模式(VME)模式下是不同的。

            如果IOPL<3 并且 (VME 或 PVI模式被激活),CLI将清除EFLAGS的cr4.VLF标志位,IF标志位不会受到影响。

    CPU代码解读

            我们来解读其CPU代码,这块比较简洁,同时intel也给出了各种清空,因此综合来看绘制成表格比较清晰。

             因为我们现在是在实模式地址中,其仅仅将IF标志位置为零,之后调用inhibit_interrupts函数来屏蔽可屏蔽中断,其中的很多细节我们暂时还接触不到,之后随着深入学习,我们会逐渐了解其bochs中断的实现原理。

    总结

            这篇文章只是尝试结合intel手册初步分析一下指令,可以看出,bochs的代码还是比较简洁的,通过intel手册中对指令的描述非常容易地来理解代码。

    展开全文
  • 主要介绍了手把手教你如何使用nodejs编写cli命令行,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • Angular-cli 的常用指令

    2020-07-17 11:11:36
    Angular-cli常用的指令 1. 创建模板ng g component模板名称 ng g component test会直接生成在 app文件夹下面,出现test文件夹,包含四个文件分别是以.ts``.html``.css``.spec.ts结尾的文件 也可以指定存放的目录...

    Angular-cli常用的指令

    1. 创建模板ng g component模板名称

    1. ng g component test会直接生成在 app文件夹下面,出现test文件夹,包含四个文件分别是以.ts``.html``.css``.spec.ts结尾的文件
      在这里插入图片描述
    2. 也可以指定存放的目录ng g component views/test,会在app文件夹下面先生成views文件夹,再生成test文件夹,最后就会生成四个文件
      在这里插入图片描述
    展开全文
  • 本文档主要是学习redis cluster的一下学习笔记和想法,通过这篇文章,希望你能了解redis的cluster是处理客户端发来的指令的。

      在前两篇Redis集群架构剖析中,我们创建了一个集群,并且把这个集群由下线状态启动为上线状态。集群上线之后,就表示我们可以向集群的节点发送数据命令了。在开始之前,依旧可以先思考下面的问题:

    • 节点如何找到要处理的数据(这个其实在上一篇有提到)?
    • 如果不是该节点处理的数据,节点会怎么做?

      针对上面的问题,结合前两篇的内容,大致可以猜一下流程可以是,先找到对应的key的槽位在哪?是不是我发送到的节点上面处理的,如果是的话就执行,不是的话可能就转给负责这个槽位的节点。无论是读和写,都需要找到槽位对应的节点。下面具体介绍一下的集群处理指令时的操作

    大体流程

    在这里插入图片描述

      从上图可以看到和我们预想的差不多:

    1. redis-cli向节点发送数据库命令
    2. 收到命令的节点计算建属于哪个槽,然后判断是否在本节点
    3. 如果在本节点,则执行命令
    4. 如果不在本节点,会返回一个MOVED错误给redis-cli,然后客户端会根据MOVED提供的信息转向正确的节点

      举个例子,6370要执行两个指令(槽位我是乱写的):

    127.0.0.1:6370 > GET i
    "200" #在当前节点直接执行
    
    127.0.0.1:6370 > SET new 100
    -> Redirected to slot [15045] located at 127.0.0.1:6371
    OK
    
    127.0.0.1:6371 > GET new
    100
    

      这里面的三个重点:

    • 节点如何计算键对应的槽位
    • 节点如何找到槽位对应的节点
    • MOVED错误是什么?包含什么消息?执行了什么?

    key属于哪个槽

      节点使用下面这个算法来计算键对应的槽位:

    def slot_number(key):
    	return CRC16(key) & 16383
    

      CRC16(key)语句用与计算key的CRC-16校验和,而&16383适用于算出一个介于0 ~ 16383之间的证书作为key的槽位:

    127.0.0.1:6370 > CLUSTER KEYSLOT "Im"
    (integer) 2655
    
    127.0.0.1:6370 > CLUSTER KEYSLOT "best"
    (integer) 10040
    

      KEYSLOT的伪代码如下

    def CLUSTER_KEYSLOT(key):
    	// 计算槽位
    	slot = slot_number(key)
        
       	// 将槽位返回给客户端
        reply_client(slot)
    

    slot属于哪个节点

      当节点计算出key多数的slot之后,节点就会检查自己的clusterState.slots数组中的index i,判断key所在的slot是否由自己负责:

    • 如果clusterState.slots[i]等于clusterState.myself,就表示slot i由当前节点负责,节点可以直接执行客户端发送的命令
    • 如果不是,而是其他的clusterNode,节点会根据指向的clusterNode结构所记录的节点的IP和PORT,向客户端发送MOVED错误,指引客户端转向至正确处理该slot的节点。

      如下图,slot 2655指向的就是myself节点,当前节点直接执行即可。slot 15045是另外的节点,所以需要返回给客户端MOVED错误。

    在这里插入图片描述

    MOVED错误

      当节点发现键所在槽并非由自己负责处理的时候,节点就会向客户端返回一个MOVED错误,指引客户端转向至正在负责该slot的节点。

      下面为MOVED的格式

    # <slot> : key所在slot
    # <ip>:<port> 负责处理slot的节点的IP和PORT
    MOVED <slot> <ip>:<port>
    
    MOVED 15045 127.0.0.1:6371
    

      当客户端接收到节点返回的MOVED的错误时,客户端会根据MOVED错误中的IP和PORT,转向至负责处理改slot的节点,并向该节点重新发送之前想要执行的命令。

      以上面redirect的例子为例:

    127.0.0.1:6370 > SET new 100
    -> Redirected to slot [15045] located at 127.0.0.1:6371
    OK
    

    在这里插入图片描述

      一个集群客户端通常与集群终端额多个几点创建套接字连接,而所谓的节点转向实际上就是换一个套接字来发送命令。

      MOVED错误一般在集群模式下会被隐藏,而是向上面的例子,直接转向到对应的节点。如果想要查看这个错误的话,需要使用单机模式进入,也就是redis-cli的时候不要带-c,那么以上面的例子来说就会返回

    (error) MOVED 15045 127.0.0.1:6371
    

      注意,单机和集群模式下的数据库方面有一个区别是,集群节点只能使用0号数据库,而不是向单机那样0-15


      这篇文档,我们了解了集群是如何处理由客户端发过来的指令的,再结合一下前两篇的数据结构,就会很容易理解。这篇文档的场景是普遍场景,就好比写代码时自己测试一点问题都没有,但是如果节点发生槽转移呢,或者重新分配槽呢?针对这个一个异常行为,我们下节分析。


    系列文章:

    1. 【Redis】Redis集群架构剖析(1):认识cluster
    2. 【Redis】Redis集群架构剖析(2):槽位
    3. 【Redis】Redis集群架构剖析(4):槽位迁移,重新分配
    4. 【Redis】Redis集群架构剖析(5):复制与故障转移
    展开全文
  • redis-cli指令详解

    万次阅读 2019-03-25 10:34:34
    Redis提供了丰富的命令(command)对数据库和各种数据类型进行操作,这些command可以在Linux终端使用。 在编程时,比如使用Redis 的Java语言包,这些命令都有对应的方法。下面将Redis提供的命令做一总结。...
  • freeswitch 常用指令 fs_cli指令

    千次阅读 2018-07-12 21:08:43
     ./fs_cli  4. 退回后台运行   ...  5. 查看sofia状态  sofia status 6. 查看注册信息  sofia status profile internal reg  7. 列出声音设备   pa devlist 8.指定输入、输出端口  pa indev #0...
  • wpa_cli 操作指令的基本使用

    千次阅读 2021-03-22 16:41:41
    wpa_supplicant是配置开发wifi的常用工具,该工具包含wpa_supplicant和wpa_cli 这2个程序。其中wpa_supplicant 程序相当于服务端在后台运行,wpa_cli 相当于客户端。wpa_supplicant 会响应wpa_cli 的请求,从而实现...
  • 昨天下午安装babel出错,一直在... npm install --global babel-cli npm WARN deprecated chokidar@1.7.0: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies. npm WARN depre
  • Vue-Cli的基本安装指令

    2020-09-21 14:50:05
    Vue-Cli的安装指令 一、Vue-Cli是什么? 一个快速搭建vue项目的脚手架,使用它可以快速搭建一个web工程模板。 二、使用步骤 1.安装vue-cli脚手架 安装命令:npm install -g vue-cli 2.新建模块 1.新建一个...
  • wpa_cli 操作指令使用指南

    万次阅读 2018-07-29 22:24:22
    一. Wpa_supplicant 启动脚本:  wpa_supplicant -Dnl80211 -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf -O/data/misc/... wpa_cli是命令行界面下的无线网连接工具,在wpa_supplicant运行的基础上,打开w...
  • 汇编指令CLI/STI

    万次阅读 2016-08-26 09:14:32
    这两个指令只能在内核模式下执行,不可以在用户模式下执行;而且在内核模式下执行时,应该尽可能快的恢复中断,因为CLI会禁用硬件中断,若长时间禁止中断会影响其他动作的执行(如移动鼠标等等),系统就会变得不...
  • vue-cli常用命令

    2021-10-25 14:39:32
    vue-cli常用命令 npm install -g vue-cli 安装vue-cli vue init webpack 项目名 创建项目 npm run build 打包生产 npm install -g serve 安装serve npm run dev / npm start 项目启动 npm install stylus-...
  • 本篇文章主要介绍了vue-cli 自定义指令directive 添加验证滑块示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • vue-cli入门指令

    2021-08-19 18:24:41
    vue-cli入门指令 指令使用,在vue-cli脚手架项目中,搭建项目所使用的指令。 1.创建项目 vue init webpack my-project 运行项目 npm run dev 项目打包 npm run build 在vue-cli中使用axios 先下载包,npm ...
  • Vue-Cli 自定义指令

    千次阅读 2020-08-28 11:41:56
    使用Vue框架开发的同胞们在非常愉快的使用vue内置指令的同时,有时候因为业务的原因,难免想动一动DOM的底层,这时候,vue为我们提供了自定义指令的权利。那么自定义指令,当然得区分时局部定义还是全局定义(比如...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 61,641
精华内容 24,656
关键字:

cli指令