标签: linux-kernel

在终端中输入“strace ls”时,为什么我无法在 strace 输出中查看 clone() 系统调用?

我的理解是,当我们ls在终端输入:

  1. 它调用fork()库函数,库函数调用系统调用clone() 来创建子进程。
  2. 然后调用系统execve()调用以用新内容替换创建的新进程的地址空间。

在这种情况下,我希望在ls 输出clone()中看到系统调用。但我只看到而不看到。execve()straceexecve()clone()

可能是什么原因?

我尝试了以下命令:

strace ls
strace -c ls
strace -f ls 
Run Code Online (Sandbox Code Playgroud)

操作系统-红帽

linux ls system-calls linux-kernel strace

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

glibc 中的 mmap 实现 - 带有符号 mmap 的动态库

我想看看Linux内核功能是如何实现的,所以我从GNU页面mmap()下载了GNU C Library( )源码。(我下载是因为告诉我我正在使用) 现在找到我所做的定义,它什么也没返回,所以我尝试返回以下内容:glibcglibc-2.27ldd --versionGLIBC 2.27
mmap()grep -r "mmap(void" *grep -r "mmap (void" *

conform/data/sys/mman.h-data:function {void*} mmap (void*, size_t, int, int, int, off_t)
include/sys/mman.h:extern void *__mmap (void *__addr, size_t __len, int __prot,
malloc/memusage.c:mmap (void *start, size_t len, int prot, int flags, int fd, off_t offset)
manual/llio.texi:@deftypefun {void *} mmap (void *@var{address}, size_t @var{length}, int @var{protect}, int @var{flags}, int @var{filedes}, off_t @var{offset})
misc/sys/mman.h:extern void *mmap (void *__addr, size_t __len, int __prot, …
Run Code Online (Sandbox Code Playgroud)

linux operating-system mmap system-calls linux-kernel

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

Raspberry Pi 4 上的大页

我需要有关在运行树莓派操作系统 64 位的树莓派 4 上管理大页的帮助。
我在网上没有找到太多可靠的信息。
首先我重新编译了内核源启用Memory Management options --->Transparent Hugepage Support选项。当我运行命令时:

grep -i huge /proc/meminfo

输出是:

AnonHugePages:    319488 kB
ShmemHugePages:        0 kB
FileHugePages:         0 k
Run Code Online (Sandbox Code Playgroud)

并运行命令:

cat /sys/kernel/mm/transparent_hugepage/enabled
Run Code Online (Sandbox Code Playgroud)

输出是:

[always] madvise never
Run Code Online (Sandbox Code Playgroud)

所以我认为应该设置透明大页(AnonHugePages)。我需要使用 HugePages 使用 mmap 函数、c 代码来映射最大的连续内存块。

mem = mmap(NULL,buf_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
Run Code Online (Sandbox Code Playgroud)

查看https://www.man7.org/linux/man-pages/man2/mmap.2.html有两个标志来管理大页:MAP_HUGETLB 标志和 MAP_HUGE_2MB、MAP_HUGE_1GB 标志。

我的问题是:要使用 HugePages,我应该以这种方式映射吗?

mem = mmap(NULL,buf_size,PROT_READ|PROT_WRITE,MAP_SHARED,MAP_HUGETLB,fd,0);
Run Code Online (Sandbox Code Playgroud)

内核配置:

CONFIG_SYS_SUPPORTS_HUGETLBFS=y
CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
CONFIG_HAVE_ARCH_HUGE_VMAP=y
CONFIG_TRANSPARENT_HUGEPAGE=y
CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
# CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set
CONFIG_TRANSPARENT_HUGE_PAGECACHE=y
# CONFIG_HUGETLBFS is not set
Run Code Online (Sandbox Code Playgroud)

linux linux-kernel huge-pages armv8 raspberry-pi4

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

读取 eBPF 跟踪点参数

假设我有一个跟踪点 eBPF 探针,它挂接到 chown 函数中。

SEC("tracepoint/syscalls/sys_enter_chown")
int bpf_prog(void *ctx) {
  // someone changed ownership of a file
  char msg[] = "Ownership change of file!";
  bpf_trace_printk(msg, sizeof(msg));
}
Run Code Online (Sandbox Code Playgroud)

如何访问通话上下文?例如,如果我想打印更改所有权或新所有者的文件怎么办?

c linux linux-kernel bpf ebpf

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

Linux 内核初始化 - 何时解析 devicetree blob 并加载树节点?

我想为 Linux 初始化建立一个里程碑式的路线图,以便于我轻松理解。(对于嵌入式系统)这是我得到的:

  1. Bootloader 将内核加载到 RAM 并启动它
  2. Linux内核进入head.o,启动start_kernel()
  3. CPU架构找到,MMU启动。
  4. setup_arch() 被调用,设置 CPU。
  5. 内核子系统已加载。
  6. do_initcalls() 被调用,并且带有 *_initcall() 和 module_init() 函数的模块被启动。
  7. 然后运行 ​​/sbin/init (或类似的)。

我不知道这里究竟什么时候处理devicetree。是在处理 do_initcall() 函数时还是在处理之前?一般来说,何时解析 devicetree,何时处理树节点?预先非常感谢您。

非常感谢对我的想法的任何纠正。

linux-kernel device-tree

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

内核全局变量存储在哪里?

据我所知,全局变量(在用户空间程序中)存储在相应的数据(和 BSS)段中。但如果是内核代码,它们如何存储以及在哪里存储呢?

variables operating-system kernel linux-kernel

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

您可以更改正在运行的进程的页面权限吗?

我想过编写一个程序集存根来mprotect使用页面地址进行调用,但随后我需要在进程的同一地址空间中运行此存根,而且我不知道该怎么做。还有其他方法吗?

linux memory paging x86-64 linux-kernel

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

SPIN_LOCK_UNLOCKED 的 Linux 3.16 等效项是什么?

这是我为 2.x 内核编写的内核模块中的一行。

static spinlock_t mr_lock = SPIN_LOCK_UNLOCKED;
Run Code Online (Sandbox Code Playgroud)

当我尝试为 3.16 内核编译此模块时,出现以下构建错误。

error: ‘SPIN_LOCK_UNLOCKED’ undeclared here (not in a function)
Run Code Online (Sandbox Code Playgroud)

当我查看linux/spinlock_types.h定义spinlock_t此内核类型的 3.16 版本时,确实不再有 SPIN_LOCK_UNLOCKED 常量。

但是,不清楚如何为该内核初始化自旋锁以解锁。

实现相同初始化的正确方法是什么?

c linux kernel-module linux-kernel

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

错误:Linux 内核升级期间(有空间时)“gzip: stdout: No space left on device”

我目前正在尝试将我的 Linux 内核从 4.4.0-63 升级到 4.10.12。我已经完成了以下步骤(通过使用http://www.thegeekstuff.com/2013/06/compile-linux-kernel手册):make-> make modules->make modules_install

虽然一旦我尝试执行“ make install”,我就会收到以下错误:

user@thiscomp:/usr/src/linux-4.10.12$ sudo make install
sh ./arch/x86/boot/install.sh 4.10.12 arch/x86/boot/bzImage \
            System.map "/boot"
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 4.10.12 
/boot/vmlinuz-4.10.12
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 4.10.12 
/boot/vmlinuz-4.10.12
update-initramfs: Generating /boot/initrd.img-4.10.12
W: Possible missing firmware /lib/firmware/ast_dp501_fw.bin for module ast

gzip: stdout: No space left on device
E: mkinitramfs failure cpio 141 gzip 1
update-initramfs: failed for /boot/initrd.img-4.10.12 with 1.
run-parts: /etc/kernel/postinst.d/initramfs-tools exited with return code 1
make[1]: *** …
Run Code Online (Sandbox Code Playgroud)

linux storage compilation lvm linux-kernel

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

U-boot 起始地址?和 u-boot.imx 文件包含什么?

我试图了解嵌入式 Linux 原理,但无法在 u-boot 输出中找出地址。

如何找到U-boot的起始地址?

例如,我有基于 i.MX6 四核处理器的 MX6-SabreSD 板,我从 U-Boot 得到以下输出:

U-Boot 2015.10-rc3 (Aug 10 2017 - 13:33:34)

CPU:   Freescale i.MX6Q rev1.2 at 792 MHz
Reset cause: POR
Board: MX6-SabreSD
DRAM:  1 GiB
MMC:   FSL_SDHC: 0
No panel detected: default to LDB-WVGA
Display: LDB-WVGA (800x480)
In:    serial
Out:   serial
Err:   serial
Net:   using phy at 6
FEC [PRIME]
Warning: FEC MAC addresses don't match:
Address in SROM is         00:c0:08:88:a5:e6
Address in environment is  00:c0:08:88:9c:ce

Hit any key to …
Run Code Online (Sandbox Code Playgroud)

linux-kernel u-boot

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