Questions tagged «linux-kernel»

该标签用于询问有关Linux内核本身内部的问题,尤其是有关编写在内核上下文中运行的代码(例如内核模块或驱动程序)的问题。有关在Linux中编写用户空间代码的问题,通常应标记为[linux]。由于Linux内核的内部结构不断变化,因此包含您感兴趣的精确内核版本会很有帮助。


3
上下文切换内部
我想借助这个问题来学习并弥补我的知识空白。 因此,用户正在运行一个线程(内核级),并且现在正在调用yield(我认为是系统调用)。现在,调度程序必须将当前线程的上下文保存在TCB中(该线程存储在内核中的某个位置),并选择另一个线程来运行并加载其上下文并跳转至CS:EIP。为了缩小范围,我正在研究在x86体系结构上运行的Linux。现在,我想详细介绍一下: 因此,首先我们有一个系统调用: 1)的wrapper函数yield会将系统调用参数推入堆栈。推送返回地址,并通过将系统调用号推送到某个寄存器(例如EAX)引发中断。 2)中断将CPU模式从用户更改为内核,并跳转到中断向量表,并从那里跳转到内核中的实际系统调用。 3)我猜想调度程序现在被调用,现在它必须将当前状态保存在TCB中。这是我的困境。因为,调度器将使用内核堆栈,而不是用于执行其操作(这意味着该用户堆栈SS和SP已被改变),它是如何存储的用户的状态,而不会在该过程修改任何寄存器。我在论坛上已经读到有一些用于保存状态的特殊硬件说明,但是调度程序如何访问它们,谁来运行这些说明以及何时运行? 4)现在,调度程序将状态存储到TCB中并加载另一个TCB。 5)当调度程序运行原始线程时,控件返回到包装器函数,该函数清除堆栈并恢复线程。 附带问题:调度程序是否以仅内核线程(即只能运行内核代码的线程)运行?每个内核线程或每个进程是否有单独的内核堆栈?

4
Linux内核:系统调用挂钩示例
我正在尝试编写一些简单的测试代码,以作为钩住系统调用表的演示。 “ sys_call_table”在2.6中不再导出,因此我只是从System.map文件中获取地址,我可以看到它是正确的(在内存中查找我找到的地址,我可以看到指向该地址的指针系统调用)。 但是,当我尝试修改该表时,内核会给“ Oops”加上“无法处理虚拟地址c061e4f4上的内核分页请求”,然后机器会重新启动。 这是运行2.6.18-164.10.1.el5的CentOS 5.4。有某种保护措施还是我只有一个bug?我知道SELinux附带了它,我已经尝试过将其设置为宽松模式,但这并没有什么不同 这是我的代码: #include <linux/kernel.h> #include <linux/module.h> #include <linux/moduleparam.h> #include <linux/unistd.h> void **sys_call_table; asmlinkage int (*original_call) (const char*, int, int); asmlinkage int our_sys_open(const char* file, int flags, int mode) { printk("A file was opened\n"); return original_call(file, flags, mode); } int init_module() { // sys_call_table address …
72 c  linux-kernel  hook 

7
在Linux中哪个实时优先级是最高优先级
在Linux实时进程优先级范围为1至99的情况下,我不清楚哪个是最高优先级,即1或99。 “了解Linux内核”(O'Reilly)的7.2.2节说1是最高优先级,考虑到正常进程的静态优先级从100到139,其中100是最高优先级,这是有道理的: “每个实时过程都与一个实时优先级相关联,该优先级的值范围从1(最高优先级)到99(最低优先级)。” 另一方面,sched_setscheduler手册页(RHEL 6.1)声称99是最高的: “根据一种实时策略(SCHED_FIFO,SCHED_RR)调度的进程的sched_priority值在1(低)到99(高)之间。” 哪个实时优先级最高?

3
linux __user宏的含义是什么?
我希望有人能解释Linux内核源代码中使用的__user宏的细微差别。 首先,宏: # define __user __attribute__((noderef, address_space(1))) 现在,经过一番谷歌搜索后,我读到该宏允许一个人将一个指针指定为属于用户地址空间,并且不应取消引用它。 我可能会遗漏一些明显的事实,但是有人可以解释一下此类宏的含义吗?例如,该宏将在何处使用的一个好例子是什么?同样,如果我缺少明显的内容,请原谅我。 为了说明这一点,我在检查一些USB代码(linux / usbdevice_fs.h)时遇到了宏。我只是想对内核中使用的宏(或其他类似的宏)有一个一般的了解。 感谢您的光临!

4
在结构数组的末尾需要空括号'{}'是什么?
我在Linux内核中命中了一些C 代码: static struct ctl_table ip_ct_sysctl_table[] = { { .procname = "ip_conntrack_max", .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec, }, // ... { .procname = "ip_conntrack_log_invalid", .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = proc_dointvec_minmax, .extra1 = &log_invalid_proto_min, .extra2 = &log_invalid_proto_max, }, { } }; 这里的结构数组以结尾{ }。它是出于什么目的添加的? …

2
dma_mmap_coherent()映射内存的零拷贝用户空间TCP发送
我正在Cyclone V SoC上运行Linux 5.1,这是一个FPGA,在一个芯片中具有两个ARMv7内核。我的目标是从外部接口收集大量数据,并通过TCP套接字流出(部分)这些数据。这里的挑战是数据速率非常高,并且可能接近饱和GbE接口。我有一个write()可行的实现,该实现只使用对套接字的调用,但其最高速度为55MB / s;大约是理论GbE限制的一半。我现在正在尝试使零拷贝TCP传输能够提高吞吐量,但是我遇到了麻烦。 为了将数据从FPGA传送到Linux用户空间,我编写了一个内核驱动程序。该驱动程序使用FPGA中的DMA块将大量数据从外部接口复制到连接到ARMv7内核的DDR3存储器中。当使用dma_alloc_coherent()with 进行探测时GFP_USER,驱动程序将该内存分配为一堆连续的1MB缓冲区,并通过mmap()在文件中实现并将这些/dev/地址返回给应用程序,将这些缓冲区公开给用户空间应用程序。dma_mmap_coherent()预分配的缓冲区。 到目前为止,一切都很好; 用户空间应用程序正在查看有效数据,吞吐率大于360MB / s时,还有足够的余量(外部接口的速度不够快,无法真正看到上限)。 为了实现零拷贝TCP网络,我的第一种方法是SO_ZEROCOPY在套接字上使用: sent_bytes = send(fd, buf, len, MSG_ZEROCOPY); if (sent_bytes < 0) { perror("send"); return -1; } 但是,这导致send: Bad address。 谷歌搜索了一段时间之后,我的第二种方法是使用管道,splice()然后执行以下操作vmsplice(): ssize_t sent_bytes; int pipes[2]; struct iovec iov = { .iov_base = buf, .iov_len = len }; pipe(pipes); sent_bytes …

1
为什么要为具有相同名称的函数定义宏?
我在https://github.com/torvalds/linux/blob/master/arch/x86/include/asm/atomic.h中找到了以下代码 static __always_inline bool arch_atomic_sub_and_test(int i, atomic_t *v) { return GEN_BINARY_RMWcc(LOCK_PREFIX "subl", v->counter, e, "er", i); } #define arch_atomic_sub_and_test arch_atomic_sub_and_test 什么是#define真的?什么时候需要这样做?
12 c  linux-kernel 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.