linux kernel
文章平均质量分 83
古戎烽烟
脑袋被猪拱了
展开
-
idr 机制 radix tree
来自:http://blog.csdn.net/orz415678659/article/details/8539794一.结构体1.idr结构体[cpp] view plain copystruct idr { struct idr_layer __rcu *top; //idr_layer顶层,32叉树的根转载 2016-05-09 21:08:45 · 968 阅读 · 0 评论 -
softirq and tasklets
tasklet is something like a very small thread that has neither stack, not context of its own. Such “threads” work quickly and completely.原创 2016-04-22 10:19:55 · 2615 阅读 · 0 评论 -
内存管理--检测内存
linux kernel被bootloader加载到内存后,cpu首先执行head.s中的start_of_setup函数等函数,然后跳转到main.c,main中首先执行detect_memory函数探测内存;int detect_memory(void){ int err = -1; if (detect_memory_e820() > 0) err = 0; if (!d原创 2016-05-06 17:54:22 · 1268 阅读 · 0 评论 -
内存管理-1
linux 内存管理基于分段、分页把逻辑地址转换为物理地址,同时有些RAM永久的分配给了内核使用用来存放内核代码以及静态数据。其余的RAM为动态内存。linux中采用了很多有效的管理方法,包括页表管理、高端内存(临时映射区、固定映射区、永久映射区、非连续内存区)管理、为减小外部碎片的伙伴系统、为减小内部碎片的slab机制、伙伴系统未建立之前的页面分配制度以及紧急内存管理等等。。原创 2016-05-06 11:33:59 · 513 阅读 · 0 评论 -
interrupts & exceptions中断异常
2016原创 2016-04-21 15:01:36 · 1047 阅读 · 0 评论 -
内存管理-2
伙伴算法原创 2016-05-05 16:07:18 · 108 阅读 · 0 评论 -
内存管理-1
页框原创 2016-05-05 16:06:53 · 101 阅读 · 0 评论 -
进程调度--load balance
现在计算机为多核处理器,操作系统会把任务分配到处理器上运行工作,但是如何均匀的分配任务?以及怎样调整何时调整任务的分配策略? 在linux系统中运用软中断来调整各个处理器的负载;__init void init_sched_fair_class(void){#ifdef CONFIG_SMP open_softirq(SCHED_SOFTIRQ, run_rebala原创 2016-05-05 11:08:43 · 1244 阅读 · 0 评论 -
进程调度 以及softirq中定时器会调用的进程调度过程分析
实时进程:原创 2016-05-04 20:08:18 · 971 阅读 · 0 评论 -
进程调度 ---CFS调度
CFS调度分析方法:原创 2016-05-04 16:55:55 · 1067 阅读 · 0 评论 -
内存管理--页表机制
建立永久的分页机制 在前面的内存映射介绍中,init_memory_mapping()只是构建了内核页表,作为临时的分页映射。例如只对高端内存固定映射区创建了页表结构,并没有对高端内存区永久映射区进行初始化。setup_arch()在执行完init_memory_mapping()和initmem_init()后,就会调用arch/x86/mm/init_32.c:paging_init原创 2016-05-07 00:10:34 · 1956 阅读 · 0 评论 -
内存管理---页表机制1
Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此Linux的虚拟地址空间也为0~4G。Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF)供内核使用,称为“内核空间”。而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF)供各个进程使用,称为“用户空间“。因为每个进程可以通过系统调用进入内核,因此Li原创 2016-05-06 21:50:34 · 3100 阅读 · 0 评论 -
线程 进程区别
线程私有数据(Thread-specific data,TSD):存储和查询与某个线程相关数据的一种机制。来自http://blog.csdn.net/ctthuangcheng/article/details/9357917在进程内的所有线程都共享相同的地址空间,即意味着任何声明为静态或外部变量,或在进程堆声明的变量,都可以被进程内所有的线程读写。一个线程真正拥有的唯一私有存储是处理转载 2016-05-09 17:47:43 · 494 阅读 · 0 评论 -
work queues
work queue原创 2016-04-22 16:37:49 · 587 阅读 · 0 评论 -
内存管理---slab机制 销毁对象
Linux内核中将对象释放到slab中上层所用函数为kfree()或kmem_cache_free()。两个函数都会调用__cache_free()函数。缓存回收对象基于以下原则1.本地高速缓存的空间还可以容纳空闲对象,则直接将对象放回本地高速缓存2.本地高速缓存的空间已满,则按batchcount的值将对象从本地高速缓存转移到slab中,转移是基于先进先出的原则的原创 2016-05-08 14:51:17 · 517 阅读 · 0 评论 -
内存管理 ---slab机制 分配对象
从一个缓存中分配对象总是遵循下面的原则:1.本地高速缓存中是否有空闲对象,如果有的话则从其中获取对象,2.如果本地高速缓存中没有对象,则从kmem_list3中的slab链表中寻找空闲对象并填充到本地高速缓存再分配;3.如果所有的slab中都没有空闲对象了,那么就要创建新的slab,再分配 。 来自:http://blog.csdn.net/vanbreaker/a原创 2016-05-08 14:31:47 · 773 阅读 · 0 评论 -
内存管理---创建 销毁slab
创建slab主要由函数cache_grow()实现,满足以下两个条件时,slab分配器将为高速缓存创建新的slab1.请求分配对象,但本地高速缓存没有空闲对象可以分配,需要填充2.kmem_list3维护的链表中没有slab或者所有的slab都处于FULL链表中原创 2016-05-08 12:13:01 · 538 阅读 · 0 评论 -
slab----1
内核启动早期初始化start_kernel()->mm_init()->kmem_cache_init()1,初始化静态initkmem_list3三链;2,初始化cache_cache的nodelists字段为1中的三链;3,根据内存情况初始化每个slab占用的页面数变量slab_break_gfp_order;4,将cache_cache加入ca原创 2016-05-08 09:28:26 · 411 阅读 · 0 评论 -
内存管理---内存释放
Linux内存释放函数之间的调用关系如下图所示 hi/*用虚拟地址进行释放*/void free_pages(unsigned long addr, unsigned int order){ if (addr != 0) { VM_BUG_ON(!virt_addr_valid((void *)addr)); __free_pages(virt原创 2016-05-08 00:18:57 · 1456 阅读 · 0 评论 -
high memory 映射 ----2
临时内核映射:原创 2016-05-07 16:09:11 · 345 阅读 · 0 评论 -
linux high memory 映射-1
书籍:深入理解linux内核;linux source code原创 2016-05-07 13:52:30 · 532 阅读 · 0 评论 -
进程-process
进程:一般进程具备以下要素: 1、 有一段程序执行,这段程序可以不一定是进程所专有,可以与其它进程共用; 2、 有专用的系统堆栈空间; 3、 在内核中有一个task_struct数据结构;即进程控制块。有了次数据结构,进程才能成为内核调度的一个基本单位接收内核的调度。同时此结构记录着进程所占用的各项资源。 4、 有独立的存原创 2015-10-15 21:23:34 · 1220 阅读 · 0 评论 -
进程调度2
linux调度和行为schedule();原创 2016-05-04 12:59:58 · 456 阅读 · 0 评论 -
signal3
提到signal与thread的关系,就得先提POSIX标准。POSIX标准决定了Linux为何将signal如此实现: 1 信号处理函数必须在多线程应用的所有线程之间共享,但是,每个线程要有自己的挂起信号掩码和阻塞信号掩码。 2 POSIX 函数kill/sigqueue必须面向所有的多线程应用而不是某个特殊的线程。 3 每个发给多线程应用的信号仅传送给1个线程,这个线程转载 2015-11-23 14:18:11 · 631 阅读 · 0 评论 -
signal4
Linux signal next_signal 负责从挂起信号中选择deliver的signo:当然,有线程显存私有的penging,有线程组共有的pending,对于线程而言,先从自己私有的pending中选,处理完毕私有的才会去处理线程组共有的pending,这个逻辑的代码在:int dequeue_signal(struc转载 2015-11-23 14:16:27 · 956 阅读 · 0 评论 -
first bit
unsigned long find_next_zero_bit(const unsigned long *addr, unsigned long size, unsigned long offset){ const unsigned long *p = addr + BITOP_WORD(offset); // offset位于p指向的long地址32位空间转载 2015-11-23 14:14:30 · 422 阅读 · 0 评论 -
硬件高速缓存&TLB
硬件高速缓存是通过高速缓存行寻址的。L1_CACHE_BYTES宏产生以字节为单位的高速缓存行的大小。为了使高速缓存的命中率达到最优化,采取下列决策:一个数据结构中最常用使用的字段放在该数据结构内的低偏移部分,以便他们能够处理高速缓存的同一行中。当为一大数组数据分配空间时,内核师徒把他们放在内存中,以便所有高速缓存行按同一方式使用。TLB是一个内存管理单元用于改进虚原创 2015-10-15 17:22:33 · 1054 阅读 · 0 评论 -
内存寻址
unix内核原创 2015-10-12 11:27:30 · 866 阅读 · 0 评论 -
__alloc_bootmem_core
分配页内存底层函数/* * We 'merge' subsequent allocations to save space. We might 'lose' * some fraction of a page if allocations cannot be satisfied due to * size constraints on boxes where there is physi转载 2015-10-14 15:30:06 · 450 阅读 · 0 评论 -
欢迎使用CSDN-markdown编辑器
ff原创 2015-10-12 11:26:25 · 85 阅读 · 0 评论 -
linux操作系统CPL、DPL、RPL说明
linux操作系统中特权级有3种:CPL,DPL和RPL,每个都是有4个等级。我对他们的关系理解是这样:一般来说,CPL代表当前代码段的权限,如果它想要去访问一个段或门,首先要看看对方的权限如何,也就是检查对方的DPL,如果满足当前的权限比要访问的权限高,则有可能允许去访问,有些情况我们还要检查选择子的权限,即RPL,因为我们通过选择子:偏移量的方式去访问一个段,这算是一个访问请求动作,因转载 2015-10-25 10:53:56 · 1259 阅读 · 0 评论 -
系统调用
系统调用时CPU主动的。同步进入内核空间的手段原创 2015-10-22 09:10:00 · 286 阅读 · 0 评论 -
进程的组织
task原创 2015-10-19 21:33:23 · 291 阅读 · 0 评论 -
signal 6
内核signal_struct中notify_count变量的作用 在进程或者线程执行exec函数的时候,由于exec函数会影响整个进程组的内存结构,所以其他线程的存在是没有意义的,这时需要杀死线程组中其他的线程,也包括主线程,杀死线程的任务交给了信号SIGKILL,同时执行exec函数的进程需要被挂起,等待所有线程结束后,在重新唤醒执行exec的进程。这一系列的控制,在sig转载 2015-11-23 14:48:38 · 1239 阅读 · 0 评论 -
synchronization in Linux kernel
kernel preemption:the main characteristic of a preemptive kernel is that a process running in the kernel mode can be replaced by another process while in the middle of a kern原创 2016-04-25 09:36:05 · 617 阅读 · 0 评论 -
进程调度1
进程调度所用到的数据结构:数据结构runqueue为系统中每个CPU都有的数据结构,runqueue存放在每CPU变量中,原创 2016-05-04 09:33:56 · 716 阅读 · 0 评论 -
copy_process
在 fork()函数中最重要的是 copy_peocess函数 实现进程的复制asmlinkage int sys_fork(struct pt_regs regs){return do_fork(SIGCHLD, regs.esp, ®s, 0, NULL, NULL);}asmlinkage int sys_vfork(struct pt_regs r原创 2015-10-19 21:31:28 · 585 阅读 · 0 评论 -
虚拟文件系统VFS---2
/* * Flags is a 32-bit value that allows up to 31 non-fs dependent flags to * be given to the mount() call (ie: read-only, no-dev, no-suid etc). * * data is a (void *) that can point to any struct原创 2016-05-26 16:22:45 · 488 阅读 · 0 评论 -
虚拟文件系统VFS
虚拟文件系统用来处理与linux标准文件系统相关的所有系统调用,他能为各种文件提供一种接口。原创 2016-05-24 16:12:05 · 967 阅读 · 0 评论 -
linkly seqlock rcu
likely或unlikely用于优化条件语句,其一般用法为:3725884266736043497.jpg条件判断之后会有两个出口,一个是真,一个是假。然而编译生成的目标代码是扁平的,其中的一个出口必须通过跳转来实现。考虑下面一个场景:1、判断条件;2、条件为真跳转到4;3、进行条件为假时的处理;4、进行条件为真时的处理;可见,如果条件为真,多了一次JMP转载 2016-05-10 20:04:31 · 332 阅读 · 0 评论