- 博客(100)
- 资源 (4)
- 收藏
- 关注
原创 linux tcp/ip 分析---1
linux 内核网络部分分析;1. linux内核ipv4网络部分分层结构:BSD socket层: 这一部分处理BSD socket相关操作,每个socket在内核中以struct socket结构体现。这一部分的文件主要有:/net/socket.c /net/protocols.c etc INET socket层:BSD socket是个可以用于各种网络协议的接口,
2017-05-07 21:44:33
709
原创 虚拟文件系统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
515
转载 typedef struct 用法详解和用法小结 及 在C和C++中的区别
typedef struct 用法详解和用法小结 及 在C和C++中的区别标签: structtypedefcc++区别2015-04-29 15:29 843人阅读 评论(0) 收藏 举报 分类: C/C++(105) 一. 基本解释typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(
2016-05-12 16:40:04
586
转载 select(poll)系统调用实现解析(一)
copy from http://blog.youkuaiyun.com/lizhiguo0532/article/details/6568964#comments上层要能使用select()和poll()系统调用来监测某个设备文件描述符,那么就必须实现这个设备驱动程序中struct file_operation结构体的poll函数,为什么?因为这两个系统调用最终都会调用驱动程序中的poll函数来初
2016-05-11 17:43:13
425
转载 epoll源码分析(三)
epoll源码分析(三) http://blog.chinaunix.net/uid-20687780-id-2105159.html分类: LINUXepoll_wait系统实现如下:asmlinkage long sys_epoll_wait(int epfd,struct epoll_event __user *events
2016-05-11 17:26:05
295
转载 epoll源码分析----2
来自:http://blog.chinaunix.net/uid-20687780-id-2105157.html上面的原型是epoll的fd所维护的主结构,下面是每一个具体的fd结构.以后每一个fd加入到epoll中,就会创建一个struct epitem结构,并插入至红黑树中。接着是epoll_ctl函数原型:asmlinkage lon
2016-05-11 17:25:11
288
转载 epoll源码分析---1
当系统启动时,epoll进行初始化:static int __init eventpoll_init(void){ mutex_init(&pmutex); ep_poll_safewake_init(&psw); epi_cache = kmem_cache_create(“eventpoll_epi”,sizeof(st
2016-05-11 17:23:49
333
转载 select---3
select是什么 select是UNIX下一种IO多路转接(IO Multiplexing)的技术。select系统调用是用来让我们的程序监视多个文件描述符的状态变化的。程序会停在select这里等待,直到被监视的文件描述符有一个或多个发生了状态改变。 l select用法 int select(int maxfdp,fd_set *readfds,fd_set *
2016-05-11 16:52:18
412
转载 select----2
elect 实现分析 –2 【整理】来自 http://www.cnblogs.com/apprentice89/archive/2013/05/09/3070051.html l select相关的结构体比较重要的结构体由四个:struct poll_wqueues、struct poll_table_page、struct poll_table_entry、structpo
2016-05-11 16:50:25
288
转载 epoll-4
epoll用法回顾先简单回顾下如何使用C库封装的3个epoll相关的系统调用。更详细的用法参见http://www.cnblogs.com/apprentice89/archive/2013/05/06/3063039.htmlint epoll_create(int size);int epoll_ctl(int epfd, int op, int fd, struct epoll_
2016-05-11 16:48:20
360
转载 select----1
select源码结构图: 源码分析: #undef __NFDBITS#define __NFDBITS (8 * sizeof(unsigned long)) #undef __FD_SETSIZE#define __FD_SETSIZE 1024 #undef __FDSET_LONGS#defin
2016-05-11 16:46:47
305
转载 epoll ---2
copy from http://blog.youkuaiyun.com/chen19870707/article/details/42525887epoll是当前在Linux下开发大规模并发网络程序的热门人选,epoll 在Linux2.6内核中正式引入,和select相似,都是I/O多路复用(IO multiplexing)技术,按照man手册的说法:是为处理大批量句柄而作了改进的poll。
2016-05-11 16:46:04
505
转载 epoll 分析----2
copy from http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28541347&id=4285054分析了ET和LT的实现方式,那么分析他们的触发方式就容易多了。我们通过实现分析知道LT模式下epoll_wait被唤醒可以通过两种方式(图中红线和蓝线),而ET模式只能通过一种方式(图中红线)。所以ET模式下能被唤醒的情况
2016-05-11 16:43:58
230
转载 linkly seqlock rcu
likely或unlikely用于优化条件语句,其一般用法为:3725884266736043497.jpg条件判断之后会有两个出口,一个是真,一个是假。然而编译生成的目标代码是扁平的,其中的一个出口必须通过跳转来实现。考虑下面一个场景:1、判断条件;2、条件为真跳转到4;3、进行条件为假时的处理;4、进行条件为真时的处理;可见,如果条件为真,多了一次JMP
2016-05-10 20:04:31
357
转载 由mmap引发的SIGBUS
一直以来都觉得使用mmap读文件是非常高效、非常优雅的做法(参见《从"read"看系统调用的耗时》)。mmap之后,就可以通过内存访问的方式访问到文件里的内容,省去了read这样的系统调用。却不曾想过,mmap以后,如果读文件出错会发生什么……今晚看到一篇介绍apache bug的文章,里面说到,apache使用mmap来实现对静态文件的访问。在读文件之前,apache使用stat系统
2016-05-10 19:46:01
564
转载 linux 内存管理qqq
本文以32位机器为准,串讲一些内存管理的知识点。 来自http://www.cnblogs.com/zhaoyl/p/3695517.html1. 虚拟地址、物理地址、逻辑地址、线性地址 虚拟地址又叫线性地址。linux没有采用分段机制,所以逻辑地址和虚拟地址(线性地址)(在用户态,内核态逻辑地址专指下文说的线性偏移前的地址)是一个概念。物理地址自不必提。内核的虚拟地址和物
2016-05-10 19:45:11
378
原创 linux camera ---1
linux 摄像头驱动 :/** * struct fimc_dev - abstraction for FIMC entity * @slock: the spinlock protecting this data structure * @lock: the mutex protecting this data structure * @pdev: pointer to the F
2016-05-10 12:50:09
1063
转载 idr 机制 radix tree
来自:http://blog.youkuaiyun.com/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
1010
转载 线程 进程区别
线程私有数据(Thread-specific data,TSD):存储和查询与某个线程相关数据的一种机制。来自http://blog.youkuaiyun.com/ctthuangcheng/article/details/9357917在进程内的所有线程都共享相同的地址空间,即意味着任何声明为静态或外部变量,或在进程堆声明的变量,都可以被进程内所有的线程读写。一个线程真正拥有的唯一私有存储是处理
2016-05-09 17:47:43
512
原创 内存管理---slab机制 销毁对象
Linux内核中将对象释放到slab中上层所用函数为kfree()或kmem_cache_free()。两个函数都会调用__cache_free()函数。缓存回收对象基于以下原则1.本地高速缓存的空间还可以容纳空闲对象,则直接将对象放回本地高速缓存2.本地高速缓存的空间已满,则按batchcount的值将对象从本地高速缓存转移到slab中,转移是基于先进先出的原则的
2016-05-08 14:51:17
545
原创 内存管理 ---slab机制 分配对象
从一个缓存中分配对象总是遵循下面的原则:1.本地高速缓存中是否有空闲对象,如果有的话则从其中获取对象,2.如果本地高速缓存中没有对象,则从kmem_list3中的slab链表中寻找空闲对象并填充到本地高速缓存再分配;3.如果所有的slab中都没有空闲对象了,那么就要创建新的slab,再分配 。 来自:http://blog.youkuaiyun.com/vanbreaker/a
2016-05-08 14:31:47
812
原创 内存管理---创建 销毁slab
创建slab主要由函数cache_grow()实现,满足以下两个条件时,slab分配器将为高速缓存创建新的slab1.请求分配对象,但本地高速缓存没有空闲对象可以分配,需要填充2.kmem_list3维护的链表中没有slab或者所有的slab都处于FULL链表中
2016-05-08 12:13:01
566
原创 slab_--2 创建 销毁 cache
创建新的缓存必须通过kmem_cache_create()函数来完成,流程如下:1,从全局cache_cache中获得cache结构,因为全局cache_cache初始化对象的大小就是kmem_cache结构的大小,所以返回的指针正好可以转换为cache结构;调用 kmem_cache_zalloc(&cache_cache, gfp);2,获得slab中碎片大小,由函数cal
2016-05-08 12:08:53
604
原创 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
505
原创 内存管理---内存释放
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
1502
原创 内存管理-----伙伴系统---2
伙伴系统分配器大体上分为两类。__get_free_pages()类函数返回分配的第一个页面的线性地址;alloc_pages()类函数返回页面描述符地址。不管以哪种函数进行分配,最终会调用alloc_pages()进行分配页面;alloc_page最后调用统一接口;__alloc_pages_nodemask * This is the 'hear
2016-05-07 23:53:37
1313
原创 内存管理---伙伴系统---
内核使用伙伴系统来解决内存分配引起的外部碎片问题。一、数据结构描述struct zone {…… struct free_area free_area[MAX_ORDER];……};
2016-05-07 21:15:16
749
原创 high_memeory 映射---3
非连续内存管理区:非连续内存分配是指将物理地址不连续的页框映射到线性地址连续的线性地址空间,主要应用于大容量的内存分配。采用这种方式分配内存的主要优点是避免了外部碎片,而缺点是必须打乱内核页表,而且访问速度较连续分配的物理页框慢。 非连续内存分配的线性地址空间是从VMALLOC_START到VMALLOC_END,每当内核要用vmalloc类的函数进行非连续内存分配,就会申请一个v
2016-05-07 20:36:26
617
原创 内存管理--页表机制
建立永久的分页机制 在前面的内存映射介绍中,init_memory_mapping()只是构建了内核页表,作为临时的分页映射。例如只对高端内存固定映射区创建了页表结构,并没有对高端内存区永久映射区进行初始化。setup_arch()在执行完init_memory_mapping()和initmem_init()后,就会调用arch/x86/mm/init_32.c:paging_init
2016-05-07 00:10:34
2017
原创 内存管理---页表机制1
Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此Linux的虚拟地址空间也为0~4G。Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF)供内核使用,称为“内核空间”。而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF)供各个进程使用,称为“用户空间“。因为每个进程可以通过系统调用进入内核,因此Li
2016-05-06 21:50:34
3164
原创 内存管理--检测内存
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
1377
原创 内存管理-1
linux 内存管理基于分段、分页把逻辑地址转换为物理地址,同时有些RAM永久的分配给了内核使用用来存放内核代码以及静态数据。其余的RAM为动态内存。linux中采用了很多有效的管理方法,包括页表管理、高端内存(临时映射区、固定映射区、永久映射区、非连续内存区)管理、为减小外部碎片的伙伴系统、为减小内部碎片的slab机制、伙伴系统未建立之前的页面分配制度以及紧急内存管理等等。。
2016-05-06 11:33:59
535
转载 inside the c++ object
第一章 关于对象C语言中,“数据”和“处理数据的操作”十分开来的。由一组“分布在各个一功能味道想得函数中”的算法所驱动,他们处理的是共同的外部数据。而在C++中,则使用的是独立的“抽象数据类型abstract data type(ADT)”所驱动。从软件工程的角度看“一个ADT或CLASS hierar5chy的数据封装”比"在C程序中程序迎的使用全局数据好"。加上封装后的布局成本
2016-05-06 10:30:56
322
原创 进程调度--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
1293
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人