内核模块和用户应用程序使用的库

Library used by kernel module and user application

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

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

对于此类问题是否有很好的示例或一些关键字可以提供帮助?

由于图书馆在本地存储了一些信息,所以不适合将两个目录中的文件都拷贝过来。

提前致谢!


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

UART

UART 文件夹结构:

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"

Makefile

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。所以这是文件夹结构:

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 仍然可以正常工作。

然后我尝试将 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'

问题

是否有可能做我正在尝试的事情?

是吗? -> 你有 link 示例或提示吗?

没有?什么是替代方案?系统调用?似乎不适合我,因为我想从两侧(UART 和应用程序)使用函数指针注册函数。但如果我错了请告诉我。

提前致谢!

我相信你误解了如何使用库。根据描述,我了解到您想要在用户 space 应用程序和内核模块中使用一些 code/algo/data 。据我所知,您不能只创建一个库并在用户内核之间共享它们 space 以调用彼此的功能。

要从内核访问用户space,反之亦然,您可以使用系统调用、ioctl、设备驱动程序read/write等。

对于您的特定应用程序,您可以在驱动程序中注册 ioctl 并使用它们启动从用户到内核的消息传递 space。也可以在driver中注册一个字符驱动,对设备文件进行read/write操作,get/send一点大数据。