Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 如何编写需要内核源头文件的BitBake驱动程序配方? 介绍_Linux Kernel_Header Files_Yocto_Bitbake_Openembedded - Fatal编程技术网

Linux kernel 如何编写需要内核源头文件的BitBake驱动程序配方? 介绍

Linux kernel 如何编写需要内核源头文件的BitBake驱动程序配方? 介绍,linux-kernel,header-files,yocto,bitbake,openembedded,Linux Kernel,Header Files,Yocto,Bitbake,Openembedded,我在为驱动程序编写的BitBake配方中有一个do\u install任务,其中我执行一个自定义install脚本。任务失败,因为安装脚本在/usr/src/kernel中找不到内核源头文件。此脚本在生成的操作系统上运行良好 发生了什么事 以下是我食谱的相关部分: SRC_URI += "file://${TOPDIR}/example" DEPENDS += " virtual/kernel linux-libc-headers " do_install () { ( cd ${TO

我在为驱动程序编写的BitBake配方中有一个
do\u install
任务,其中我执行一个自定义
install
脚本。任务失败,因为安装脚本在
/usr/src/kernel
中找不到内核源头文件。此脚本在生成的操作系统上运行良好

发生了什么事 以下是我食谱的相关部分:

SRC_URI += "file://${TOPDIR}/example"
DEPENDS += " virtual/kernel linux-libc-headers "
do_install () {  
   ( cd ${TOPDIR}/example/Install ; ./install )
}
以下是
安装
脚本的相关部分:

if[!-d”/usr/src/kernel/include“;然后
回显错误:找不到Linux内核源包含目录。
出口1
fi
cd/usr/src/kernel
写剧本
...
./install_drv pci${drv_ARGS}
我检查了在[!-d”/usr/src/kernel“]时是否更改为
,这也失败了
install
将不同的选项传递给
install\u drv
,我有下面的相关部分:

cd${DRV_PATH}/pci
使无系统=${ARG\u无系统}无安装=${ARG\u无安装}${ARGS\u HWINT}
如果[${ARG_NO_INSTALL}==0];然后
如果[`/sbin/lsmod | grep-ci“uceipci”`-eq 1];然后
卸载/卸载pci
fi
./load_pci DEBUG=${ARG_DEBUG}
fi
${DRV_PATH}/pci
中的
make
目标
build:
基本上是这样的:

make-C/usr/src/kernel SUBDIRS=${PWD}模块
我的研究 我在
linux libc headers.inc
中找到了这些相关的评论:

# You're probably looking here thinking you need to create some new copy
# of linux-libc-headers since you have your own custom kernel. To put 
# this simply, you DO NOT.
#
# Why? These headers are used to build the libc. If you customise the 
# headers you are customising the libc and the libc becomes machine
# specific. Most people do not add custom libc extensions to the kernel
# and have a machine specific libc.
#
# But you have some kernel headers you need for some driver? That is fine
# but get them from STAGING_KERNEL_DIR where the kernel installs itself.
# This will make the package using them machine specific but this is much
# better than having a machine specific C library. This does mean your 
# recipe needs a DEPENDS += "virtual/kernel" but again, that is fine and
# makes total sense.
#
# There can also be a case where your kernel extremely old and you want
# an older libc ABI for that old kernel. The headers installed by this
# recipe should still be a standard mainline kernel, not your own custom 
# one.
我有点不清楚是否可以从
STAGING\u KERNEL\u DIR
正确地“获取”头,因为我没有使用make

meta/classes
目录中提供的
kernel.bbclass
中,有一个变量assign:

# Define where the kernel headers are installed on the target as well as where
# they are staged.
KERNEL_SRC_PATH = "/usr/src/kernel"
该路径随后打包到
.bbclass
文件中,如下所示:

PACKAGES = "kernel kernel-base kernel-vmlinux kernel-image kernel-dev kernel-modules"
...
FILES_kernel-dev = "/boot/System.map* /boot/Module.symvers* /boot/config* ${KERNEL_SRC_PATH} /lib/modules/${KERNEL_VERSION}/build"
更新(1/21): 关于yocto IRC频道的建议是使用以下线路:

do_configure[depends] += "virtual/kernel:do_shared_workdir"
这一点得到了的证实,其中指出,在版本1.8中,有以下更改:

内核构建过程被更改为将源代码放置在公共共享工作区中,并将构建工件单独放置在源代码树中。理论上,已经为内核配方中最常见的用法提供了迁移路径,但这可能并不适用于所有情况。特别是,用户需要确保
${S}
(源文件)和
${B}
(构建工件)在
do\u configure
do\u install
等函数中正确使用。对于不从
kernel yocto
继承或包含
linux yocto.inc
的内核配方,您可能希望参考
meta oe
层中的
linux.inc
文件了解需要进行的更改种类。作为参考,这里是更新
meta oe
linux.inc
文件的提交

依赖内核源代码且不继承模块类的配方可能需要在
do\u shared\u workdir
内核任务上添加显式依赖项,例如:

do_configure[depends] += "virtual/kernel:do_shared_workdir" 
但是我很难把这个应用到我的食谱中。据我所知,我应该能够将上述行更改为:

do_install[depends] += "virtual/kernel:do_shared_workdir"
这意味着现在的
do_install
任务必须在
virtual/kernel
配方的
do_shared_workdir
任务之后运行,这意味着我应该能够使用shared workdir(参见下面的问题3),但我仍然有相同的缺少内核头的问题

我的问题 我使用的是来自的定制linux内核(v3.14)。它继承了
内核
类。以下是我的一些问题:

  • kerneldev
    不应该是继承
    kernel
    类的任何配方的一部分吗?(适用于变量术语表)
  • 如果我将
    virtual/kernel
    添加到
    dependens
    变量中,这是否意味着
    kerneldev
    将被引入
  • 如果
    kerneldev
    是我的配方的依赖项的一部分,我难道不能从我的配方中指向
    /usr/src/kernel
    目录吗?据我所知,我想我应该
  • 如何正确地引用内核源头文件,最好不更改安装脚本

  • 我认为没有人能正确回答最后一个问题。您使用的是非标准安装方法:我们不知道如何与之交互

    也就是说,看看meta/classes/module.bbclass是做什么的。它为make设置了几个相关变量:
    KERNEL\u SRC=${STAGING\u KERNEL\u DIR}
    KERNEL\u PATH=${STAGING\u KERNEL\u DIR}
    O=${STAGING\u KERNEL\u BUILDDIR}
    。也许您的安装程序支持其中一些环境变量,您可以在配方中设置它们?

    考虑您的环境 请记住,在构建时环境中有不同的环境,包括:

    • 系统根
    • 对于内核,一个共享的工作目录
    • 目标包
    kernel dev
    是一个目标软件包,您可以将其安装到目标系统的rootfs中,以实现诸如perf/oprofile之类的评测工具所需的内核符号映射之类的某些功能。它在构建时不存在,尽管它的一些内容在sysroot或共享workdir中可用

    指向正确的目录 您的
    do\u install
    在构建时运行,因此这在构建系统的构建目录结构中,而不是在目标目录结构中。特别是,
    /usr/src/
    将不正确,它需要是构建目录中的某个路径。
    virtual/kernel
    do\u shared\u workdir
    任务将填充
    ${STAGING\u DIR\u kernel}
    ,因此您希望在脚本中更改到该目录

    添加任务依赖项 委员会:

    类似于依赖项的内容对于您的用例来说是正确的,假设
    do\u configure
    do\u compile中没有任何内容
    
    do_install[depends] += "virtual/kernel:do_shared_workdir