本栏目下主要归档了一些linux kernel相关的文章,注重结合内核源代码进行说明分析。
什么是等待队列?
在软件开发中任务经常由于某种条件没有得到满足而不得不进入睡眠状态,然后等待条件得到满足的时候再继续运行,进入运行状态。这种需求需要等待队列机制的支持。Linux
中提供了等待队列的机制,该机制在内核中应用很广泛。
等待队列实现了在事件上的条件等待:希望等待特定事件的进程将自己放进合适的等待队列中,并放弃控制权。因此,等待队列表示一组睡眠的进程,当某一条件变为真时,由内核唤醒他们。
在Linux
内核中使用等待队列的过程很简单,首先定义一个wait_queue_head
,然后如果一个task
想等待某种事件,那么调用wait_event(等待队列,事件)
就可以了。
本文转载于:http://ilinuxkernel.com/?p=1248
注意:转载文中的代码在最新的内核上已经无法编译通过,原文中留言区提到的获取内核总的页数的方法有点瑕疵。这些在本文中都会进行修正。
本文中使用的内核版本为:3.10.0-693.21.1
用户态的程序都是在内存保护模式下使用内存,无法直接访问物理内存。同时用户程序使用的地址,也并不是物理地址,而是逻辑地址。至于这些逻辑地址对应的物理内存在哪里,用户进程本身并不知道。
通过用户程序若想访问物理内存,我们需要通过内核才能实现。本文介绍基于内核模块的方式,实现在Linux
中用户态程序访问所有物理内存。
本文转载于:http://www.wowotech.net/memory_management/memory_model.html
在原文的基础上,做了如下的改动:
- 文中出现的内核代码修改成基于
4.4.128
- 对于体系结构相关的代码,使用
x86
架构中的代码
- 对代码格式进行调整
- 会添加一些内容,便于更进一步的理解
flex proportions
基础设施的作用是:根据不同类型的事件,计算其所占的比例部分。
注意,本文中的代码是基于稳定版本的内核v4.4.128
。
本文分析了内核中hungtask
机制,下文中代码基于社区稳定版本内核,版本为:v4.4.128
。