- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
阅读后man bpf
以及其他一些文档来源,我的印象是 map
只能由用户进程创建。然而下面这个小程序似乎神奇地创造了bpf
map :
struct bpf_map_def SEC("maps") my_map = {
.type = BPF_MAP_TYPE_ARRAY,
.key_size = sizeof(u32),
.value_size = sizeof(long),
.max_entries = 10,
};
SEC("sockops")
int my_prog(struct bpf_sock_ops *skops)
{
u32 key = 1;
long *value;
...
value = bpf_map_lookup_elem(&my_map, &key);
...
return 1;
}
tools/bpf/bpftool
加载程序并验证程序是否已加载:
$ bpftool prog show
1: sock_ops name my_prog tag f3a3583cdd82ae8d
loaded_at Jan 02/18:46 uid 0
xlated 728B not jited memlock 4096B
$ bpftool map show
1: array name my_map flags 0x0
key 4B value 8B max_entries 10 memlock 4096B
bpf_map_lookup_elem
从程序结果不会创建 map 。
strace
调试了它并发现在这两种情况下,即
bpf_map_lookup_elem
没有它,bpftool 会调用
bpf(BPF_MAP_CREATE, ...)
它显然成功了。然后,如果 bpf_map_lookup_elem 被遗漏,我会跟踪
bpftool map show
, 和
bpf(BPF_MAP_GET_NEXT_ID, ..)
立即返回
ENOENT
,它永远不会转储 map 。所以显然有些东西没有完成 map 创建。
最佳答案
正如 antiduh 所解释的,并与您的 strace
确认支票,bpftool
是在这种情况下创建 map 的用户空间程序。它调用函数 bpf_prog_load()
来自 libbpf(在 tools/lib/bpf/
下),最终执行系统调用。然后将程序固定在所需位置(在 bpf
虚拟文件系统挂载点下),以便在 bpftool 返回时不会卸载它。 map 没有固定。
关于 map 创建,魔术位也发生在 libbpf 中。当bpf_prog_load()
被调用时,libbpf 接收目标文件的名称作为参数。 bpftool
不要求加载此特定程序或特定 map ;相反,它提供目标文件,而 libbpf 必须处理它。所以libbpf中的函数解析这个ELF目标文件,最终找到对应maps和programs的多个section。然后它尝试加载第一个程序。
加载这个程序包括以下步骤:
CHECK_ERR(bpf_object__create_maps(obj), err, out);
CHECK_ERR(bpf_object__relocate(obj), err, out);
CHECK_ERR(bpf_object__load_progs(obj), err, out);
bpf_map_lookup_elem()
, map 是用
bpf(BPF_MAP_CREATE, ...)
创建的系统调用。之后,发生重定位,如果需要,程序指令将调整为指向新创建的 map 。然后一旦完成所有步骤并加载程序,
bpftool
退出。 eBPF 程序应该被固定,并且仍然加载到内核中。据我所知,如果它确实使用了映射(如果使用了
bpf_map_lookup_elem()
),那么映射仍然被加载的程序引用,并保存在内核中。另一方面,如果程序不使用这些映射,那么就没有什么可以阻止它们了,所以当
bpftool
持有的文件描述符时,这些映射就会被销毁。关闭,当
bpftool
返回。
bpftool
完成后,如果程序使用它,您将在内核中加载一个 map ,但如果没有程序依赖它,则没有 map 。在我看来,这听起来像是预期的行为;但是如果您在
bpftool
遇到奇怪的事情,请以一种或另一种方式执行 ping 操作。 ,我是该实用程序的工作人员之一。最后一个通用观察:映射也可以固定并保留在内核中,即使没有程序使用它们,如果需要保留它们。
关于linux-kernel - 谁在 BPF 中创建 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48067163/
我需要从 kernel/system/do_kill.c (Minix) 将一些信息写入我的特殊日志文件(例如,/home/log.txt) . 我已经尝试过: int filedesc; filed
我正在经历 Uboot 和内核启动过程。 FDT(平面设备树)到底有什么用? 我读过的许多链接都指出,uboot 以 FDT 的形式将板和 SOC 配置信息传递给内核 https://wiki.fre
我的操作系统是Fedora 17。最近,出现内核污染警告“kernel bug at kernel/auditsc.c:1772!-abrt”:不应报告此问题(这可能是一个已知问题)。发生内核问题,但
为 Linux 编译内核模块的教程,使用不同的 Makefile 语法。 Example 1 obj-m += rpi-pwm.o Example 2 obj-m := nothing.o 有什么区别
我正在浏览 Linux 网络设备驱动程序代码,想知道是否可以从驱动程序代码中调用设备层代码。 --- a/drivers/net/ethernet/realtek/8139too.c +++ b/dr
出于工具目的,我尝试附加到 kprobe 事件,但我对 kprobe 事件不太熟悉。我读到注册的 kprobes 列表可以在 /sys/kernel/debug/kprobes/list 中找到,但是
我在其他地方使用 LinK+ 来开发 linux 内核模块。我的开发机器安装了 Linux Mint 18 操作系统,内核版本为 4.4.xx。为了进行测试,我想将内核模块部署到内核版本为 3.16.
我正在玩弄 Android Linux 内核。内核是P970 V30B内核。可用here .我想找出特定的 cmdline 参数到底做了什么。 我知道它是命令行参数,其中有一个参数我找不到它到底做了什
是否可以将 PTE 指向不同的物理页面? 假设我目前在某个进程 A 的上下文中处于内核模式,该进程当前将地址 400k 映射到物理页号。 5. 我可以将该地址 (400k) 映射到物理页号吗? 6 ?
我正在开发一个要在路由器上运行的内核模块。路由器型号为 Netgear 的 DGN2200v2。它在 MIPS 上运行 Linux 2.6.30。我的问题是,当我加载我的模块时,似乎我的 module
关闭。这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。 想改进这个问题?更新问题,使其成为 Stack Overflow 的 on-topic。 6年前关闭。
在大型网格中执行的任务调用两个内核有区别吗 1. for(int i=0;i>>(MatrixA,MatrixB) } 2. dim3 dimBlock(16, 16); dim3 dimGrid(1
在 Linux 中,我生成了一个猜测 VM 并加载了另一个 Linux 实例。 VM 是通过 KVM/libvirt/qemu 生成的。 guest VM 被主机内核视为一个进程。让我们说由于某种原因
我想知道如何设置正确 MACH_TYPE或 arch_id对于内核。我搜索并找到了至少 2 个引用,其中内核会卡在“启动内核...”处。这些都给出了相同的答案。正确设置您的机器类型。但后来都没有提到如
kernel data inpage error蓝屏是一个不常见的问题,一般都是更新失败或者第三方软件冲突导致的,解决方法也非常简单,需要先安全模式进入系统,下面来看看详细的教程吧。 kern
当我用 app/console cache:clear 清除缓存时我收到错误: [Symfony\Component\DependencyInjection\Exception\ParameterNo
我正在玩 Raspberry 3,并尝试使用 U-Boot 启动 Linux 内核。 我构建了一个 Linux 内核(来自 github.com/raspberrypi)和 Busbox-Userla
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
长话短说,我一直在做一个项目,当我使用时我注意到: 1.9.3p392 :001 > `gzip` IRB::Abort: abort then interrupt! from (irb):1
我有一个服务,我在其中注入(inject) TokenStorage 并想要获取当前用户。 /** * * @Service("liip_theme.theme_request_listener"
我是一名优秀的程序员,十分优秀!