水滴石穿
FSak47
这个作者很懒,什么都没留下…
展开
-
arm-linux之uboot向内核传递参数
抛开uboot不谈,先看看uboot给内核传递的参数是什么样的东西,在arch/arm/kernel/setup.h文件中的struct tag结构体:struct tag { struct tag_header hdr; union { struct tag_core core;原创 2013-08-07 11:25:42 · 4046 阅读 · 0 评论 -
linux进程地址空间(2) 缺页异常详解(2)请求调页详解
接上一篇回到函数do_page_fault,如果不是内核的缺页异常而是用户进程的缺页异常,那么调用函数__do_page_fault,这个应该是本文的重点,主要讨论的是用户进程的缺页异常,结合最前面说的用户进程产生缺页异常的四种情况,函数__do_page_fault都会排查到,源码如下:__do_page_fault(struct mm_struct *mm, unsigned long原创 2013-08-28 10:27:19 · 4085 阅读 · 0 评论 -
linux进程地址空间(3) 内存映射(2)malloc与do_brk
下面再看函数do_brk,事实上do_brk和do_mmap几乎一样,因为它们的本质都是一样的;这里多说一下它由mm/mmap.c文件的系统调用SYSCALL_DEFINE1调用,系统调用的问题如前几篇文章一样,后续会有专题讨论它,这里直接看SYSCALL_DEFINE1函数源码:SYSCALL_DEFINE1(brk, unsigned long, brk){ uns原创 2013-08-28 20:40:08 · 2590 阅读 · 0 评论 -
I2C设备驱动详述
I2C驱动需要把握两大部分内容,一个是理解linux的I2C设备驱动模型,另一个是操作I2C控制器的方法,后者还需要理解I2C硬件逻辑。但首先要理解I2C及其在linux中到底是怎么一回事:一、I2C是怎么一回事:CPU目前一般都集成I2C接口也就是I2C控制器,通过控制它可以产生I2C相关的电路信号诸如起始、收发、终止,要理解I2C本身到底是怎么一回事,推荐文档http://wenku.原创 2013-12-18 11:29:21 · 2448 阅读 · 0 评论 -
netlink详解--以本人项目为实例
二、2.10代码用户进程配置方式:2.1、查改内核方式的比较:查改内核有如下几种方式:1、 直接通过文件系统(procfs/sysfs);2、 增加自己的系统调用;3、 使用统一系统调用(ioctl);4、 netlink;第一种方式的好处是无需增加用户态代码,直接通过cat或echo可配置,但缺点是在内核里要是加太多比较乱,另外,总在linux shell下操原创 2013-12-18 14:40:56 · 8231 阅读 · 0 评论 -
SPI详解及SPI接口flash举例
一、SPI总线是怎么一回事:推荐文章http://blog.csdn.net/ce123_zhouwei/article/details/6897293,关于SPI与uart、i2c的比较,推荐文章http://www.cnblogs.com/lucky-apple/archive/2008/07/03/1234581.html,SPI最大的特点是它是它是同步的(有时钟,和uart最大的区别,原创 2013-12-18 10:41:41 · 27104 阅读 · 0 评论 -
uart串口驱动
一、背景:该设备连接4个串口芯片,每个串口芯片连接一个带有串口接口的智能电表,远程主机通过连接到设备实现读取/控制4个智能电表。普然CPU没有4个串口接口,所以需要额外的方式实现连接,使用的方式是通过本地localbus的方式,通过连接到一片CPLD上,该CPLD连接4个智能电表的串口,CPU通过访问CPLD实现间接访问4个串口,如下图: 二、CPU访问机制前面已提到,普然原创 2013-12-18 10:22:56 · 3065 阅读 · 0 评论 -
linux的线程(posix thread)
转载原文地址:http://blog.chinaunix.net/uid-20788636-id-1841334.html线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程。现在,多线程技术已经被许多操转载 2014-02-08 15:57:20 · 1450 阅读 · 0 评论 -
多路复用之epoll
原文地址:http://blog.csdn.net/sparkliang/article/details/4836536Linux Epoll介绍和程序实例1. Epoll是何方神圣?Epoll可是当前在Linux下开发大规模并发网络程序的热门人选,Epoll 在Linux2.6内核中正式引入,和select相似,其实都I/O多路复用技术而已,并没有什么神秘的。其实在Lin转载 2014-02-11 11:14:59 · 1023 阅读 · 0 评论 -
ET模式下epoll编程需要注意的问题
原文地址:http://www.ccvita.com/515.html在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK)从字面上看, 意思是:EAGAIN: 再试一次,EWOULDBLOCK: 如果这是一个阻塞socket, 操作将被block,perror输出: R转载 2014-02-11 11:48:28 · 1171 阅读 · 0 评论 -
linux的信号(signal)
原文地址:http://blog.csdn.net/muge0913/article/details/7331129要对一个信号进行处理,就需要给出此信号发生时系统所调用的处理函数。可以对一个特定的信号(除去SIGKILL和SIGSTOP信号)注册相应的处理函数。注册某个信号的处理函数后,当进程接收到此信号时,无论进程处于何种状态,就会停下当前的任务去执行此信号的处理函数。转载 2014-02-11 16:26:14 · 1272 阅读 · 0 评论 -
HTTP快速入门
原文地址:http://www.cnblogs.com/shenliang123/archive/2012/04/25/2470435.htmlHTTP快速入门HTTP对于因特网来说可谓是无处不在,但我们可能对他熟视无睹;这个也很正常,如果你不搞什么web service或分布式,你接触HTTP协议也就是在定义一个超链接或为一个表单设置method属性,但作为搞转载 2014-02-12 17:38:25 · 908 阅读 · 0 评论 -
linux进程地址空间(3) 内存映射(1)mmap与do_mmap
如果已经看了博客中本系列文档的前面的几篇文章,应该就已经对malloc、mmap大致了解了,它们就是在堆中创建(或合并)所需虚拟地址的vma线性区,换句话说,就是达到进程地址空间中要有满足要求的vma,但不会给vma映射物理页(除非一定要求,即vma的flags标识了页锁定标志VM_LOCKED),这是linux的对用户进程物理页分配的推后原则,把握这个原则有助于分析malloc/mmap乃至理解原创 2013-08-28 20:36:22 · 7227 阅读 · 1 评论 -
linux进程地址空间(2) 缺页异常详解(3)写时复制COW详解
接上一篇现在分析写时复制COW,对于写时复制,首先把握一点就是只有写操作时才有可能触发写时复制,所以首先总要判断异常flag是否含有标志FAULT_FLAG_WRITE,然后判断二级页表条目值是否含有L_PTE_WRITE标志,这是意味着这个物理页是否可写,如果不可写则说明应该进入写时复制流程,调用处理函数do_wp_page;可见,COW的应用场合就是访问映射的页不可写,它包括两种情况,原创 2013-08-28 13:43:07 · 3117 阅读 · 0 评论 -
详解slab机制(2) 创建slab的过程
2.2、创建slab的过程:现在去看结构kmem_cache的各个成员定义是很模糊的,直接看函数源码:struct kmem_cache *kmem_cache_create (const char *name, size_t size, size_t align, unsigned long flags, void (*ctor)(void *)){原创 2013-08-21 09:33:01 · 2712 阅读 · 1 评论 -
详解slab机制(4) slab初始化
2.4、Slab初始化:最后才描述初始化,原因就是在不理解slab的原理和使用,不理解cache,空看初始化会白费很多时间和精力;其实看到这里,应该可以对slab的初始化能猜出大概了,在start_kernel的mm_init函数中调用函数kmem_cache_init初始化slab,为了能创建各种长度的cache,尤其是struct array和struct kmem_list3这两原创 2013-08-21 09:37:22 · 1734 阅读 · 0 评论 -
详解slab机制(1) slab是什么
目前有很多讲slab的文章,要么是纯讲原理画一堆图结合源码不深导致理解困难,要么是纯代码注释导致理解更困难,我在猛攻了一周时间后,细致总结一下slab,争取从原理到源码都能细致的理解到并立刻达到清楚的使用。一、slab分配器概述:有了伙伴系统buddy,我们可以以页为单位获取连续的物理内存了,即4K为单位的获取,但如果需要频繁的获取/释放并不大的连续物理内存怎么办,如几十字节几百字节的获取原创 2013-08-21 09:29:29 · 6744 阅读 · 0 评论 -
详解slab机制(3) slab分配机制
2.3、slab分配机制:不论kmalloc还是kmem_cache_alloc,最终都是调用函数__cache_alloc,这是给调用者分配slab的总接口:static __always_inline void *__cache_alloc(struct kmem_cache *cachep, gfp_t flags, void *caller){ unsi原创 2013-08-21 09:34:29 · 2628 阅读 · 0 评论 -
arm-linux内存页表创建
linux的内存(正式)页表是在内核代码执行到start_kernel函数后执行paging _init函数建立的,这里要注意一个事情就是说,这里paging_init函数可以正常创建内存页表的条件有两个:1、 meminfo已初始化:即初始化物理内存各个node的各个bank,一般对于小型arm嵌入式设备,不涉及多个内存就是一个node和一个bank;这部分原创 2013-08-08 15:32:38 · 6254 阅读 · 0 评论 -
linux arm的高端内存映射(1) vmalloc
高端内存映射 与高端映射对立的是低端映射或所谓直接映射,内核中有关变量定义它们的它们的分界点,全局变量high_memory,该变量定义在mm/memory.c文件中(存在MMU的前提下),可见不区分体系结构,对于当前我手头的marvell的arm设备即对于arm体系结构,high_memory在初始化阶段的创建内存页表时初始化值,它的值就是:物理内存最后一个node的末尾,比如物理内存只原创 2013-08-22 17:06:41 · 3668 阅读 · 0 评论 -
linux arm的高端内存映射(2) 永久映射和临时映射
一、永久映射和临时映射:2.1、永久映射:依然把前面描述vmalloc的文章的图搬上来:high_memoryVMALLOC_STARTVmalloc 14KB隔离带Vmalloc 2原创 2013-08-22 17:09:15 · 3042 阅读 · 0 评论 -
arm-linux之bootmem分配器
所谓bootmem分配器,是内核页表创建后的临时使用的内存分配器,它将在后面的mem_init函数初始化伙伴系统时被伙伴系统取代,即它是一个过渡手段。理解bootmem,一方面有利于对内存管理尤其内核启动阶段阶段内存管理的理解,另一方面也有利于伙伴系统的理解。在函数bootmem_init中,对每一个node执行bootmem_init_node,bootmem_init_node又对该nod原创 2013-08-12 16:09:19 · 1659 阅读 · 0 评论 -
linux进程地址空间(1) fork/clone/vfork详解(1)
开门见山,在arch/arm/kernel/sys_arm.c文件中,有这样三个函数:sys_fork、sys_vfork、sys_clone,它们都是在创建进程,分别对应系统调用fork()、vfork()、clone(),下面是它们在arm中的函数实现:顺便说一下,系统调用是如何对应到内核接口函数的(fork()->sys_fork),在之后会有文章专门研讨,这里重点讨论的是进程地址空间的原创 2013-08-28 10:17:05 · 2044 阅读 · 1 评论 -
linux进程地址空间(1) fork/clone/vfork详解(2)
接上一篇,dup_mmap函数源码如下:static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm){ struct vm_area_struct *mpnt, *tmp, **pprev; struct rb_node **rb_link, *rb_parent;原创 2013-08-28 10:19:25 · 2364 阅读 · 0 评论 -
linux进程地址空间(2) 缺页异常详解(1)原理和内核缺页异常处理
首先明确下什么是缺页异常,CPU通过地址总线可以访问连接在地址总线上的所有外设,包括物理内存、IO设备等等,但从CPU发出的访问地址并非是这些外设在地址总线上的物理地址,而是一个虚拟地址,由MMU将虚拟地址转换成物理地址再从地址总线上发出,MMU上的这种虚拟地址和物理地址的转换关系是需要创建的,并且MMU还可以设置这个物理页是否可以进行写操作,当没有创建一个虚拟地址到物理地址的映射,或者创建了这样原创 2013-08-28 10:23:03 · 4029 阅读 · 0 评论 -
HTTP协议的详解
原文地址:http://blog.csdn.net/tianmohust/article/details/6779830引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展转载 2014-02-12 17:28:14 · 2617 阅读 · 0 评论