linux内核设计与实现(读书笔记)
在hust快乐的学习
希望通过CSDN这个平台认识更多志同道合的朋友!
实现共同进步!
展开
-
linux内核空间和用户空间详解
linux驱动程序一般工作在内核空间,但也可以工作在用户空间。下面我们将详细解析,什么是内核空间,什么是用户空间,以及如何判断他们。Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G。Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G转载 2013-08-23 09:57:19 · 1057 阅读 · 0 评论 -
Linux CPU 亲和性
软亲和性意味着进程并不会在处理器之间频繁迁移,而硬亲和性则意味着进程需要在您指定的处理器上运行。Linux调度程序同时提供软硬CPU亲和性机制。虽然它尽力通过一种软的亲和性试图使进程尽量在同一个处理器上运行,但它也允许用户强制指定“这个进程无论如何都必须在这些处理器上运行。”这种硬CPU亲和性保存在进程task_struct的cpus_allowed这个位掩码标志中。该掩码标志的每一位原创 2013-08-28 22:39:21 · 4627 阅读 · 0 评论 -
Linux CFS 进程调度算法
Linux主要实现了两大类调度算法,CFS(完全公平调度算法)和实时调度算法。宏SCHED_NOMAL和SCHED_BATCH主要用于CFS调度,而SCHED_FIFO和SCHED_RR主要用于实时调度。这几个宏的定义可以在include/linux/sched.h中找到。文件kernel/sched.c包含了内核调度器及相关系统调用的实现。调度的核心函数为sched.c中的schedule(),转载 2013-08-29 10:30:23 · 5449 阅读 · 0 评论 -
find_new_reaper
如果父进程在子进程之前退出,必须有机制来保证子进程能找到一个新的父亲,否则这些成为孤儿的进程就会在退出时永远处于僵死状态,白白地耗费内存。对于这个问题,解决方法是给子进程在当前线程组内找一个线程作为父亲,如果不行,就让init做它们的父进程。在do_exit()中会调用exit_notify(),该函数会调用forget_original_parent(),而后者会调用find_new_reape原创 2013-08-27 16:37:24 · 3586 阅读 · 1 评论 -
list_entry()详解
Linux内核中,获取节点地址的函数list_entry()非常常用,由于其定义有点晦涩,先解析如下:list_entry的宏定义:#define list_entry(ptr, type, member) / ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) 这个倒是不难理解:从一个转载 2013-08-26 22:14:16 · 23712 阅读 · 3 评论 -
slab分配器分配task_struct结构
Linux通过slab分配器分配task_struct结构,这样能达到对象复用和缓存着色的目的分配和释放数据结构是所有内核中最普遍的操作之一。为了便于数据的频繁分配和回收,编程者常常会用到一个空闲链表。该空闲链表包含可供使用的、已经分配好的数据结构块。当代码需要一个新的数据结构实例时,就可以从空闲链表中取出一个,而不需要分配内存、再把数据放进去。以后,当不再需要这个数据结构的实例时,就原创 2013-08-26 21:43:22 · 1670 阅读 · 0 评论 -
linux中fork()函数详解
一、fork入门知识 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来转载 2013-08-23 22:12:13 · 1173 阅读 · 0 评论 -
内核中的内存都不分页
今天看《linux内核设计与实现》,2.4.3节中有这么一句话:“内核中的内存都不分页”。说说我对这句话的理解:内存分页机制是为普通进程设计的,每一个普通进程的内存空间都被划分为特定大小的页,如此一来,在某一个特定的时刻,该进程按需可以调进另一个内存页,而把长时间没有使用的页换出。内核与其它普通进程一样,也是一个进程,但却与其它普通进程不同,它可以直接操作硬件,并且它也控制着分页机原创 2013-08-23 15:16:28 · 2447 阅读 · 1 评论 -
fork() && fork() || fork()
#include #include int main(){ fork();/*****/ fork() && fork() || fork();/*****/ fork();/*****/ sleep(100); return 0;}问题是不算main这个进程自身,程序到底创建了多少个进程?这是EMC的一道笔试题,感觉挺有意思的,这道原创 2013-08-23 23:07:11 · 16620 阅读 · 9 评论 -
进程上下文与中断上下文
处理器总处于以下状态中的一种:1、内核态,运行于进程上下文,内核代表进程运行于内核空间。2、内核态,运行于中断上下文,内核代表硬件运行于内核空间。3、用户态,运行于用户空间。进程上下文:在Linux中,用户程序装入系统形成一个进程的实质是系统为用户程序提供一个完整的运行环境。进程的运行环境是由它的程序代码和程序运行所需要的数据结构以及硬件环境组成的。进程的运行环境主转载 2013-08-26 21:18:19 · 1388 阅读 · 0 评论