我最近刚刚安装了 Windows Subsystem for Linux 2。我当前唯一的发行版是 Ubuntu,我所做的一切都使用它。我知道 WSL 1 更适合处理与 Windows 和 Linux 交互的项目,而 WSL 2 更适合仅针对 Linux 的项目。
我可能想根据我正在处理的内容在版本之间切换,并且我想在版本之间连续更改是否安全?
我发现的另一种选择是做类似的事情:
wsl --export Ubuntu ubuntu.tar
wsl --import Ubuntu2 ./Ubuntu2 ubuntu.tar
Run Code Online (Sandbox Code Playgroud)
然后使用 设置第二个版本wsl --set-version Ubuntu2 2。
我正在尝试生成最小的 C 程序,以查看通过运行它执行了多少指令。我禁用了库的使用并禁用了 vdso。然而,我的 C 程序(gdb 说是 7 条汇编指令)根据 perf stat 最终执行了 17k 条指令。
这是正常数量的指令只是为了设置程序吗?根据 gdb,来自 ld-linux-x86-64.so.2 的代码被映射到程序地址空间。鉴于我禁用了 vdso 并且不包含任何库,此文件是否需要运行该程序?这可能是 17k 指令的原因吗?
我的 C 程序foo5.c
int main(){
char* str = "Hello World";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我如何编译:
gcc -nostdlib -nodefaultlibs stubstart.S -o foo5 foo5.c
Run Code Online (Sandbox Code Playgroud)
stubstart.S
.globl _start
_start:call main;
movl $1, %eax;
xorl %ebx, %ebx;
int $0x80
Run Code Online (Sandbox Code Playgroud)
性能统计输出:
Performance counter stats for './foo5':
0.60 msec task-clock:u # 0.015 CPUs utilized
0 context-switches:u # 0.000 K/sec
0 cpu-migrations:u # 0.000 …Run Code Online (Sandbox Code Playgroud) 我试图了解 Linux 页面缓存以及它与内存 cgroup (v2) 的关系。我知道使用 cgroupsv1,内存 cgroup 可以被隔离并具有独立的 LRU 列表(我假设 cgroupsv2 是相同的)。这个事实以及mm/vmscan.c有很多引用mem_cgroups并且有一个名为 的函数的shrink_node_memcgs事实,让我认为每个 cgroup 都有自己的页面缓存。这个假设是真的吗?页面缓存中的所有页面都属于一个 cgroup 吗?
struct address_space如果这是真的,我知道页面缓存由(此处)表示。如何找出与给定的 cgroup 关联的内容struct address_space?我是否必须只找到其中的第一页,struct address_space然后从该页面中找到 cgroup?
linux operating-system memory-management linux-kernel cgroups
我对系统调用和函数eBPF中使用的术语非常困惑。有人可以分解我对加载/附加进程的理解是错误的吗?bpflibbpfbpf
我的理解:
我一直在查看代码,cgroups因此我将使用它作为示例。我知道 cgroup 的 bpf 程序存储在cgroup_bpf->effective[bpf_attach_type](请参阅此处和此处)。我知道,当从任何处理程序调用它们(例如在本例中为 function )调用类似__cgroup_bpf_run_filter_sysctl()(在cgroup.cproc_sys_call_handler()中)的函数时,这些程序就会被访问和运行。但是这些程序是如何加载/存储/附加/链接的,每个术语之间有什么区别?
加载- 显然,这需要在附加之前发生。我猜测这是 cgroup 程序存储在通用位置(即不在)cgroup_bpf->effective[bpf_attach_type]中的位置,因此尚未附加/链接以在内核中执行。因此,加载与bpf_attach_type. 如果我是正确的,cgroup 程序类型的通用加载位置在哪里?
附加- 也许这是程序与bpf_attach_type. 就像这样,现在我们采用通用存储的程序,现在我们可以cgroup_bpf->effective[bpf_attach_type]使用bpf_attach_type我们想要的任何内容将其放入数组中。然后,当到达内核中相应的附加点时,程序就会运行。
链接- 这只是一种特殊类型的附件吗?这与普通附加有何不同?我看到了link_create(),当使用 cgroup 程序类型时,两者最终都会调用。cgroup_bpf_prog_attach() cgroup_bpf_attach()
看来我无法导入这个包:github.com/golang/protobuf/proto
当我尝试build或使用时go get我得到:
cannot load github.com/golang/protobuf/proto: module github.com/golang/protobuf@latest (v1.3.2) found, but does not contain package github.com/golang/protobuf/proto
Run Code Online (Sandbox Code Playgroud)
这是一个流行的软件包,我很惊讶它似乎不起作用。 https://godoc.org/github.com/golang/protobuf/proto#Marshal
有人遇到过这种情况吗?
更新:
我只是想导入这个:
import (
"bytes"
"context"
"encoding/json"
"errors"
"fmt"
"github.com/golang/protobuf/proto"
)
Run Code Online (Sandbox Code Playgroud)
GoLang 不解析上述路径中的 proto...
我尝试像这样安装:
$ go get github.com/golang/protobuf/proto
go: finding github.com/golang/protobuf/proto latest
go get github.com/golang/protobuf/proto: module github.com/golang/protobuf@upgrade (v1.3.2) found, but does not contain package github.com/golang/protobuf/proto
Run Code Online (Sandbox Code Playgroud)
Update2,不确定该文件有何帮助,但它是:
package main
import (
"bytes"
"context"
"encoding/json"
"errors"
"fmt"
"github.com/golang/protobuf/proto"
"go_poc/plugins/com_styx_proto"
"io/ioutil"
"net/http"
"time"
)
func init() …Run Code Online (Sandbox Code Playgroud) 我正在深入研究 Vim 的快速修复列表,它看起来非常棒,但是由于相对路径问题,我无法利用它。解释:
我的 Vim 窗口路径是.
我在 Vim 中有一个自定义 make 命令:
:set makeprg=west\ build\ -b\ nucleo_l552ze_q\ .\
Run Code Online (Sandbox Code Playgroud)
west程序将使用CMake和gcc来编译我的项目。但事情是这样的:它将当前目录更改为./build。
所以,在 Vim 中,当我运行时
:make
Run Code Online (Sandbox Code Playgroud)
快速修复列表充满了诸如../src/main.c而不是src/main.c之类的引用
结果,当我尝试从快速修复列表中打开文件时,Vim 会使用 的make相对路径创建一个新文件,而不是根据 Vim 工作目录打开我想要的文件。
我的问题是:如何打开在与 vim 工作目录不同的目录中编译的 :make 条目?
运行 make 命令后是否可以更改快速修复列表的根路径?
c ×2
cgroups ×2
linux ×2
linux-kernel ×2
assembly ×1
bpf ×1
compilation ×1
ebpf ×1
gcc ×1
go ×1
grpc ×1
linker ×1
vim ×1
vim-quickfix ×1
windows-subsystem-for-linux ×1
wsl-2 ×1