小编wxz*_*wxz的帖子

是否可以在需要时在 WSL 版本之间切换?

我最近刚刚安装了 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

windows-subsystem-for-linux wsl-2

8
推荐指数
1
解决办法
2016
查看次数

对于包括设置在内的小型 C 程序,合理的最少汇编指令数是多少?

我正在尝试生成最小的 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)

c assembly linker compilation

6
推荐指数
1
解决办法
211
查看次数

Linux 内核 - 页缓存、结构地址空间和内存 cgroup 之间有什么关系?

我试图了解 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

6
推荐指数
1
解决办法
921
查看次数

eBPF - 加载、附加和链接之间的区别?

我对系统调用和函数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()

linux linux-kernel cgroups bpf ebpf

5
推荐指数
1
解决办法
2546
查看次数

无法使用protobuf包

看来我无法导入这个包: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)

go protocol-buffers grpc

2
推荐指数
1
解决办法
6027
查看次数

Vim 快速修复:如何打开在与 vim 工作目录不同的目录中编译的 :make 条目?

我正在深入研究 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 vim gcc vim-quickfix

0
推荐指数
1
解决办法
856
查看次数