Tag: linux kernel

Linux如何确定下一个PID?

Linux如何确定下一个将用于进程的PID? 这个问题的目的是为了更好地理解Linux内核。 不要害怕发布内核源代码。 如果按顺序分配PID,Linux如何填补空白? 到底会发生什么? 例如,如果我从Apache运行一个PHP脚本来执行<?php print(getmypid());?>在刷新时打印出相同的PID几分钟。 这段时间是apache接收多less个请求的函数。 即使只有一个客户端,PID最终也会改变。 当PID改变时,它将是一个接近的数字,但有多接近? 这个数字看起来并不完全是连续的。 如果我做一个ps aux | grep apache ps aux | grep apache我得到了相当数量的进程: Linux如何select下一个数字? 前几个PID仍在运行,以及最近打印的PID。 apache如何select重用这些PID?

如何重新编译一个单一的内核模块?

通常内核源码存放在/usr/src/linux-2.6.x/ 。 为了避免重新编译整个内核,如果我修改模块的源代码,我该如何重新编译模块?

什么是标记结构初始化语法?

struct file_operations scull_fops = { .owner = THIS_MODULE, .llseek = scull_llseek, .read = scull_read, .write = scull_write, .ioctl = scull_ioctl, .open = scull_open, .release = scull_release, }; 该声明使用标准C标记的结构初始化语法。 有人可以详细说明吗?

为什么Linux设备驱动程序中除了初始化之外还需要探测方法?

在linux内核中,驱动程序提供的probe()方法是做什么的? 与驱动程序的init函数有什么不同,也就是说为什么不能在驱动程序的init函数中执行probe()函数的动作?

上下文切换内部

在这个问题的帮助下,我想学习和填补我的知识空白 因此,用户正在运行一个线程(内核级),现在它调用yield(我认为是一个系统调用)。调度程序现在必须将当前线程的上下文保存在TCB中(存储在内核中的某个地方),然后select另一个线程运行并加载其上下文并跳转到其CS:EIP。 为了缩小范围,我正在研究运行在x86架构之上的Linux。 现在,我想进入细节: 所以,首先我们有一个系统调用: 1)yield的包装函数将系统调用参数推送到堆栈上。 按下返回地址,并将系统调用号码压入某个寄存器(例如EAX),引发中断。 2)中断将CPU模式从用户切换到内核,并跳转到中断向量表,并从那里到内核中的实际系统调用。 3)我想调度器现在被调用,现在它必须保存TCB中的当前状态。 这是我的困境。 因为调度器将使用内核堆栈而不是用户堆栈来执行其操作(这意味着SS和SP必须被改变),它如何在不修改任何寄存器的情况下存储用户的状态。 我已经在论坛上看到有保存状态的特殊硬件指令,但是调度程序如何访问它们以及谁在运行这些指令? 4)调度器现在将状态存储到TCB中并加载另一个TCB 5)当调度程序运行原始线程时,控件返回到清除堆栈和线程继续的包装函数 旁边的问题:调度程序是否作为内核线程运行(即只能运行内核代码的线程)? 每个内核线程或每个进程是否有单独的内核堆栈?

x86中的IN和OUT指令用于什么?

在阅读“理解Linux内核”一书时,我已经习惯了这些指令。 我查了参考手册。 5.1.9 I / O指令 这些指令在处理器的I / O端口和寄存器或存储器之间移动数据。 IN Read from a port OUT Write to a port INS/INSB Input string from port/Input byte string from port INS/INSW Input string from port/Input word string from port INS/INSD Input string from port/Input doubleword string from port OUTS/OUTSB Output string to port/Output byte string to port […]

Linux上的POSIX AIO和libaio的区别?

我似乎明白: 在<aio.h>中原型化POSIX AIO API,并将程序与librt(-lrt)链接起来,而<libaio.h>的libaio API和程序与libaio(-laio)链接。 我无法弄清楚的是: 1.内核是否以不同的方式处理这些方法? 2.是否必须使用O_DIRECT标志来使用它们之一? 正如在这篇文章中提到的 ,当使用libaio时,libaio可以正常工作,不需要O_DIRECT 。 根据R.Love的“ Linux系统编程”一书的说法,Linux只支持用O_DIRECT打开, 才支持常规文件上的aio (我认为是POSIX AIO)。但是我写的一个小程序(使用aio.h,与-lrt连接)没有O_DIRECT标志打开的文件上的aio_write没有问题。

整个一个核心致力于单一过程

在Linux中有没有办法将一个CPU内核分配给特定的进程,并且在这个内核上不应该有任何其他进程或中断处理程序? 我已经阅读了有关Linux 绑定进程使用taskset实用程序的CPU的进程亲和力,但这并不能解决我的问题,因为它只是试图将给定的进程仿射到该核心,但是可能在该核心上安排其他进程 ,这是我想要避免的。 我们应该改变内核代码进行调度吗?

linux内核如何pipe理小于1GB的物理内存?

我正在学习linux内核的内部知识,在阅读“理解Linux内核”的同时,还碰到了很多与内存有关的问题。 其中之一是,如果我的系统上安装了只有512MB的物理内存,Linux内核如何处理内存映射。 就像我读的那样,内核映射0(或16)MB-896MB物理内存到0xC0000000的线性地址并且可以直接对它进行寻址。 所以,在上面描述的情况下,我只有512 MB: 内核如何从仅512 MB映射896 MB? 在所描述的scheme中,内核进行设置,以便每个进程的页表将从0xC0000000到0xFFFFFFFF(1GB)的虚拟地址直接映射到从0x00000000到0x3FFFFFFF(1GB)的物理地址。 但是,当我只有512 MB物理RAM时,如何映射虚拟地址从0xC0000000-0xFFFFFFFF到物理0x00000000-0x3FFFFFFF? 点是我有一个物理范围只有0x00000000-0x20000000。 在这种情况下用户模式进程呢? 每篇文章只解释了情况,当你安装了4GB内存,内核将1GB映射到内核空间,用户进程使用剩余的RAM。 我会感谢任何帮助提高我的理解。 谢谢..!

为什么有些内核程序员使用goto而不是简单的while循环?

当我学习C时,老师终日告诉我:“不要使用goto,这是一个坏习惯,它很丑,很危险!” 等等。 那么为什么一些内核程序员使用goto ,比如在这个函数中 ,可以用一个简单的replace while(condition) {} 要么 do {} while(condition); 我不明白这一点。 在某些情况下使用goto而不是while / do会更好吗? 如果是这样,为什么?