要在内核 v4.19-rc5 中初始化自旋锁,必须使用spin_lock_init如下定义的宏:
#define spin_lock_init(_lock) \
do { \
spinlock_check(_lock); \
raw_spin_lock_init(&(_lock)->rlock); \
} while (0)
Run Code Online (Sandbox Code Playgroud)
该函数spinlock_check(_lock)只是返回&lock->rlock。本文解释说:
spinlock_check 的实现非常简单,这个函数只是返回给定自旋锁的 raw_spinlock_t 以确保我们得到完全正常的原始自旋锁我不明白这个函数如何执行检查。我期待
ifcckeck 函数中的一些语句。抱歉,我是内核编程新手。 我正在尝试将 U-Space 分配的虚拟内存 (shm) 映射到特定的 DIMM。我成功地使用 get_user_pages_remote作为指向虚拟内存的起始指针来检索 pfns,然后使用page_to_pfn将每个页面结构转换为 pfn (顺便说一句,这些 pfns 进一步用于为专有帧捕获器设备创建分散收集表并完美地完成工作)。但是,我没有找到一种方法来识别每个物理地址 (pfn) 源自哪个物理 DIMM (DRAM)。互联网搜索产生了一些 DRAM 地址映射方案,但所有这些方案都旨在处理模块内部导航,即:行、列、库、通道和等级,并且所有前者都依赖于内存提供商架构,例如https://www.betriebssysteme .org/wp-content/uploads/2017/04/Hillenbrand.pdf。另一方面,深入研究 SMBIOS 规范https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_2.7.1.pdf,可以从 /dev/mem (dmidecode - t 内存),但是我无法将这两个信息源链接在一起并最终映射页面。
任何建议将被认真考虑。
谢谢,
约尔。
进程 A 在运行时打开 && 映射了数千个文件。然后killl -9 <pid of process A>就发出来了。然后我对以下两个事件的顺序有疑问。
a)/proc/<pid of process A>无法访问。
b) 进程 A 打开的所有文件都被关闭。
有关该问题的更多背景信息:
进程 A 是一个多线程后台服务。它是由 cmd 启动的./process_A args1 arg2 arg3。
还有一个看门狗进程,它定期(每 1 秒)检查进程 A 是否还活着。如果进程 A 死亡,则重新启动它。看门狗检查进程A的方式如下。
1)收集2)
下的所有数字子目录与进程A的cmdline进行比较。如果这些匹配,则进程A处于活动状态并且不执行任何操作,否则重新启动进程A。/proc//proc/<all-pids>/cmdline/proc/<some-pid>/cmdline
进程A在初始化时会做以下事情。
1)打开fileA
2)flock fileA
3)mmap fileA到内存中
4)关闭fileA
进程A在初始化后将mmap上千个文件。几分钟后,kill -9 <pid of process A>发出。看门狗检测到进程A死亡,重新启动它。但有时进程 A 卡在step 2 flock fileA。经过一番调试,我们发现当进程A被杀死时,就会执行fileA的unlock。但有时此事件会在step 2 flock fileA新流程之后发生。
所以我们猜测通过监视器检查进程是否存活的方式/proc/<pid of process A>
是不正确的。
IPv6地址分配前后会经历各种状态,例如临时地址、重复地址和首选地址。这些地址状态适用于手动和自动配置的地址。我遇到一种情况,当在暂定状态下使用网络接口时,对一天中的时间服务器的请求无限期地阻塞。(当从 python 脚本中调用 rdate 实用程序时)。通过实验,我得出结论,在接口处于暂定状态时调用 rdate 是问题所在。
我看到
ip-monitor
Run Code Online (Sandbox Code Playgroud)
可以使用命令,并 在 Linux 上的 AF_NETLINK 套接字中找到一些有趣的想法:如何以编程方式确定 NIC 接口是否已启用并插入?
我正在尝试设置一些异步调用(最好在 python3 中),一旦接口准备好并且 rdate 可以恢复,该调用就会返回。netlink 套接字似乎就是解决这个问题的工具。读完这篇文章和 netlink(7) 我发现我需要类似的东西
s = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);
Run Code Online (Sandbox Code Playgroud)
但我无法找到有关从套接字获取输出后要检查哪些结构字段/设备标志的正确信息。在 netdevice(7) 中我发现
IFF_UP Interface is running.
Run Code Online (Sandbox Code Playgroud)
但我不确定在暂定状态下这是否也是如此。
当然,最简单的方法就是循环 sleep 并检查
ip a show dev devName
Run Code Online (Sandbox Code Playgroud)
直到状态有效,但我将其保留为最后的手段,以防异步调用失败。
您是否知道 Linux 用户空间中高分辨率时钟(最小微秒)的任何 C/C++ 实现(即使它不可移植)?
目标是测量一些低延迟操作的时间间隔。我测量到内核空间时钟有时会导致延迟峰值。
根据我对 Red Hat 7.2 的研究:
谢谢。
我一直在研究一些 Linux 实现,并且想到了一个问题。
据我所知,有一个位将文件标记为临时文件。当生成该文件的进程死亡时,内核如何删除它?我认为它可能与文件描述符表有关,但我不确定。
如果有人能一步一步地给出解释,那将会派上用场!
我是 Linux 编程的新手,我正在尝试按照本指南松散地实现一个简单的系统调用:https://medium.com/anubhav-shrimal/adding-a-hello-world-system-call-to- linux-kernel-dad32875872。在我的 Linux 内核目录中,我创建了一个名为 的新目录my_syscall。在该目录中,我创建了my_syscall.c. 这是my_syscall.c
#include <linux/syscalls.h>
#include <linux/kernel.h>
asmlinkage long sys_my_syscall(int i) {
prink(KERN_INFO "This is the system call.");
return(0);
}
Run Code Online (Sandbox Code Playgroud)
然后我用一行Makefile在目录中创建了一个:my_syscall
obj-y := my_syscall.o
Run Code Online (Sandbox Code Playgroud)
Makefile然后我在内核目录中将此行编辑为:
core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/ my_syscall/
Run Code Online (Sandbox Code Playgroud)
然后,在目录中linux-5.4.15/arch/x86/entry/syscalls,我编辑了syscall_64.tbl在最后包含以下行:
548 64 my_syscall sys_my_syscall
Run Code Online (Sandbox Code Playgroud)
最后,在目录中linux-5.4.15/include/linux,我编辑了syscalls.h文件以在以下内容之前包含此行#endif:
asmlinkage long sys_my_syscall(int i);
Run Code Online (Sandbox Code Playgroud)
现在,当我运行命令时sudo make,很快就遇到以下错误:
./arch/x86/include/generated/asm/syscalls_64.h:2664:19: error: conflicting types …Run Code Online (Sandbox Code Playgroud) 我需要有关 perf 中可用的以下块(磁盘 I/O)事件的信息。您能告诉我在哪里可以获得有关每个活动的详细信息吗?
block:block_bio_backmerge
block:block_bio_bounce
block:block_bio_complete
block:block_bio_frontmerge
block:block_bio_queue
block:block_bio_remap
block:block_dirty_buffer
block:block_getrq
block:block_plug
block:block_rq_complete
block:block_rq_insert
block:block_rq_issue
block:block_rq_remap
block:block_rq_requeue
block:block_sleeprq
block:block_split
block:block_touch_buffer
block:block_unplug
Run Code Online (Sandbox Code Playgroud)
请在这件事上给予我帮助。
假设我有一个共享库a.so,它是由我的可执行文件第一次加载的。我的理解是,共享库文本部分被映射到VMA的中间。我有两个问题;
(1) ld.so是否会将这个共享内存文本节页面加载到物理内存,然后映射到该进程的VMA?
(2) 假设启动了使用相同共享库的第二个可执行文件a.so。ld.so会识别出这个共享库已经加载到物理内存了吗?如何理解这一点?
linux memory-management shared-libraries dynamic-linking linux-kernel
读完Mel Gorman这本书后我有几个问题Understanding the Linux Virtual Memory Manager。节4.3 Process Address Space Descriptor说kernel threads never page fault or access the user space portion. The only exception is page faulting within the vmalloc space。以下是我的问题。
kenrel 线程从不出现页面错误:这是否意味着只有用户空间代码才会触发页面错误?如果调用kmalloc()or vmalloc(),不会出现页错误吗?我相信内核必须将这些映射到匿名页面。当执行对此页的写入时,会发生页错误。我的理解正确吗?
为什么内核线程不能访问用户空间?不这样做copy_to_user()或者copy_from_user()这样做吗?
Exception is page faulting within vmalloc space:这是否意味着vmalloc()会触发页面错误,但kmalloc()不会?为什么kmalloc()不出现页面错误?内核虚拟地址的物理帧不需要保留为页表条目?
linux-kernel ×10
linux ×5
c ×1
c++ ×1
c++-chrono ×1
clock ×1
kernel ×1
low-latency ×1
mutex ×1
netlink ×1
page-fault ×1
perf ×1
ram ×1
sockets ×1
system-calls ×1