![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux kernel
文章平均质量分 78
Yannick_J
Yes-亚历山大的陀螺
展开
-
内核空间申请内存的专用API:kmalloc、vmalloc、kzalloc、get_free_pages及GFP_FLAG标志位
转自:http://www.cnblogs.com/yfz0/p/5829443.html在内核模块中申请分配内存需要使用内核中的专用API:kmalloc、vmalloc、kzalloc、kcalloc、get_free_pages;当然,设备驱动程序也不例外;对于提供了MMU功能的处理器而言,Linux提供了复杂的内存管理系统,使得进程所能访问到的地址空间可以达到4GB;而这4GB的空间...转载 2019-04-04 21:31:45 · 651 阅读 · 0 评论 -
Linux内核中常见内存分配函数
转载:Linux内核中常见内存分配函数1.原理说明Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示。四级页表分别为:l 页全局目录(Page Global Directory)l 页上级目录(Page Upper Directory)l 页中间目录(Pa...转载 2019-04-17 09:13:56 · 2837 阅读 · 1 评论 -
Linux中断系列二:Tasklets 机制浅析
转载:Linux 设备驱动开发 —— Tasklets 机制浅析为什么要使用tasklet?(tasklet和软中断的区别)由于软中断必须使用可重入函数,这就导致设计上的复杂度变高,作为设备驱动程序的开发者来说,增加了负担。而如果某种应用并不需要在多个CPU上并行执行,那么软中断其实是没有必要的。因此诞生了弥补以上两个要求的tasklet。它具有以下特性:a)一种特定类型的tasklet只...转载 2019-04-17 09:10:24 · 351 阅读 · 0 评论 -
Linux 设备驱动的并发控制
转载:Linux 设备驱动的并发控制 Linux 设备驱动中必须要解决的一个问题是多个进程对共享的资源的并发访问,并发的访问会导致竞态,即使是经验丰富的驱动工程师也常常设计出包含并发问题bug 的驱动程序。一、基础概念1、Linux 并发相关基础概念a -- 并发(concurrency):并发指的是多个执行单元同时、并发被执行,而并发的执行单元对共享资源(硬件资源和软...转载 2019-04-14 20:47:17 · 300 阅读 · 0 评论 -
Linux 设备驱动中的 I/O模型(一): 阻塞和非阻塞I/O
转载:Linux 设备驱动中的 I/O模型(一): 阻塞和非阻塞I/O 在前面学习网络编程时,曾经学过I/O模型Linux 系统应用编程——网络编程(I/O模型),下面学习一下I/O模型在设备驱动中的应用。 回顾一下在Unix/Linux下共有五种I/O模型,分别是:a -- 阻塞I/Ob -- 非阻塞I/Oc -- I/O复用(select和poll)...转载 2019-04-14 20:49:51 · 316 阅读 · 0 评论 -
Linux 设备驱动中的 I/O模型(二): 异步通知和异步I/O
转载:Linux 设备驱动中的 I/O模型(二): 异步通知和异步I/O 阻塞和非阻塞访问、poll() 函数提供了较多地解决设备访问的机制,但是如果有了异步通知整套机制就更加完善了。 异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上“中断”的概念,比较准确的称谓是“信号驱动的异步I/O”。信号是在软件层...转载 2019-04-14 21:31:21 · 141 阅读 · 0 评论 -
TLB的作用及工作过程
转载:TLB的作用及工作过程前言:页表一般都很大,并且存放在内存中,所以处理器引入MMU后,读取指令、数据需要访问两次内存:首先通过查询页表得到物理地址,然后访问该物理地址读取指令、数据。为了减少因为MMU导致的处理器性能下降,引入了TLB,TLB是Translation Lookaside Buffer的简称,可翻译为“地址转换后援缓冲器”,也可简称为“快表”。简单地说,TLB就是页表的...转载 2019-04-22 10:09:10 · 4439 阅读 · 1 评论 -
linux kernle 同步原语
转载:同步原语如何避免由于对共享数据的不安全访问导致的数据崩溃? 内核使用的各种同步技术:技术 说明 适用范围 每CPU变量 在CPU之间复制数据结构 所有CPU 原子操作 对一个计数器原子地“读-修改-写”的指令 所有CPU 内存屏障 避免指令重新排序 本地CPU或所有CPU 自旋锁 加锁时忙等 所有C...转载 2019-04-18 10:41:45 · 1428 阅读 · 0 评论 -
linux percpu系列一:机制解析
linux percpu机制解析//basedonLinux V3.14 source code一、概述每cpu变量是最简单也是最重要的同步技术。每cpu变量主要是数据结构数组,系统的每个cpu对应数组的一个元素。一个cpu不应该访问与其它cpu对应的数组元素,另外,它可以随意读或修改它自己的元素而不用担心出现竞争条件,因为它是唯一有资格这么做的cpu。这也意味着每cpu变量基本上...转载 2019-04-18 13:49:05 · 365 阅读 · 0 评论 -
linux percpu系列二:CPU私有变量(per-CPU变量)
CPU私有变量(per-CPU变量)一、简介2.6内核上一个新的特性就是per-CPU变量。顾名思义,就是每个处理器上有此变量的一个副本。per-CPU的最大优点就是,对它的访问几乎不需要锁,因为每个CPU都在自己的副本上工作。tasklet、timer_list等机制都使用了per-CPU技术。当创建一个per-cpu变量时,系统中的每一个处理器都会拥有该变量的独有副本。由于每个...转载 2019-04-18 13:51:53 · 994 阅读 · 0 评论 -
调试器工作原理系列一: 基础篇
调试器工作原理系列一: 基础篇本文是一系列探究调试器工作原理的文章的第一篇。我还不确定这个系列需要包括多少篇文章以及它们所涵盖的主题,但我打算从基础知识开始说起。关于本文我打算在这篇文章中介绍关于Linux下的调试器实现的主要组成部分——ptrace系统调用。本文中出现的代码都在32位的Ubuntu系统上开发。请注意,这里出现的代码是同平台紧密相关的,但移植到别的平台上应该不会太难。...转载 2019-04-18 14:28:10 · 531 阅读 · 0 评论 -
Linux设备树(Device Tree)机制
目录1. 设备树(DeviceTree)基本概念及作用2. 设备树的组成和使用2.1. DTS和DTSI2.2. DTC2.3. DTB2.4. Bootloader3. 设备树中dts、dtsi文件的基本语法3.1. chosennode3.2. aliasesnode3.3. memorynode3.4. ...转载 2019-04-19 11:03:40 · 2533 阅读 · 0 评论 -
flash驱动(一):Linux MTD子系统
转载:Linux MTD子系统 _从模型分析到Flash驱动模板MTD(Memory Technology Device)即常说的Flash等使用存储芯片的存储设备,MTD子系统对应的是块设备驱动框架中的设备驱动层,可以说,MTD就是针对Flash设备设计的标准化硬件驱动框架。本文基于3.14内核,讨论MTD驱动框架。MTD子系统框架设备节点层:MTD框架可以在/dev下创建字...转载 2019-04-19 11:12:13 · 1292 阅读 · 0 评论 -
存储器结构、cache、DMA架构分析
转载:存储器结构、cache、DMA架构分析存储器的层次结构高速缓冲存储器 cache读cache操作cache如果包含数据就直接从cache中读出来,因为cache速度要比内存快如果没有包含的话,就从内存中找,找到后就放到cache中去,以后再读的话就直接从cache读了,下次访问很多次的时候就会快很多,相当于提高了命中...转载 2019-04-17 09:11:26 · 627 阅读 · 0 评论 -
一针见血之系统调用(下)
转载:一针见血之系统调用(下)上一篇文章中我们已经对整个系统调用从用户态到内核态的过程做了一个大概的说明。为了更加深入的理解,我们这篇文章再为大家展现在内核态系统调用的具体是怎么实现的,在这篇文章中我们直接把内核系统调用的源码拿出来进行分析,让大家更容易理解。内核中的系统调用部分如下图的红色方框里所示。在用户态的代码中我们可以看到在用户态下是通过中断向量int 0x80跳转到内核态...转载 2019-04-16 11:19:25 · 164 阅读 · 0 评论 -
一针见血之系统调用(上)
转载:一针见血之系统调用(上)我们都知道操作系统主要是管理着计算机的硬件和软件资源,为用户态进程与硬件设备进行交互提供了一组接口——系统调用。这为应用程序开发人员提供良好的环境来使得应用层序具更好的兼容性。系统调用的原理操作系统中的状态分为管态(核心态)和目态(用户态)。特权指令:一类只能在核心态下运行而不能在用户态下运行的特殊指令。用户程序只在用户态下运行,有时需要访问系统核心功能,这...转载 2019-04-16 11:20:00 · 245 阅读 · 0 评论 -
[收藏]时钟中断(Timer Interrupt)与 Linux内核调度
转载:深入解读Linux进程调度Schedule转载原因:通俗易懂,逻辑清晰。6. 时钟中断(Timer Interrupt)时钟中断是系统中调度和抢占的驱动因素,在时钟中断中会进行进程运行时间的更新等,并更新调度标志,以决定是否进行调度。下面以Powerpc FSL Booke架构芯片ppce500为例来看具体代码,其他架构类似,设计思想相同。6.1 时钟中断的注册首先在系统最开...转载 2019-04-10 14:28:05 · 7324 阅读 · 0 评论 -
【基础】 理解Memory Barrier(内存屏障)
转自:理解Memory Barrier(内存屏障)本文例子均在 Linux(g++)下验证通过,CPU 为 X86-64 处理器架构。所有罗列的 Linux 内核代码也均在(或只在)X86-64 下有效。本文首先通过范例(以及内核代码)来解释 Memory Barrier,然后介绍一个利用 Memory Barrier 实现的无锁环形缓冲区。Memory Barrier 简介程序在...转载 2019-04-11 11:16:41 · 325 阅读 · 0 评论 -
【基础】CPU亲和性(affinity)指定线程到某个CPU运行
转载:CPU亲和性(affinity)sched_setaffinity() 和 sched_getaffinity() CPU_SET()与CPU_ZERO()CPU亲和性(affinity)就是进程要在某个给定的CPU上尽量长时间的运行而不被迁移到其他处理器的倾向性。linux内核进程调度器天生具有软CPU亲和性(affinity)的特性,着意味着进程通常不会在处理器之间频繁迁移。这种...转载 2019-04-11 16:19:12 · 1772 阅读 · 0 评论 -
[基础] linux发行版一般启动顺序
转载:linuxPC发行版一般启动顺序一般linuxPC发行版都经历了BIOS,MBR,BootLoader,内核,一系列过程,下面说的就是这个过程针对嵌入式设备启动:嵌入式启动顺序 - uboot之前,请参考嵌入式启动u-boot分析,为什么强调PC发行版呢?因为现在有专门为arm做的linux发行版问世了PC一般用的是intel 或者amd 处理器,架构一般为 x86 或者 x...转载 2019-04-11 16:32:06 · 141 阅读 · 0 评论 -
Linux的虚拟内存详解(MMU、页表结构)
---------------------作者:Yngz_Miao来源:CSDN原文:https://blog.csdn.net/qq_38410730/article/details/81036768---------------------一、概要(页面的加载):当处理器试图访问一个虚存页面时,首先到页表中去查询该页是否已映射到物理页框中,并记录在页表中。如果在,则...转载 2019-04-08 14:27:18 · 2093 阅读 · 0 评论 -
CPU是如何访问到内存的?--MMU最基本原理
转载:宋宝华: CPU是如何访问到内存的?--MMU最基本原理假设页表只有一级对于一个有MMU的CPU而言,MMU开启后,CPU是这样寻址的:CPU任何时候,一切时候,发出的地址都是虚拟地址,这个虚拟地址发给MMU后,MMU通过页表来在页表里面查出来这个虚拟地址对应的物理地址是什么,从而去访问外面的内存条。MMU里面的页表地址寄存器(CR3),记录了页表本身的存放位置。...转载 2019-04-08 16:34:35 · 520 阅读 · 0 评论 -
内存管理(系列一): slab分配器
转载:slab分配器伙伴算法和slab分配器伙伴Buddy算法解决了外部碎片问题.内核在每个zone区管理着可用的页面,按2的幂级(order)大小排成链表队列,存放在free_area数组。具体buddy管理基于位图,其分配回收页面的算法描述如下,buddy算法举例描述:假设我们的系统内存只有16个页面RAM。因为RAM只有16个页面,我们只需用四个级别(orders)的...转载 2019-04-12 12:34:08 · 293 阅读 · 0 评论 -
内存管理(系列二): 页面回收
转载:页面回收/侧重机制关于页面的使用在之前的一些文章中,我们了解到linux内核会在很多情况下分配页面。1、内核代码可能调用alloc_pages之类的函数,从管理物理页面的伙伴系统(管理区zone上的free_area空闲链表)上直接分配页面(见《linux内核内存管理浅析》)。比如:驱动程序可能用这种方式来分配缓存;创建进程时,内核也是通过这种方式分配连续的两个页面,作为进程的thr...转载 2019-04-12 13:07:43 · 643 阅读 · 0 评论 -
内存管理(系列三): 内存管理(系列二): 页面回收
转载:内存管理架构针对上图,说几句,[地址映射](图:左中)linux内核使用页式内存管理,应用程序给出的内存地址是虚拟地址,它需要经过若干级页表一级一级的变换,才变成真正的物理地址。想一下,地址映射还是一件很恐怖的事情。当访问一个由虚拟地址表示的内存空间时,需要先经过若干次的内存访问,得到每一级页表中用于转换的页表项(页表是存放在内存里面的),才能完成映射。也就是说,要实现一次内...转载 2019-04-12 13:10:01 · 277 阅读 · 0 评论 -
Linux下逻辑地址、线性地址、物理地址(系列一:概要)
转载:Linux下逻辑地址、线性地址、物理地址详细总结转载原因:通俗易懂,逻辑清晰。 一、逻辑地址转线性地址 机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到。 我们写个最简单的hello world程序,用gcc编译,再反编译后会看到以下指令: ...转载 2019-04-09 16:09:36 · 205 阅读 · 0 评论 -
Linux下逻辑地址、线性地址、物理地址(系列二:分段、分页详解)
转载:Linux下逻辑地址、线性地址、物理地址详细总结转载原因:通俗易懂,逻辑清晰。本贴涉及的硬件平台是X86,如果是其它平台,嘻嘻,不保证能一一对号入座,但是举一反三,我想是完全可行的。一、概念物理地址(physical address)用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物...转载 2019-04-09 16:11:59 · 424 阅读 · 0 评论 -
Linux下逻辑地址、线性地址、物理地址(系列三:总结)
转载:Linux下逻辑地址、线性地址、物理地址详细总结转载原因:通俗易懂,逻辑清晰。分析linux内存管理机制,离不了上述几个概念,在介绍上述几个概念之前,先从《深入理解linux内核》这本书中摘抄几段关于上述名词的解释:一、《深入理解linux内核》的解释1. 逻辑地址(Logical Address) 包含在机器语言指令中用来指定一个操作数或一条指令的地址(有...转载 2019-04-09 16:18:49 · 506 阅读 · 0 评论 -
进程系统调用——fork函数深入理解
转载 进程系统调用——fork函数深入理解当我们在一个现代系统上运行一个程序的时候,我们会得到一个假象,就好像我们的程序是系统中当前运行的唯一程序。我们的程序好像是独占的使用处理器和存储器。处理器就是无间断的一条一条地执行我们程序中的指令。最后我们程序中的代码和数据显得好像是系统存储器中唯一的对象。这些假象都是通过进程的概念提供给我们的。下面我们来看一下一段程序:#include <...转载 2019-04-16 11:00:33 · 1240 阅读 · 0 评论 -
linux调度器的配置参数
分类专栏: linux基础 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:linux调度器(九)——调度器的配置参数调度器的配置参数/proc/sys/kernel/sched_min_granularity_ns(4000000ns):sysctl_sched_min_granularity,表示进程最少运行时...转载 2019-09-12 14:32:17 · 1998 阅读 · 0 评论