samples/bpf/pare_simple.c我通过非常简单的更改(来自 Linux 内核树)编译了 BPF 示例:
SEC("simple")
int handle_ingress(struct __sk_buff *skb)
{
return TC_ACT_SHOT;
}
Run Code Online (Sandbox Code Playgroud)
所以我希望丢弃任何数据包。我安装它如下:
这种情况发生在 Ubuntu 16.04.3 LTS 上,内核为 4.4.0-98,从软件包安装了 llvm 和 clang 版本 3.8,iproute2 是来自 github 的最新版本。
$ tc qdisc add dev eth0 clsact
$ tc filter add dev eth0 ingress bpf \
object-file ./net-next.git/samples/bpf/parse_simple.o \
section simple verbose
Prog section 'simple' loaded (5)!
- Type: 3
- Instructions: 2 (0 over limit)
- License: GPL
Verifier analysis:
0: (b7) r0 = 2
1: (95) exit
processed …Run Code Online (Sandbox Code Playgroud) 在运行一些示例时,samples/bpf我注意到bpf_printk输出带有一些额外的信息,例如:
telnet-470 [001] .N.. 419421.045894: 0x00000001: BPF command: 2
Run Code Online (Sandbox Code Playgroud)
BPF command: 2实际的字符串是传递给bpf_printkbpf 程序的,但其余的是什么?我假设这来自内核的 JIT ?
我在哪里可以仔细查看这些位的含义?谢谢。
我在Linux上编写了一个相当大的PCIe驱动程序,现在我需要在FreeBSD上移植它.我还不知道BSD版本,但我认为在这一点上它是无关紧要的,因为我想了解一般在移植过程中需要修改哪些主要项目.
好处是驱动程序被分区为独立于操作系统的"库"层(OSI)和操作系统,因此它已经有一个"框架"允许将其移植到其他操作系统上,我希望大部分工作都是专注于OSI方面.到目前为止,我看到了以下大块工作:
我还应该注意什么?此驱动程序是一个进行硬件加密的设备,因此它是卸载设备(来自NIC的入口数据包正常进入系统,然后转移到设备).
如果有有用的Web链接来描述BSD驱动程序开发/移植(类似于LDD),我很乐意接受它:)
OpenSolaris/OpenIndiana中的'wheel'组相当于什么?我曾经在轮组中添加一个用户并允许该组通过sudo执行命令而无需密码询问.我想在OpenSolaris/Indiana中做同样的事情.
我看到'staff'组在OpenSolaris中具有相同的gid,例如Linux中的轮子(Fedora或CentOS).
我已经定义了以下内容.gitignore:
/aclocal.m4
/config.guess
/config.sub
Run Code Online (Sandbox Code Playgroud)
但是在重新配置和重建之后,git status仍会报告:
# On branch master
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: aclocal.m4
# modified: config.guess
# modified: config.sub
...
Run Code Online (Sandbox Code Playgroud)
我期待它说:
# deleted: aclocal.m4
...
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?
所以我有一个简单的eBPF代码:
我的.h:
#ifndef __MY_COMMON_H__
#define __MY_COMMON_H__
#include <linux/types.h>
struct foo {
int a;
int b;
int c;
int d;
};
#endif /* __MY_COMMON_H__ */
Run Code Online (Sandbox Code Playgroud)
my_kern.c:
...
struct bpf_map_def SEC("maps") my_map = {
.type = BPF_MAP_TYPE_HASH,
.key_size = ...,
.value_size = ...,
.max_entries = MAX_ENTRIES,
};
struct foo my_foo = {
.a = 150000,
.b = 100,
.c = 10,
.d = 40,
};
SEC("sockops")
int my_bpf(struct bpf_sock_ops *sk_ops)
{
...
};
char _license[] SEC("license") = "GPL";
u32 _version …Run Code Online (Sandbox Code Playgroud) 我正在阅读有关kprobesBPF程序类型的信息,我想知道是否有可能不仅为了跟踪目的而拦截函数调用或收集一些底层信息(寄存器,堆栈等),还可以替代调用并执行而不是实际执行功能?
是否kprobe提供此功能,或者我在寻找错误的工具?
考虑以下片段:
struct my_struct {
int a;
int b;
int c;
};
void my_func(unsigned long x)
{
struct my_struct m[] = {
{ 0, 1, 2 },
{ 11, 22, htonl(x) },
{ 0x1, 0xa, 0xbb }
};
...
}
Run Code Online (Sandbox Code Playgroud)
在结构初始化块内调用函数是否合法/可移植?
我想从git存储库中查看OpenStack Neutron的分支JUNO.这样做的正确URI是什么?如果我做
% git clone git://github.com/openstack/neutron/tree/stable/juno/
Run Code Online (Sandbox Code Playgroud)
它说:
openstack/neutron/tree/stable/juno is not a valid repository name
Run Code Online (Sandbox Code Playgroud)
但我确实在https://github.com/openstack/neutron/tree/stable/juno/上看到了这个分支.我究竟做错了什么?谢谢.
我创建了一个分支git branch my_branch,然后git checkout my_branch在其中工作,但是当我切换回 master 时,git checkout master我也确实在 master 中看到了这些更改。我认为这不应该发生。
% git checkout my_branch
Switched to branch 'my_branch'
<I make my changes>
% git status
On branch my_branch
Changes not staged for commit:
...
% git checkout master
Switched to branch 'master'
% git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
...
<Shows the same changed files as in my_branch>
Run Code Online (Sandbox Code Playgroud)
我可能做错了什么?
谢谢。
bpf ×4
linux-kernel ×4
ebpf ×3
git ×3
linux ×2
llvm-clang ×2
c ×1
freebsd ×1
function ×1
git-branch ×1
kprobe ×1
networking ×1
openindiana ×1
opensolaris ×1
openstack ×1
pci-e ×1
porting ×1
solaris ×1
struct ×1
system-calls ×1