我的理解是,当我们ls在终端输入:
fork()库函数,库函数调用系统调用clone()
来创建子进程。execve()调用以用新内容替换创建的新进程的地址空间。在这种情况下,我希望在ls 输出clone()中看到系统调用。但我只看到而不看到。execve()straceexecve()clone()
可能是什么原因?
我尝试了以下命令:
strace ls
strace -c ls
strace -f ls
Run Code Online (Sandbox Code Playgroud)
操作系统-红帽
我想看看Linux内核功能是如何实现的,所以我从GNU页面mmap()下载了GNU C Library( )源码。(我下载是因为告诉我我正在使用)
现在找到我所做的定义,它什么也没返回,所以我尝试返回以下内容:glibcglibc-2.27ldd --versionGLIBC 2.27mmap()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) 我需要有关在运行树莓派操作系统 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) 假设我有一个跟踪点 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)
如何访问通话上下文?例如,如果我想打印更改所有权或新所有者的文件怎么办?
我想为 Linux 初始化建立一个里程碑式的路线图,以便于我轻松理解。(对于嵌入式系统)这是我得到的:
我不知道这里究竟什么时候处理devicetree。是在处理 do_initcall() 函数时还是在处理之前?一般来说,何时解析 devicetree,何时处理树节点?预先非常感谢您。
非常感谢对我的想法的任何纠正。
据我所知,全局变量(在用户空间程序中)存储在相应的数据(和 BSS)段中。但如果是内核代码,它们如何存储以及在哪里存储呢?
我想过编写一个程序集存根来mprotect使用页面地址进行调用,但随后我需要在进程的同一地址空间中运行此存根,而且我不知道该怎么做。还有其他方法吗?
这是我为 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 常量。
但是,不清楚如何为该内核初始化自旋锁以解锁。
实现相同初始化的正确方法是什么?
我目前正在尝试将我的 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 原理,但无法在 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 ×10
linux ×7
c ×2
system-calls ×2
armv8 ×1
bpf ×1
compilation ×1
device-tree ×1
ebpf ×1
huge-pages ×1
kernel ×1
ls ×1
lvm ×1
memory ×1
mmap ×1
paging ×1
storage ×1
strace ×1
u-boot ×1
variables ×1
x86-64 ×1