玄武内核模块快速上手指南

安装虚拟机

可选 VirtualboxVMWare

在虚拟机中安装Linux

  • 只要满足内核版本范围在3.0.x ~ 5.4.x的Linux发行版都可以运行玄武内核模块,例如:
  • 本文提供一个配置好的Lubuntu-20.04的虚拟机文件,可以使用Virtualbox导入:
    • 百度网盘
    • 提取码:53ud
    • 虚拟机用户名:xwos
    • 虚拟机密码:xwos

在虚拟机中安装编译工具

emacs

  • 用途:执行elisp脚本
  • 安装方法
sudo apt-add-repository ppa:kelleyk/emacs
sudo apt-get update
sudo apt install emacs27

bash

  • 用途:执行shell脚本
  • 安装方法
sudo dpkg-reconfigure dash # 选择“否”

build-essential

  • 用途:这是一个虚包,此包会通过依赖将相关的一系列工具(make, gcc, …) 全部安装到系统。
  • 安装方法
sudo apt install build-essential

在虚拟机中运行玄武内核模块

假定工作目录为 /wkspc

下载源码

cd /wkspc
git clone https://gitee.com/starsoul/XuanWuKO.git

编译

cd /wkspc/XuanWuKO/xwbd/pc
make

img

运行

安装模块

cd /wkspc/XuanWuKO/xwbd/pc
sudo insmod wkspc/xwos.ko

查看玄武模块的输出

dmesg

img

卸载模块

sudo rmmod xwos.ko

增加"Hi XuanWuOS"演示工程

建立hixwos模块

在xwam/example/目录下建立文件夹hixwos/,其中包含一个C源文件xwmo.c, 一个C头文件xwmo.h,和一个makefile文件xwmo.mk:

img

xwmo.c

#include <xwos/standard.h>
#include <xwos/lib/xwlog.h>
#include <xwos/osal/scheduler.h>
#include <xwos/osal/thread.h>
#include <xwos/osal/sync/semaphore.h>

#define HIXWOS_PRODUCER_PRIORITY \
        XWOSAL_SD_PRIORITY_DROP(XWOSAL_SD_PRIORITY_RT_MAX, 20) /* 生产者线程优先级*/
#define HIXWOS_CONSUMER_PRIORITY \
        XWOSAL_SD_PRIORITY_DROP(XWOSAL_SD_PRIORITY_RT_MAX, 20) /* 消费者线程优先级*/

struct xwosal_smr hixwos_smr; /**< 信号量 */
xwid_t hixwos_producer_thrd_tid; /**< 生产者线程id */
xwid_t hixwos_consumer_thrd_tid; /**< 消费者线程id */

/**
 * @brief 日志输出函数
 */
#define hixwoslogf(lv, fmt, ...)  xwlogf(lv, "hixwos", fmt, ##__VA_ARGS__)

/**
 * @brief 生产者线程
 */
xwer_t hixwos_producer_thrd(void * arg)
{
        xwid_t smrid = (xwid_t)arg;
        xwtm_t time;
        xwsq_t i;

        hixwoslogf(INFO, "Hi, XuanWuOS! I'am producer.\n");
        for (i = 0; i < 3; i++) { /* 循环3次 */
                time = 1 * XWTM_S;
                xwosal_cthrd_sleep(&time); /* 睡眠1s钟 */
                hixwoslogf(INFO, "Producer: Post once, ID:%d\n", i);
                xwosal_smr_post(smrid); /* 发送信号量 */
        }
        hixwoslogf(INFO, "Producer exit.\n");
        return XWOK;
}

/**
 * @brief 消费者线程
 */
xwer_t hixwos_consumer_thrd(void * arg)
{
        xwid_t smrid = (xwid_t)arg;
        xwer_t rc;
        xwsq_t i;

        hixwoslogf(INFO, "Hi, XuanWuOS! I'am consumer.\n");
        for (i = 0; i < 3; i++) { /* 循环3次 */
                rc = xwosal_smr_wait(smrid); /* 等待信号量 */
                if (XWOK == rc) {
                        hixwoslogf(INFO, "Consumer: Got! ID:%d\n", i);
                }
        }
        hixwoslogf(INFO, "Consumer exit.\n");
        return XWOK;
}

xwer_t hixwos_start(void)
{
        xwer_t rc;
        xwer_t trc;
        xwid_t smrid;

        /* 初始化信号量 */
        rc = xwosal_smr_init(&hixwos_smr, 0, XWSSQ_MAX);
        if (rc < 0) {
                hixwoslogf(ERR,
                           "Failed to hixwos_smr ... [rc:%d]\n",
                           rc);
                goto err_init_hixwos_smr;
        }
        smrid = xwosal_smr_get_id(&hixwos_smr);

        /* 建立生产者线程 */
        rc = xwosal_thrd_create(&hixwos_producer_thrd_tid,
                                "hixwos_producer_thrd",
                                hixwos_producer_thrd,
                                (void *)smrid, XWOS_UNUSED_ARGUMENT,
                                HIXWOS_PRODUCER_PRIORITY,
                                XWOS_UNUSED_ARGUMENT);
        if (rc < 0) {
                hixwoslogf(ERR,
                           "Create hixwos_producer_thrd ... [FAILED]! rc:%d\n",
                           rc);
                goto err_create_hixwos_producer_thrd;
        }

        /* 建立消费者线程 */
        rc = xwosal_thrd_create(&hixwos_consumer_thrd_tid,
                                "hixwos_consumer_thrd",
                                hixwos_consumer_thrd,
                                (void *)smrid, XWOS_UNUSED_ARGUMENT,
                                HIXWOS_CONSUMER_PRIORITY,
                                XWOS_UNUSED_ARGUMENT);
        if (rc < 0) {
                hixwoslogf(ERR,
                           "Create hixwos_consumer_thrd ... [FAILED]! rc:%d\n",
                           rc);
                goto err_create_hixwos_consumer_thrd;
        }

        return XWOK;

err_create_hixwos_consumer_thrd:
        xwosal_thrd_terminate(hixwos_producer_thrd_tid, &trc);
        xwosal_thrd_delete(hixwos_producer_thrd_tid);
err_create_hixwos_producer_thrd:
        xwosal_smr_destroy(&hixwos_smr);
err_init_hixwos_smr:
        return rc;
}

void hixwos_stop(void)
{
        xwer_t trc;

        /* 销毁消费者线程 */
        xwosal_thrd_terminate(hixwos_consumer_thrd_tid, &trc);
        xwosal_thrd_delete(hixwos_consumer_thrd_tid);

        /* 销毁生产者线程 */
        xwosal_thrd_terminate(hixwos_producer_thrd_tid, &trc);
        xwosal_thrd_delete(hixwos_producer_thrd_tid);

        /* 销毁信号量 */
        xwosal_smr_destroy(&hixwos_smr);
}

xwer_t hixwos_init(void)
{
        return hixwos_start();
}

void hixwos_exit(void)
{
        hixwos_stop();
}

xwmo.h

#ifndef __xwam_example_hixwos_xwmo_h__
#define __xwam_example_hixwos_xwmo_h__

#include <xwos/standard.h>

xwer_t hixwos_init(void);
void hixwos_exit(void);

#endif /* xwam/example/hixwos/xwmo.h */

xwmo.mk

XWMO_INCDIRS :=
XWMO_ESRCS :=
XWMO_CSRCS += xwmo.c

增加对hixwos模块的引用

增加编译开关

在xwbd/pc/cfg/xwam.h中增加:

#define XWAMCFG_example_hixwos      1

在初始化流程中调用hixwos模块的init函数

在xwbd/pc/bdl/board.c中增加

xwer_t board_example_init(void)
{
        xwer_t rc;

        rc = XWOK;
#if defined(XWAMCFG_example_hixwos) && (1 == XWAMCFG_example_hixwos)
        rc = hixwos_init();
        if (rc < 0) {
                xwbdlogf(ERR, "Init example hixwos ... [FAILED], rc:%d\n",
                         rc);
                goto err_hixwos_init;
        }
        xwbdlogf(INFO, "Init example hixwos ... [OK]\n");
#endif /* XWAMCFG_example_hixwos */

        return XWOK;

#if defined(XWAMCFG_example_hixwos) && (1 == XWAMCFG_example_hixwos)
err_hixwos_init:
#endif /* XWAMCFG_example_hixwos */
        return rc;
}

xwer_t board_example_exit(void)
{
#if defined(XWAMCFG_example_hixwos) && (1 == XWAMCFG_example_hixwos)
        hixwos_exit();
#endif /* XWAMCFG_example_hixwos */
}

运行

安装模块

cd /wkspc/XuanWuKO/xwbd/pc
sudo insmod wkspc/xwos.ko

查看玄武模块的输出

dmesg

此演示模块中创建了两个线程,Producer线程与Consumer线程,从log中可以看到 两个线程通过信号量进行同步,3秒钟后纷纷退出。

img