内核模块和用户应用程序

时间:2017-09-04 14:59:15

标签: c linux linux-kernel kernel-module yocto

我正在使用yocto并尝试在内核模块和用户应用程序中使用库。

  • 内核模块处理UART接口
  • (用C编写)定义了一个高级协议。因此,它提供了几个函数(例如中断回调)和一个包含所有类型信息的静态结构(配置,接收和发送的消息,......)
  • 应在命令行中调用用户应用程序,如:app param1 param2 ...

最好的方法是什么?我的内核模块和我的用户应用程序正在运行,但每次我尝试实现共享库时,它都会变得非常混乱,我会收到错误(主要是因为包含文件)。

是否有一个很好的例子可以解决这样的问题或一些可能有用的关键字?

因为库在本地存储了一些信息,所以不适合复制两个目录中的文件。

提前致谢!

所以,这是更详细的情况:

UART

UART文件夹结构:

  • / recipes-myrecipes
    • / uart
      • uart_1.0.bb
      • / uart-1.0
        • 生成文件
        • / src / altera_uart.c
        • / inc / altera_uart.h

uart_1.0.bb

LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-                
2.0;md5=801f80980d171dd6425610833a22dbe6"

inherit module


SRC_URI = " \
       file://inc/altera_uart.h \
       file://src/altera_uart.c \
           file://Makefile \
          "
S = "${WORKDIR}"

COMPATIBLE_MACHINE = "cyclone5"

生成文件

obj-m:= uart.o

uart-objs := ./src/altera_uart.o

SRC := $(shell pwd)

all:
    $(MAKE) -C $(KERNEL_SRC) M=$(SRC)

modules_install:
    $(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install

clean:
    rm -f *.o *~ core .depend .*.cmd *.ko *.mod.c
    rm -f Module.markers Module.symvers modules.order
    rm -rf .tmp_versions Modules.symvers

bitbake uart无错误地工作。

用户申请

我的应用程序名为tbdriver。所以这是文件夹结构:

  • / recipes-myrecipes
    • tbdriver_1.0.bb
    • / tbdriver-1.0
      • tbdriver.c
      • tbdriver.h

tbdriver_1.0.bb

LICENSE = "CLOSED"

SRC_URI = " \
       file://tbdriver.c \
          "

S = "${WORKDIR}" 

do_compile() {
        ${CC} ${CFLAGS} ${LDFLAGS} ${WORKDIR}/tbdriver.c -o tbdriver
}

do_install() {
  install -d ${D}${bindir} 
  install -m 0755 tbdriver ${D}${bindir} 
} 

bitbake tbdriver无错误地工作。

我尝试了什么

因此,我将库(debug_protocol)添加到内核模块文件夹,将它们添加到Makefile和.bb中。因此,bitbake uart仍可正常运行。

  • / recipes-myrecipes
    • / uart
      • uart_1.0.bb
      • / uart-1.0
        • 生成文件
        • / src
          • altera_uart.c
          • debug_protocol.c
        • / inc
          • altera_uart.h
          • debug_protocol.h

然后我尝试将debug_protocol.h添加到tbdriver以便也可以访问它的函数。 (顺便说一句,我尝试了很多不同的版本)

tbdriver_1.0.bb

...
SRC_URI = " \
       file://../../uart/uart-1.0/src/debug_protocol.h \
       file://../../uart/uart-1.0/src/debug_protocol.c \
       file://tbdriver.c \
          "
...

错误

WARNING: tbdriver-1.0-r0 do_fetch: Failed to fetch URL file://../../uart/uart-1.0/src/debug_protocol.h, attempting MIRRORS if available
ERROR: tbdriver-1.0-r0 do_fetch: Fetcher failure: Unable to find file file://../../uart/uart-1.0/src/debug_protocol.h anywhere. The paths that were searched were:
   ../meta-ines/recipes-myrecipes/tbdriver/tbdriver-1.0/poky
    ../meta-ines/recipes-myrecipes/tbdriver/tbdriver/poky
    ../meta-ines/recipes-myrecipes/tbdriver/files/poky
    ../meta-ines/recipes-myrecipes/tbdriver/tbdriver-1.0/cyclone5
    ../meta-ines/recipes-myrecipes/tbdriver/tbdriver/cyclone5
   ../meta-ines/recipes-myrecipes/tbdriver/files/cyclone5
    ../meta-ines/recipes-myrecipes/tbdriver/tbdriver-1.0/armv7a
    ../meta-ines/recipes-myrecipes/tbdriver/tbdriver/armv7a
    ../meta-ines/recipes-myrecipes/tbdriver/files/armv7a
    ../meta-ines/recipes-myrecipes/tbdriver/tbdriver-1.0/arm
     ../meta-ines/recipes-myrecipes/tbdriver/tbdriver/arm
     ../meta-ines/recipes-myrecipes/tbdriver/files/arm
    ../meta-ines/recipes-myrecipes/tbdriver/tbdriver-1.0/
     ../meta-ines/recipes-myrecipes/tbdriver/tbdriver/
    ../meta-ines/recipes-myrecipes/tbdriver/files/
    .../yocto/build/downloads
ERROR: tbdriver-1.0-r0 do_fetch: Fetcher failure for URL: 'file://../../uart/uart-1.0/src/debug_protocol.h'. Unable to fetch URL from any source.
ERROR: tbdriver-1.0-r0 do_fetch: Function failed: base_do_fetch
ERROR: Logfile of failure stored in: ../yocto/build/tmp/work/armv7a-neon-poky-linux-gnueabi/tbdriver/1.0-r0/temp/log.do_fetch.7039
ERROR: Task (/../meta-ines/recipes-myrecipes/tbdriver/tbdriver_1.0.bb:do_fetch) failed with exit code '1'

问题

甚至可以做我正在尝试的事情吗?

是? - >你有一个示例或提示的链接吗?

没有?会有什么选择?系统调用?似乎不适合我,因为我想用两侧的功能指针(UART和App)注册函数。但如果我错了,请告诉我。

提前致谢!

1 个答案:

答案 0 :(得分:0)

我相信你误解了如何使用库。从描述中我了解到,您希望在用户空间应用程序和内核模块中使用一些代码/算法/数据。 AFAIK你不能只创建一个库并在用户内核空间之间共享它们以相互调用它们的功能。

要从内核访问用户空间,反之亦然,您可以使用syscall,ioctl,设备驱动程序读/写等。 enter image description here

对于您的特定应用程序,您可以在驱动程序中注册ioctl并使用它们来启动从用户到内核空间的消息传递。您还可以在驱动程序中注册字符驱动程序并对设备文件执行读/写操作以获取/发送一些大数据。