Linux内核架构
文章平均质量分 96
honghong96
这个作者很懒,什么都没留下…
展开
-
Linux Module详解
Module的一个例子: 创建两个文件hello.c文件#include <linux/init.h>#include <linux/module.h>MODULE_LICENSE("Dual BSD/GPL");static int hello_init(void){ printk(KERN_ALERT "Hello, world\n"); return 0;}stati原创 2017-02-02 16:44:03 · 8872 阅读 · 0 评论 -
Linux内核同步:completion
定义数据结构如下:struct completion { unsigned int done; //指示等待的事件是否完成。初始化时为0。 //如果为0,则表示等待的事件未完成。大于0表示等待的事件已经完成 wait_queue_head_t wait;//存放等待该事件完成的进程队列};初始化1) init_completion(&c原创 2017-02-05 12:33:41 · 687 阅读 · 0 评论 -
Linux内存管理:ARM Memory Layout以及mmu配置
在内核进行page初始化以及mmu配置之前,首先需要知道整个memory map。1. ARM Memory LayoutPAGE_OFFSET Start address of Kernel space 0xC000_0000lowmem Kernel direct-mapped RAM region (1:1 mapping) Maximum 896MHIGH_MEMORY En原创 2017-02-05 12:23:22 · 4751 阅读 · 0 评论 -
Linux内核同步:per_cpu变量
per cpu变量相关函数和宏DEFINE_PER_CPU_SHARED_ALIGNED(type,name):静态分配per_cpu数组,数组名为name,结构类型为typeDEFINE_PER_CPU(type,name) : 静态分配per_cpu数组,数组名为name,结构类型为typeper_cpu(name,cpu) : 为CPU选择一个每CPU数组元素,CPU由参数cpu指定,数组原创 2017-02-05 12:59:40 · 847 阅读 · 0 评论 -
Linux内存管理:HighMemory
HighMemory介绍Linux一般把整个4GB可以map的内存中的1GB用于低端内存。从0xC0000000开始的话(CONFIG_PAGE_OFFSET配置),低端内存的地址范围就是0xC0000000到high_memory地址。 high_memory = __va(arm_lowmem_limit - 1) + 1,arm_lowmem_limit也是0xff00000减去vmallo原创 2017-02-05 13:00:48 · 3647 阅读 · 0 评论 -
Linux内核同步:RCU
http://www.ibm.com/developerworks/cn/linux/l-rcu/index.html一、 引言众所周知,为了保护共享数据,需要一些同步机制,如自旋锁(spinlock),读写锁(rwlock),它们使用起来非常简单,而且是一种很有效的同步机制,在UNIX系统和Linux系统中得到了广泛的使用。但是随着计算机硬件的快速发展,获得这种锁的开销相对于CPU的速度在成倍转载 2017-02-05 13:01:37 · 408 阅读 · 0 评论 -
Linux系统启动那些事—基于Linux 3.10内核
Linux系统启动那些事—基于Linux 3.10内核csdn 我的空间的下载地址 ,有些做的效果网页上没了,感兴趣建议去上面地址下载pdf版的下载地址http://download.csdn.net/detail/shichaog/8054005 [email protected]启动流程概述也许你会好奇Linux是如何启动的?本文围转载 2017-02-02 16:12:07 · 5671 阅读 · 1 评论 -
Linux中断(interrupt)子系统
中断系统基本原理这个中断系列文章主要针对移动设备中的Linux进行讨论,文中的例子基本都是基于ARM这一体系架构,其他架构的原理其实也差不多,区别只是其中的硬件抽象层。内核版本基于3.3。虽然内核的版本不断地提升,不过自从上一次变更到当前的通用中断子系统后,大的框架性的东西并没有太大的改变。1. 设备、中断控制器和CPU一个完整的设备中,与中断相关的硬件可以划分为3类,它们分别是:设备、中断控制器原创 2017-02-22 23:27:55 · 4538 阅读 · 0 评论 -
Linux ALSA声卡驱动
概述ALSA是Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构,想了解更多的关于ALSA的这一开源项目的信息和知识,请查看以下网址:http://www.alsa-project.org/。在内核设备驱动层,ALSA提供了alsa-driver,同时在应用层,ALSA为我们提供了alsa-lib,应用程序只要调用alsa-lib提原创 2017-02-22 23:27:09 · 9628 阅读 · 0 评论 -
Linux:进程间通信
一般的Linux进程间通信的方法:pipesocketshared memoryFIFOMessage QueueSemaphoresShared MemoryAndroid另外还有Binder等,也是用的shared memory机制。这有专门的说明,这里就不多说了。pipepipe只能用于有同一个父进程的进程之间,或者在父进程和子进程之间进行通信。#include <unistd原创 2017-02-22 23:23:21 · 590 阅读 · 0 评论 -
Linux SPI总线和设备驱动架构之二:SPI通用接口层
通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了相应的数据结构,这些数据结构一部分是SPI设备、SPI协议驱动和SPI控制器的数据抽象,一部分是为了协助数据传输而定义的数据结构。另外,通用接口层还负责SPI系统与Linux设备模型相关的初始化工作。本原创 2017-02-22 23:19:09 · 2651 阅读 · 0 评论 -
Linux : CPU Idle
CPU Idle状态可以分为很多种Idle状态,在CPU准备进入idle的时候在很多状态中进行选择以达到省电的目的。CPU Idle相关的软件架构可以分以下几种:CPUIDLE core:CPUIdle的内核驱动,在kernel\drivers\cpuidle目录下。CPUIDLE sysfs:这部分向用户层提供CPUIDLE的相关节点,以提供信息给用户。 在/sys/devices/syst原创 2017-02-05 15:38:21 · 11953 阅读 · 0 评论 -
Linux 定时器的引擎:clock_event_device
http://blog.csdn.net/droidphone/article/details/8017604早期的内核版本中,进程的调度基于一个称之为tick的时钟滴答,通常使用时钟中断来定时地产生tick信号,每次tick定时中断都会进行进程的统计和调度,并对tick进行计数,记录在一个jiffies变量中,定时器的设计也是基于jiffies。这时候的内核代码中,几乎所有关于时钟的操作都是在ma转载 2017-02-05 15:35:45 · 822 阅读 · 1 评论 -
Linux:时间的维护者:timekeeper
http://blog.csdn.net/droidphone/article/details/7989566本系列文章的前两节讨论了用于计时的时钟源:clocksource,以及内核内部时间的一些表示方法,但是对于真实的用户来说,我们感知的是真实世界的真实时间,也就是所谓的墙上时间,clocksource只能提供一个按给定频率不停递增的周期计数,如何把它和真实的墙上时间相关联?本节的内容正是要讨论转载 2017-02-05 15:32:21 · 1703 阅读 · 0 评论 -
Linux:高精度定时器(HRTIMER)的原理和实现
http://blog.csdn.net/droidphone/article/details/8074892 上一篇文章,我介绍了传统的低分辨率定时器的实现原理。而随着内核的不断演进,大牛们已经对这种低分辨率定时器的精度不再满足,而且,硬件也在不断地发展,系统中的定时器硬件的精度也越来越高,这也给高分辨率定时器的出现创造了条件。内核从2.6.16开始加入了高精度定时器架构。在实现方式上,内核的高转载 2017-02-05 15:31:42 · 12564 阅读 · 0 评论 -
Linux内存管理: mmap详解
mmap系统调用mmap系统调用mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。munmap执行相反的操作,删除特定地址区域的对象映射。 当使用mmap映射文件到进程后,就可以直接操作这段虚拟地址进行文件的读写等操作,不必再调用read,write等系统调用.但需注意,直接对该段内存写时不会写入超过当前文件大小的原创 2017-02-05 15:23:00 · 1803 阅读 · 0 评论 -
Linux内核同步:同步规则和说明
什么是同步像下面的代码段里边一样,有一个栈。一个系统调用的函数从栈里边读,一个中断函数保存数据到栈里边。 这时候,这个栈的数据就是一个需要保护的数据。在多进程系统中,有以下几种情况下会出现race condition。(这里只讨论单核的情况)1.发生中断: task1在进入临界区准备读栈的内容的时候发生中断。中断函数放数据到栈。task1在中断返回之后所读的内容,就不是原来预计的内容了。2.内核抢原创 2017-02-05 15:22:11 · 758 阅读 · 0 评论 -
Linux内核架构: workqueue
http://lwn.net/Articles/403891/linux内核中断处理的工作队列workqueue机制工作队列(workqueue)是另外一种将工作推后执行的形式。工作队列可以把工作推后,交由一个内核线程去执行,也就是说,这个下半部分可以在进程上下文中执行。 这样,通过工作队列执行的代码能占尽进程上下文的所有优势。最重要的就是工作队列允许被重新调度甚至是睡眠。 那么,什么情况下使用工原创 2017-02-05 15:10:29 · 1108 阅读 · 0 评论 -
64位ARMv8的芯片-reserved memory-mmu
基于64位ARMv8的一些AP芯片,支持32位和64位代码之间无缝运行(比如有芯片在用CortexA53 OCTA core)。以之前做过的项目为例,说明64位芯片的寄存器,以及说明在64为模式下的内存地址表示和整个Linux系统的Memory Map。 以下是整个物理内存块的大小-起始地址,这个项目的内存地址是2GB。ATAG_MEM: 4 54410002 20000000 40000000原创 2017-02-05 15:04:14 · 2539 阅读 · 1 评论 -
Linux内核架构:动态频率调节系统CPUFreq
概述在Linux中,内核提供了一套框架模型来完成CPU频率的动态调节,以达到省电的目的。 这就是所谓的CPUFreq系统。1. sysfs接口我们先从CPUFreq提供的sysfs接口入手,直观地看看它提供了那些功能。以下是我的电脑输出的结果:droidphone@990:~$ cd /sys/devices/system/cpudroidphone@990:/sys/devices/syst原创 2017-02-05 15:00:07 · 3500 阅读 · 0 评论