我知道如果我想编译我自己的 Linux 内核,我需要 Linux 内核头文件,但它们到底有什么用?
我发现下面/usr/src/似乎有几十个 C 头文件。但是它们的目的是什么,它们不是直接包含在内核源代码中吗?
unistd.h中的uni是什么意思
是unix的意思吗?还是通用的?
它是什么?
嗯,显然有区别,但我很好奇为什么有些东西在 /usr/include/sys 下而其他东西在 /usr/include/linux 下,并且具有相同的头文件名?这与 POSIX vx non-POSIX 有关系吗?
此外,我已经通过获取内核头文件包设法在我的 Fedora 系统上使用头文件填充 /usr/include/linux,是否有一个标准的包名称让我获取位于 /usr/include/sys 下的头文件? 我一直无法找到它。
根据客户要求,我使用默认内核安装了 CentOS 5.6。安装此内核后,time.h 文件包含#define CLOCK_MONOTONIC.
现在,实时内核与 kernel-devel 一起安装,我们的代码希望使用CLOCK_MONOTONIC_RAW. 它确实作为内核头文件的一部分存在,但是当我编译我们的代码时,它在标准用户空间包含中找不到它。
我的问题是,time.h使用实时内核包含/替换默认情况下找到的正确程序是什么?从我的研究来看,符号链接看起来很糟糕,那么应该如何处理呢?程序或过程是什么?升级到 CentOS 6.0 或 5.7 不是每个客户要求的选项。
问题的简短版本:
其中C头包含宏对应于该系统的机器体系结构(例如,__x86_64__,__ia64__,__mips__?)
更长版本的问题:
我想在运行 Linux 的基于Tilera的系统上运行神经节监控工具。
Ganglia 目前不支持 Tilera。为了让它工作,我需要修改一个名为machine_type_func的 C 函数,它返回机器架构。这个函数的主体是在编译时确定的,它看起来像这样:
g_val_t
machine_type_func ( void )
{
g_val_t val;
#ifdef __i386__
snprintf(val.str, MAX_G_STRING_SIZE, "x86");
#endif
#ifdef __x86_64__
snprintf(val.str, MAX_G_STRING_SIZE, "x86_64");
#endif
...
return val;
}
Run Code Online (Sandbox Code Playgroud)
我需要为 Tilera 添加适当的行,但我不知道指定基于 Tilera 的系统的宏的名称。我猜这个宏是在标准 Linux 头文件之一中定义的,但我不知道要查看哪个。
我在 Linux 2.6.32-26-generic
当我查看“ioctl.h”听者文件的 linux 源代码时,我可以看到许多变体。(对于不同的平台,我猜)。IE
./fs/ocfs2/ioctl.h
./fs/btrfs/ioctl.h
./fs/ceph/ioctl.h
./include/config/i2o/config/old/ioctl.h
./include/asm-generic/ioctl.h
./include/linux/hdlc/ioctl.h
./include/linux/ioctl.h
./drivers/video/via/ioctl.h
./drivers/staging/vt6655/ioctl.h
./drivers/staging/vt6656/ioctl.h
./arch/ia64/include/asm/ioctl.h
./arch/h8300/include/asm/ioctl.h
./arch/microblaze/include/asm/ioctl.h
./arch/score/include/asm/ioctl.h
./arch/avr32/include/asm/ioctl.h
./arch/alpha/include/asm/ioctl.h
./arch/x86/include/asm/ioctl.h
./arch/m32r/include/asm/ioctl.h
./arch/mn10300/include/asm/ioctl.h
./arch/sparc/include/asm/ioctl.h
./arch/powerpc/include/asm/ioctl.h
./arch/m68k/include/asm/ioctl.h
./arch/sh/include/asm/ioctl.h
./arch/xtensa/include/asm/ioctl.h
./arch/mips/include/asm/ioctl.h
./arch/s390/include/asm/ioctl.h
./arch/arm/include/asm/ioctl.h
./arch/blackfin/include/asm/ioctl.h
./arch/frv/include/asm/ioctl.h
./arch/parisc/include/asm/ioctl.h
./arch/cris/include/asm/ioctl.h
Run Code Online (Sandbox Code Playgroud)
但我看到该文件被包含为 #include <sys/ioctl.h>
这个映射是如何工作的?
从联机帮助页man limits.h:
{WORD_BIT}\n Number of bits in an object of type int.\n Minimum Acceptable Value: 32\nRun Code Online (Sandbox Code Playgroud)\n但是,如果我运行一个简单的程序:
\n#include <limits.h>\n#include <stdio.h>\n\nint main() {\n printf("%d\\n", WORD_BIT);\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n然而,当尝试使用 gcc ( gcc file.c -o file) 进行编译时,我得到以下信息:
error: \xe2\x80\x98WORD_BIT\xe2\x80\x99 undeclared (first use in this function)\nRun Code Online (Sandbox Code Playgroud)\n为什么我的系统上没有定义这个信息,我还能在哪里找到这个信息(在 C 程序中)?
\n我的系统:
\n我正在调试一个闭源软件安装程序,它似乎对我的发行版有一些先入为主的概念。未找到 后安装中止apt-get。它尝试运行的命令是:
apt-get -y -q install linux-headers-3.7.5-1-ARCH
Run Code Online (Sandbox Code Playgroud)
我想“包名称”来自/usr/src,唯一的条目是linux-3.7.5-1-ARCH. 有没有人对我应该用 pacman 安装哪个软件包有任何有根据的猜测?
头文件可能会用于编译自定义硬件的驱动程序。
以下是安装日志中的一些相关文本:
注意:Linux 驱动程序必须针对您的 Linux 操作系统当前运行的内核的内核源构建。此脚本为您自动执行此任务。
注意:您必须安装 Linux OS 内核头源文件。如果您计划运行 Jungo 调试监视器,那么您可能还需要安装“compat-libstdc++”和“libpng3”。
您的 Linux 当前正在运行以下内核版本:
3.7.5-1-ARCH
我正在使用 Tiny Core Linux 并尝试安装 Vmware Tools,这当然需要内核头文件 :-)。
看起来他们没有在包中随时可用的内核头文件,但他们确实有内核源代码。因此,我下载了该源代码,并尝试从中创建标题,但我不知道自己在做什么。
在我遇到的谷歌搜索中,它听起来像:
make headers_install
Run Code Online (Sandbox Code Playgroud)
可能会做我需要它做的事情,这实际上是一个正确的 make 目标,但它会出现以下错误:
tc@box:/usr/src/linux-3.16.6$ make headers_install
CHK include/generated/uapi/linux/version.h
HOSTCC arch/x86/tools/relocs_32.o
In file included from arch/x86/tools/relocs_32.c:1:0:
arch/x86/tools/relocs.h:17:32: fatal error: tools/le_byteshift.h: No such file or directory
#include <tools/le_byteshift.h>
^
compilation terminated.
scripts/Makefile.host:134: recipe for target 'arch/x86/tools/relocs_32.o' failed
make[1]: *** [arch/x86/tools/relocs_32.o] Error 1
arch/x86/Makefile:181: recipe for target 'archscripts' failed
make: *** [archscripts] Error 2
Run Code Online (Sandbox Code Playgroud)
我在这里是在正确的轨道上,我只是缺少依赖项或其他东西,还是我完全在错误的轨道上?
有人可以给我有关下一步如何进行的任何指示吗?看起来“tools/le_byteshift.h”不知何故丢失了,但我不确定从哪里开始隔离哪个包才能使其正常工作。
如何从源代码制作内核头文件?任何指针都非常感谢!
关于如何在 Stack\xc2\xa0Exchange 上为 LUKS 加密磁盘设置 \xe2\x80\xafup 分离标头\n的信息分散。\xc2\xa0\n通过使用 Google 搜索网络,我发现了有限的信息。\ xc2\xa0\n我发现的一些最好的信息\nis链接到问题的底部。\xc2\xa0\n其中一些很有帮助,甚至对像我这样的\xc2\xa0新手也很有帮助。\xc2\xa0\n但是有些似乎不完整,因此我有动力写这个。\xc2\xa0\n请看看你是否可以帮助解决下面的问题,\n使其完整并正常工作。
\n我假设读者曾经lsblk发现应分离的标头驱动器是sdb,并存储在其他驱动器上sda。
方法一:将header制作成分区
\n找出标头的大小,并将分区设置为正确的大小。\xc2\xa0\n\xc2\xa0以下命令将为您提供大量信息。\xc2\xa0\n记下下面旁边的offset数字Data\xc2\xa0segments:
$ cryptsetup luksDump /dev/sdb\n...\nData segments:\n 0: crypt\n offset: 16777216 [bytes]\n length: (whole device)\n cipher: aes-xts-plain64\n sector: 512 [bytes]\n...\nRun Code Online (Sandbox Code Playgroud)\n执行fdisk(如果没有则安装)\n与$\xc2\xa0fdisk\xc2\xa0/dev/sda.
给它命令n并按 Enter。\xc2\xa0\n使用默认分区号创建一个主分区;假设它是X。\xc2\xa0\n选择并记下默认第一个扇区的值\n(假设它是数字M)。\xc2\xa0\n它将提示您输入最后一个扇区;我们称之为K。\xc2\xa0\n要\xc2\xa0找到一个合适的数字K进入(并假设一个扇区的大小为 512\xe2\x80\xafbytes),计算K \xe2\x80\ xaf=\xe2\x80\xaf M \xe2\x80\xaf+\xe2\x80\xaf偏移量/512; 其中offsetluksDump是您在上面使用 .\xc2\xa0 \n命令找到的数字cryptsetup …
header-file ×10
linux ×6
linux-kernel ×4
c ×2
compiling ×2
arch-linux ×1
centos ×1
crypttab ×1
debian ×1
fedora ×1
filenames ×1
luks ×1
posix ×1
terminology ×1
unix ×1