![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux内核
文章平均质量分 86
阿曼
这个作者很懒,什么都没留下…
展开
-
platform型设备在/dev目录下自动创建设备节点的分析
系统启动过程中platform设备、驱动注册完毕,为什么在/dev目录下就自动创建好设备节点了?在/dev目录自动创建设备节点可以通过class_create(),然后再device_create()。但是在跟踪内核platform注册过程中可以发现,其实这里面并未调用上诉两个函数,那么platform注册后如何在/dev目录下创建设备文件节点?int device_a原创 2012-03-15 17:04:25 · 5320 阅读 · 2 评论 -
Linux内存管理之内核分页机制(paging_init)初始化
背景前面分析了kernel boot阶段内存管理实现的分段机制,可以发现页表描述符是按照ARM MMU硬件页表转换逻辑来设计的。kernel在初始化过程中只映射了内核 image部分的物理内存,在某个合适的时候内核需要将尽可能多的物理内存映射到页表中。 Linux设计为通用的操作系统,为了便于移植需要抽象出一些硬件细节,我们在驱动代码中看到大量的core层代码就是这个思想的体现。内核中只有和...原创 2018-04-09 16:05:13 · 2761 阅读 · 0 评论 -
linux内存管理之boot阶段identity mapping及MMU开启过程
为了准备面试,复习下kernel内存管理相关内容,顺便写个内存管理的系列文章做记录。 U-Boot跳转到内核时候MMU是关闭的,所以在内核boot阶段需要开启MMU,开MMU之前就需要初始化页表。 boot阶段的页表创建是通过函数__create_page_table来完成的,代码位于arch/arm/kernel/head.S中基本宏变量PAGE_OFFSET 这个变量一般被定义...原创 2018-04-03 11:21:08 · 1909 阅读 · 0 评论 -
Linux内存管理之SLAB原理浅析。
前言1.以下这篇文章是2015年我所在的via-telecom小组学习内存知识时整理的笔记。最近复习内存管理又拿出来看了一遍,庆幸当时阅读时留了这份笔记,不然重头看又要花费很多时间。当时画了很多visio图片且加上了via-telecom的copyright。虽然目前via-telecom被intel收购了,为了纪念在via-telecom的岁月暂且保留这些copyright。如果涉及了版权问...原创 2018-04-17 16:38:14 · 21209 阅读 · 4 评论 -
Linux内存管理之SLUB和SLAB之间的区别
前言前一篇讲了SLAB的基本原理,本来这篇打算写SLUB的原理。但在CSDN中发现了一篇非常好的描述SLUB原理的文章。链接:https://blog.csdn.net/lukuen/article/details/6935068 重复造轮子没必要,且就算重新可能也没他写得好。本着拿来主义,直接参考之。但是为了帮助自己以后快速回顾SLUB的原理,这里重点记录下kmem_cache_node这种ca原创 2018-04-25 16:33:33 · 6385 阅读 · 0 评论 -
vmalloc浅析
vmalloc的流程比较简单理解起来没什么难度,大致分为1.为vm管理数据结构分配空间,包括vm_struct和vmap_area 2.根据size申请合适的物理内存 3.修改页表条目。这篇blog就简单的记录下vmalloc的实现流程,以及部分容易被误导的地方(如vmalloc真的全部都来自于high memory吗?)。先提几个问题:vmalloc分配的物理内存会存在浪费吗?vma...原创 2018-05-29 00:25:23 · 1895 阅读 · 0 评论 -
Linux用户进程创建过程浅析
前言网上分析内核进程创建初始化的文章很多,例如:https://www.cnblogs.com/LittleHann/p/3853854.html,这位仁兄分析的非常详细和深入,非常值得初次看这段代码的人参考。而这篇文章属于进阶版,跳过基本概念的解释,着重从代码的角度来理解一些平常不容易理解的概念。比如一般都说进程有自己独立的空间,线程则共享;线程有自己的独立内核栈等等,像这些概念在代码上是怎...原创 2018-07-09 23:03:03 · 708 阅读 · 0 评论 -
Linux内核缺页二三事
前言我们知道虚拟空间和物理内存是通过页表建立起映射关系的,当访问某段虚拟内存时,这种映射关系很有可能是尚未建立的,也有可能是在fork了之后页表被设置了WR模式。如果此时进程想往这部分区域写数据时,就会导致处理器产生异常。内核需要捕获并“修复”这种异常,这一过程就是缺页异常处理。硬件支持不论是空pte还是pte被设置为wr模,如果向里写数据肯定会触发处理器异常,而且应该是MMU发生的异...原创 2018-07-18 00:09:05 · 3316 阅读 · 0 评论 -
TLB中ASID和nG bit的关系
贴一篇当年关于TLB的笔记。TLB是硬件上的一个cache,用于提升访问页表(这里应该是二级页表)的速度。MMU在将虚拟地址转换成物理地址时首先去TLB中找合适entry,如果能找到,则立即返回物理地址;如果TLB中找不到,则需访问Memory中的页表,且会加载相关entry到TLB中,以备下次MMU转换使用。 这个过程中存在一个问题,因为process的页表具有私密性,且kernel pr...原创 2018-07-18 00:12:01 · 2288 阅读 · 2 评论 -
Linux ELF文件和VMA间的关系
本来打算跟一下内核do_execve的实现,然后记录一下。但是在看的过程中发现已经有很多人写过非常棒的文章了,比如: https://blog.csdn.net/conansonic/article/details/53740670 写得非常详细了,所以跟代码的文章不写。这篇主要记录静态的二进制代码如何变成一个进程的。这中间会设计编译链接,execve的。Markdown和扩展Markdo...原创 2018-09-04 23:17:23 · 2235 阅读 · 4 评论 -
匿名映射/线性映射的VMA分配和对应的缺页处理
现在知道elf文件中有PT_LOAD属性的segment最后会被加载到进程的VM中。但是加载之后也只是说segment和虚拟地址关联上了,物理内存此时并没有分配。那VMA和缺页一场如何产生关系呢?...原创 2018-09-17 23:31:46 · 1540 阅读 · 0 评论 -
Linux系统调用过程中user栈的保存与恢复
Linux系统调用过程中user现场的保存与恢复前言软硬件基础user和svc模式下寄存器的差异lr寄存器用法spsr寄存器用法USER栈的保存USER栈的恢复前言Linux应用程序中使用的open/close等函数属于glibc库提供的系统函数,调用这些函数最后都需要进入内核。所以完整的open实现可分为两部分,一部分在user space的glibc中实现;另一部分在内核中实现。这里只分析...原创 2018-09-26 23:47:47 · 1257 阅读 · 0 评论 -
以进程的角度分析fork()为什么会“返回两次”?
前言网上很多文章在介绍fork()函数时都会提到,调用一次fork会“返回两次”结果,但又没有深入解释。所以初学者(包括当年的我)看到这句话时就很懵。为什么用fork会返回两次?怎么实现的?为什么需要返回两次?只要能理解程序和进程的区别,以及有Linux下进程空间的概念,这种现象很好解释,并且不需要涉及分析内核源码。先放一个常见的测试例子。 1 #include <unistd.h&...原创 2018-09-27 14:56:42 · 1299 阅读 · 0 评论 -
Linux 时间子系统
Linux中的时间子系统和调度子系统关联比较大,所以需要结合起来分析。在时钟子系统部分,主要关注时间子系统的初始化;periodic模式中断处理函数的实现;如何从periodic模式切换到oneshot模式;如何切换到高精度定时器;基于hrtimer的周期性时钟sched_timer的实现;hres模式中断处理函数的实现。在调度部分,主要关注调度的流程;调度策略触发的时间和条件;以及cpu_i...原创 2018-10-30 15:13:15 · 1286 阅读 · 0 评论 -
驱动中bus,devices,driver注册的先后顺序
kernel最后在start_kernel的函数中最后调用rest_init()进行设备驱动相关的初始化,下面具体分析。原创 2014-06-25 17:24:57 · 1947 阅读 · 0 评论 -
名博推荐
http://blog.chinaunix.net/uid/20543672/cid-6422-list-1.html原创 2014-02-07 14:09:11 · 1138 阅读 · 0 评论 -
LINUX中a3c2440总线频率、时钟的设置
很多硬件的正常运行需要有总线时钟的支持,比如LCD、I2C等设备。本文分析一下s3c2440的总线时钟,以及在linux中对s3c2440总线时钟频率的相关操作。首先分析硬件s3c2440的总线时钟。s3c2440的FCLK HCLK PCLK时钟源首先来自外部晶振12MHz。对于必须运行在200MHz以上的ARM920t内核来说,这个频率实在太低了,不能直接使用,所以首先原创 2012-08-15 19:29:15 · 3303 阅读 · 2 评论 -
以RTC为例分析linux platform_bus platform_device和platform_driver注册过程
说明:内核版本为linux-2.6.37.1;只分析注册过程,未分析注销过程;水平、篇幅均有限,部分地方未作深入全面分析;分析过程只保留了与注册相关的代码;分析顺序依照各部分在内核中的注册顺序platform_bus,paltform_device,platform_driver进行。1.platform_bus注册过程platform_bus相关数据结构:/drive原创 2012-03-08 16:08:05 · 2240 阅读 · 0 评论 -
linux poll 和 等待队列休眠的关系
说明:linux版本2.6.37.1结合相关资料的概括和总结,在此做个记录,有误之处请网友指正,谢谢!1.poll机制和等待队列应用层通过系统调用poll函数进入内核,内核执行相应的sys_poll函数。在sys_poll函数中调用do_sys_poll函数。do_sys_poll函数通过调用poll_initwait函数初始化poll_wqueues变量table,并原创 2012-03-01 19:24:01 · 7043 阅读 · 0 评论 -
阻塞I/O、和硬件通行、延迟执行、定时器、中断
阻塞I/O在用户空间调用read函数时,假如此时数据还不可用,则驱动程序应该阻塞该进程,将其置入休眠状态直到数据请求可继续。简单的休眠机制有等待队列。等待队列分两种,一种是简单的等待,另一种只等待限定的时间。和硬件通信每种外设都通过读写寄存器进行控制,也就是IO操作。IO操作分两类,IO端口和IO内存。IO端口是针对X86结构(翻微机原理的书回忆下)。这里说下IO内存,原创 2012-09-23 16:09:18 · 2643 阅读 · 0 评论 -
调试手段、内存分配、字符设备的创建
写点复习笔记,为面试找工作准备。加油!!!内核调试手段1.printk()2.在头文件上定义#define DEBUG打开内核的调试信息(本质上还是printk)3.产生oops的时候根据oops输出信息分析。可根据calltrace信息判断具体调用函数导致oops4.可以通过文件系统中的相关文件夹来查看设备运行信息内存分配尽管内存的最小可寻址单位为字节,但是内原创 2012-09-21 21:19:09 · 1252 阅读 · 0 评论 -
Linux slab
转载至http://www.cnblogs.com/xuczhang/archive/2010/04/02/1703363.html本文将介绍Linux的slab层,首先我们要解决一个问题就是什么是slab,slab是做什么用的。在linux内核中会有许多小对象,这些对象构造销毁十分频繁,比如i-node,dentry。这么这些对象如果每次构建的时候就向内存要一个页,而其实际大转载 2012-09-21 21:07:25 · 5871 阅读 · 0 评论 -
文件系统、系统调用
文件系统1.概述此处讨论的文件系统是指内核用来管理文件系统以及对文件操作的机制和实现。Linux的文件系统包括1.磁盘文件2.设备文件3.特殊文件。a.磁盘文件就是侠义上的文件,包括ramdisk、ext2等文件类型b.设备文件设备驱动设计的文件c.特殊文件/dev/null,管道等。2.vfsLinux为支持各种不同的文件系统,设计了VFS这一层。VF原创 2012-09-22 20:28:33 · 872 阅读 · 0 评论 -
linux中line buffered和fully buffered的区别
line buffered:遇到换行或者缓冲区满再做flushfully buffered:缓冲区满做flush标准输出和终端设备相连时(例如默认情况下stdout 为显示器,或者嵌入式设备中的stdout为串口终端)它是line buffered,否则是(例如./a.out > temp.out 采用">"将输出重定位到文件)fully buffered。____________原创 2013-04-17 11:26:46 · 2901 阅读 · 0 评论 -
通过git来下载管理linux源码和u-boot源码
linux源码对应的相关浏览器地址:https://www.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/ linux-stable版本的源码git下载地址:git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.gitgit地址原创 2013-08-11 11:36:44 · 4615 阅读 · 0 评论 -
linux 信号处理机制
转自http://www.cnblogs.com/taobataoma/archive/2007/08/30/875743.html信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。 信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从转载 2013-03-27 13:39:18 · 814 阅读 · 0 评论 -
uboot结构初步分析
简单记录按先后顺序1.arch/arm/cpu/arm920t/start.s start2.board/your vendor name/your board name/lowlevel_init.s原创 2013-09-15 21:47:30 · 1224 阅读 · 0 评论 -
生成zimage的步骤
更具体过程参考http://blog.chinaunix.net/uid-2630593-id-2530229.html内核的uimage的生成过程:1.原始未压缩的vmlinux原料:各目录下的.o文件+arch/arm/kernel/vmlinux.lds2.去除调试信息和符号连接等之后的image原料:步骤1的vmlinux3.用gzip生成压缩内核p转载 2014-02-06 23:56:15 · 2425 阅读 · 0 评论 -
linux中container_of实现分析
内核版本:linux-2.6.37.1container_of的宏定义如下:#define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) )原创 2012-03-17 15:23:43 · 1053 阅读 · 0 评论 -
Linux DTS中和中断相关属性的解释和用法
Linux DTS中和中断相关属性的解释和用法前言中断控制器的硬件结构(基于Exynos4412 ARMv7)GIC功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图...原创 2019-08-20 17:37:42 · 13232 阅读 · 1 评论