Linux内核开发
文章平均质量分 63
静能生悟
静生智,定生慧,一勤天下无难事,俭以养德,厚德载物!!
展开
-
交叉编译iptables1.4.12的问题
https://blog.csdn.net/u013401853/article/details/77165405转载 2020-11-11 11:04:00 · 591 阅读 · 0 评论 -
死锁的原因及处理方法
产生死锁的原因主要是:(1) 因为系统资源不足。(2) 进程运行推进的顺序不合适。(3) 资源分配不当等。产生死锁的四个必要条件:(1)互斥条件:一个资源每次只能被一个进程使用。(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。(3)不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。避免死锁:死锁的预防是通过破坏产生条件来阻止死锁的产生,但这种方法破坏了系统的并行性和并发性。死锁产生的前三原创 2020-09-18 09:31:44 · 900 阅读 · 0 评论 -
Linux likely和unlikely的使用
一、源代码#include <linux/init.h>#include <linux/module.h>static int __init hello_init(void){ int a = 10; int b = 6; printk(KERN_INFO "hello_init.\n"); if(l...原创 2020-04-14 16:34:53 · 436 阅读 · 0 评论 -
linux内核中的likely()和unlikely()宏的作用
if(likely(x))等价于if(x),但是它告诉gcc,x取1的可能性比较大。if(unlikely(x))等价于if(x),但是它告诉gcc,x取0的可能性比较大。原创 2020-04-14 15:04:25 · 206 阅读 · 0 评论 -
第1章Linux内核简介之Linux内核版本
1.5 Linux内核版本 Linux内核有两种:稳定版本和处于开发中的版本。稳定的内核具有工业级的强度,可以广泛地应用和部署。新推出的稳定内核大部分都只是修正了一些Bug或是加入了一些新的设备驱动程序。另一方面处于开发中的内核中许多东西变化得都很快。而且由于开发者不断试验新的解决方案,内核常常发生剧烈的变化。 Linux通过一个简单的命名机制来区分稳定的和处于开发中的...原创 2018-07-13 14:59:46 · 828 阅读 · 0 评论 -
第6章内核数据结构之二叉树
6.4 二叉树树结构是一个能提供分层的树型数据结构的特定数据结构。在数学意义上,树是一个无环的、连接的有向图,其中任何一个顶点具有0个或者多个出边以及0个或者1个入边。一个二叉树是每个节点最多只有两个出边的树——也就是,一个树,其节点具有0个、1个或者2个子节点。如图6-6所示的简单二叉树:6.4.1 二叉搜索树一个二叉搜索树(通常简称为BST)是一个节点有序的二叉树,其顺序通常遵...原创 2018-08-17 14:46:08 · 548 阅读 · 0 评论 -
第6章内核数据结构之数据结构以及选择
6.5 数据结构以及选择Linux中最重要的数据结构:链表、队列、红黑树。如何在代码中具体选择使用哪种数据结构。如果对数据集合的主要操作是遍历数据,就使用链表。事实上没有数据结构可以提供比线性算法复杂度更好的算法遍历元素,应该用最简单的数据结构完成简单工作。当性能并非首要考虑因素时,或者当需要存储相对较少的数据项时,或者需要和内核中其他使用链表的代码交互时,优先选择链表。如果代码符号生...原创 2018-08-17 15:03:28 · 156 阅读 · 0 评论 -
第7章中断和中断处理之中断
任何操作系统内核的核心任务,都包含有对连接到计算机上的硬件设备进行有效管理,如硬盘、键盘、鼠标,以及无线电等。而想要管理这些设备,首先要能和它们互通音信才行。处理器的速度跟外围硬件设备的速度不在一个数量级上,因此,如果内核采取让处理器向硬件发出一个请求,然后专门等待回应的办法,显然差强人意。既然硬件的响应这么慢,那么内核就应该在此期间处理其他事务,等到硬件真正完成了请求的操作之后,再回过头来对它进...原创 2018-08-17 17:03:41 · 331 阅读 · 0 评论 -
第7章中断处理程序
7.2 中断处理程序在响应一个特定中断的时候,内核会执行一个函数,该函数叫做中断处理程序或中断服务例程。产生中断的每个设备都有一个相应的中断处理程序。例如,由一个函数专门处理来自系统时钟的中断,而另外一个函数专门处理由键盘产生的中断。一个设备的中断处理程序是它设备驱动程序的一部分——设备驱动程序是用于对设备进行管理的内核代码。在Linux中,中断处理程序是普通的C函数。只不过这些函数必须按...原创 2018-09-17 20:40:11 · 3205 阅读 · 0 评论 -
第7章中断和中断处理
7.5 编写中断处理程序以下是一个中断处理程序声明:static irqreturn_t intr_handler(int irq, void *dev);注意,它的类型与request_irq()参数中handler所要求的参数类型相匹配。第一个参数irq是这个处理程序要响应的中断的中断号。在2.0版本以前的Linux内核中,由于没有dev这个参数,必须通过irq才能区分使用相同驱动...原创 2018-09-18 11:01:51 · 785 阅读 · 0 评论 -
第7章中断和中断处理
7.6 中断上下文当执行一个中断处理程序时,内核处于中断上下文中。进程上下文是一种内核所处的操作模式,此时内核代表进程执行——例如,执行系统调用或允许内核线程。在进程上下文中,可以通过current宏关联当前进程。此外,因为进程是以进程上下文的形式连接到内核中的,因此,进程上下文可以睡眠,也可以调用调度程序。中断上下文和进程没有瓜葛。与current宏不相干。因为没有后备进程,所以中断上下...原创 2018-09-18 15:24:34 · 543 阅读 · 0 评论 -
第7章 中断和中断处理
7.9 中断控制Linux内核提供了一组接口用于操作机器上的中断状态。这些接口为我们提供了能够禁止当前处理器的中断系统,或屏蔽掉整个机器的一条中断线的能力,这些例程都是与体系结构相关的,可以在<asm/system.h>和<asm/irq.h>中找到。一般来说,控制中断系统的原因归根结底是需要提供同步。通过禁止中断,可以确保某个中断处理程序不会抢占当前的代码。此外,...原创 2018-09-18 16:49:32 · 433 阅读 · 0 评论 -
第6章内核数据结构之队列
6.2 队列任何操作系统内核都少不了一种编程模型:生产者和消费者。在该模式中,生产者创造数据,而消费者则反过来,读取消息和处理包,或者以其他方式消费这些数据。实现该模型的最简单的方式是使用队列。生成者将数据推进队列,消费者从队列中摘取数据。消费者获取数据的顺序和推入队列的顺序一致。第一个进入队列的数据一定是第一个离开队列的。队列也称为FIFO(先进先出)。图6-5是一个标准队列的例子。...原创 2018-08-17 10:59:22 · 228 阅读 · 0 评论 -
第6章内核数据结构之链表
介绍Linux内核常用的数据结构,内核开发者应该尽可能地使用这些数据结构。这些通用数据结构中最有用的几个:链表、队列、映射、二叉树。6.1 链表链表是Linux内核中最简单、最普通的数据结构。链表是一种存放和操作可变数量元素(称为节点)的数据结构。链表和静态数组的不同之处在于:链表所包含的元素都是动态创建并插入链表的,在编译时不必知道具体需要创建多少个元素。也因为链表中每个元素的创建时...原创 2018-08-15 19:34:05 · 379 阅读 · 0 评论 -
第4章进程调度(三)
4.5 Linux调度的实现讨论采用CFS调度算法的动机和其内部逻辑后,开始具体探索CFS是如何实现的。代码位于kernel/sched_fair.c中。特别关注四个组成部分:时间记账进程选择调度器入口睡眠和唤醒1、时间记账所有的调度器都必须对进程运行时间做记账。多数Unix系统,分配一个时间片个每一个进程。当每次系统时钟节拍发生时,时间片都会被减少一个节拍周期。当一个...原创 2018-07-19 16:17:08 · 378 阅读 · 0 评论 -
Linux内核开发之IO端口和IO内存
1、寄存器与内存 寄存器和 RAM 的主要不同在于寄存器操作有副作用( 边际效果),读取某个地址时可能导致该地址内容发生变化,比如很多设备的中断状态寄存器只要一读取,便自动清零。2、内存与IO X86支持内存空间、IO空间,ARM只支持内存空间。 IO端口:当一个寄存器或内存位于IO空间时,称其为IO端口。 IO内存: 当一个寄存器或内存位于内存空间时,称其为IO...原创 2018-07-14 09:45:35 · 261 阅读 · 0 评论 -
Linux内核开发之中断处理
一、概念1、外设的处理速度一般慢于CPU。2、CPU不能一直等待外部事件。所以设备必须有一种方法来通知CPU它的工作进度,这种方法就是中断。二、中断实现在Linux驱动程序中,为设备实现一个中断包含两个步骤: 1、向内核注册中断 2、实现中断处理函数三、中断处理子系统1、根据中断号找到正确的中断处理代码。2、 Linux定义名字为irq_desc的中断例程描述符表:(include/lin...原创 2018-07-14 11:49:12 · 290 阅读 · 0 评论 -
第4章进程调度(四)
4.5.4 睡眠和唤醒休眠(被阻塞)的进程处于一个特殊的不可运行状态。这点非常重要,如果没有这种特殊状态的话,调度程序就可能选出一个本不愿意被执行的进程,槽糕的是,休眠必须以轮询的方式实现了。进程休眠有多种原因,都是为了等待一些事件。事件可能是一段时间从文件IO读更多的数据,或者是某个硬件。一个进程还有可能在尝试获取一个已被占用的内核信号量时被迫进入休眠。休眠的一个常见原因是文件IO——如进程...原创 2018-07-20 10:39:29 · 216 阅读 · 0 评论 -
第4章进程调度(五)
4.6 抢占和上下文切换上下文切换,是从一个可执行进程切换到另一个可执行进程,定义在kernel/sched.c中context_switch()函数负责处理。/* * context_switch - switch to the new MM and the new * thread's register state. */static inline voidcontext_s...原创 2018-07-20 13:58:12 · 330 阅读 · 0 评论 -
第4章进程调度(六)
4.7 实时调度策略Linux提供两种实时调度策略:SCHED_FIFO和SCHED_RR。普通的、非实时的调度策略是SCHED_NORMAL。借助调度类的框架,这些实时策略被一个特殊的实时调度器管理。具体实现定义在kernel/sched_rt.c中。SCHED_FIFO是一种简单的、先入先出的调度算法:不使用时间片。处于可运行状态的SCHED_FIFO级的进程比任何SCHED_NORM...原创 2018-07-20 16:06:33 · 543 阅读 · 0 评论 -
第5章系统调用
在现代操作系统中,内核提供了用户进程与内核交互的一组接口。这些接口让应用程序受限地访问硬件设备,提供了创建新进程并与已有进程进行通信的机制,也提供了申请操作系统其它资源的能力。这些接口在应用程序和内核之间扮演了使者的角色,应用程序发出各种请求,而内核负责满足这些请求。5.1 与内核通信系统调用在用户空间进程和硬件设备之间添加了一个中间层。该层主要作用有三个。首先,为用户空间提供一种硬件的抽...原创 2018-07-20 17:45:02 · 1044 阅读 · 0 评论 -
MT6580 Android8.1调试移植费恩格尔指纹驱动
1、首先用万用表确定好vcc 2.8v和1.8v的供电正常,有的平台2.8v是软件控制打开,有的平台是直接硬件长供的。2、根据原理图确定好gpio的配置主要包括spi_cs,spi_sck,spi_miso,spi_mosi,还有复位脚rst和中断脚int:,使用的是哪一组SPI通讯等。3、dts添加cdfinger 的节点,gpio的配置等,注意查看所使用的gpio是否有其他地方有...转载 2018-08-09 16:40:18 · 1468 阅读 · 0 评论 -
第8章 下半部和推后执行的工作
内核为处理中断而提供的中断处理程序机制。中断处理程序是内核中很有用的部分。但是,由于本身存在一些局限,所以它只能完成整个中断处理流程的上半部分。这些局限包括:中断处理程序以异步方式执行,并且有可能会打断其他重要代码的执行。因此,为了避免被打断的代码停止时间过长,中断处理程序应该执行越快越好。如果当前有一个中断处理程序正在执行,在最好的情况下(如果设置了IRQF_DISABLED),与该中断...原创 2018-09-18 19:59:07 · 178 阅读 · 0 评论 -
第8章 下半部和推后执行的工作
8.2 软中断讨论从实际的下半部实现——软中断方法开始。软中断使用得比较少;而tasklet是下半部更常用的一种形式。但是,由于tasklet是通过软中断实现的,先来研究软中断。软中断的代码位于kernel/softirq.c文件中。8.2.1 软中断的实现软中断是在编译期间静态分配的。它不像tasklet能被动地注册或注销。软中断由softirq_action结构表示,定义在&l...原创 2018-09-19 10:46:05 · 143 阅读 · 0 评论 -
第8章 下半部和推后执行的工作
8.3 tasklettasklet是利用软中断实现的一种下半部机制。它和进程没有任何关系。tasklet和软中断在本质上和相似,行为表现也相近,但是,它的接口更简单,锁保护也要求较低。选择到底是用软中断还是tasklet其实很简单:通常应该用tasklet。软中断的使用者屈指可数,只在执行频率很高和连续性要求很高的情况下才需要使用。而tasklet用途广泛。大多数情况下用tasklet效...原创 2018-09-19 15:15:48 · 148 阅读 · 0 评论 -
linux 内核源码下载地址
记录下linux 内核源码下载网址:https://mirrors.edge.kernel.org/pub/linux/kernel/linux 0系列版本下载网址http://oldlinux.org/Linux.old/原创 2019-08-23 15:48:53 · 730 阅读 · 0 评论 -
container of()函数简介
在linux 内核编程中,会经常见到一个宏函数container_of(ptr,type,member), 已知结构体type的成员member的地址ptr,求结结构体type的起始地址。原创 2018-12-28 14:36:29 · 193 阅读 · 0 评论 -
Linux内核基本调试方法
1、printk2、oops:内核在发生panic时,所产生的一个调试信息3、kprobe:用于调试在运行的内核中的代码4、kcore:/proc/kcore原创 2018-12-17 16:43:09 · 419 阅读 · 0 评论 -
Linux printk打印格式化
数据类型 打印格式 int %d or %x unsigned int %u or %x long %ld or %lx unsigned long %lu or %lx ...原创 2018-12-27 14:42:25 · 662 阅读 · 0 评论 -
Linux内核组件与工具开源
近日,Facebook 开源了一套解决重要计算集群管理问题的 Linux 内核组件和相关工具,这些项目覆盖了资源控制、资源利用、工作负载隔离、负载均衡、测量和监控等方面:BPF、Btrfs、Netconsd、Cgroup2、PSI、Oomd。近日,Facebook 开源了一套解决重要计算集群管理问题的 Linux 内核组件和相关工具,这些项目覆盖了资源控制、资源利用、工作负载隔离、负载均衡、测量和...原创 2018-12-07 15:21:00 · 491 阅读 · 0 评论 -
Linux System.map
查看System.map确定内核函数的地址范围原创 2018-12-13 09:25:26 · 555 阅读 · 0 评论 -
Linux进程启动
linux进程的启动分析:1.分析start_kernel函数路径 linux-2.6.22.6/init/main.c start_kernel(void)调用2.分析rest_init函数路径 linux-2.6.22.6/init/main.cstatic void noinline __init_refok rest_init(void) __releases(ke...原创 2018-10-30 16:13:35 · 2897 阅读 · 0 评论 -
U-boot启动Linux内核
linux的启动过程分为两部分:1.架构/开发板相关的引导过程2.通用启动过程U-boot里面:bootm启动内核的。 bootm 30008000 ;PC=0X30008000原创 2018-10-27 17:09:57 · 216 阅读 · 0 评论 -
Linux Makefile总结
对linux内核的Makefile的总结:1.配置文件.config中定义了一系列的变量,Makefile将结合它们来决定哪些文件被编译到内核,哪些文件被编译为模块,涉及哪些子目录。2.顶层的Makefile和arch/$(ARCH)/Makefile决定根目录下哪些子目录,arch/$(ARCH)目录下哪些文件和目录被编译到内核。3.最后,各级子目录下的Makefile决定所在目录下哪...原创 2018-10-27 16:40:22 · 202 阅读 · 0 评论 -
第10章内核同步方法
10.4 信号量Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个不可用(已经被占用)的信号量时,信号量会将其推进一个等待队列,然后让其睡眠。这时处理器能重获自由,从而去执行其他代码。当持有的信号量可用(被释放)后,处于等待队列中的那个任务将被唤醒,并获得该信号量。可以从信号量的睡眠特性得出一些有意思的结论:由于争用信号量的进程在等待锁重新变为可用时会睡眠,所以信号量适用于锁...原创 2018-10-10 17:45:17 · 226 阅读 · 0 评论 -
第10章 内核同步方法
10.3 读-写自旋锁有时,锁的用途可以明确地分为读取和写入两个场景。例如,对一个链表可能既要更新又要检索。当更新(写入)链表时,不能有其他代码并发地写链表或从链表中读取数据,写操作要求完全互斥。另一方面,当对其检索(读取)链表时,只要其他程序不对链表进行写操作就行了。只要没有写操作,多个并发的读操作都是安全的。任务链表的存取模式类似于这种情况,就是通过读-写自旋锁获得保护的。Linux内...原创 2018-10-10 15:01:18 · 204 阅读 · 0 评论 -
第10章 内核同步方法
10.2 自旋锁如果每个临界区都能像增加变量这样简单就好了,现实是残酷的。现实世界里,临界区甚至可以跨越多个函数。例如,经常会碰到这种情况:先得从一个数据结构中移出数据,对其进行格式转换和解析,最后再把它加入到另一个数据结构中。整个执行过程必须是原子的,在数据被更新完毕前,不能有其他代码读取这些数据。显然,简单的原子操作对此无能为力,这就需要更复杂的同步方法——锁来提供保护。Linux内核...原创 2018-10-10 10:40:40 · 155 阅读 · 0 评论 -
第10章内核同步方法
Linux内核提供了一组相当完备的同步方法,这些方法使得内核开发者能编写出高效而又自由竞争的代码。10.1 原子操作原子操作可以保证指令以原子的方式执行——执行过程不被打断。原子原本指的是不可分割的微粒,所以原子操作也就是不能被分割的指令。两个原子操作绝对不可能并发地访问同一个变量,这样加操作就绝不会引起竞争。内核提供两组原子操作接口——一组针对整数进行操作,另一组针对单独的位进行...原创 2018-10-09 14:23:15 · 194 阅读 · 0 评论 -
第10章 内核同步方法
10.6 互斥体内核中唯一允许睡眠的锁是信号量。多数用户使用信号量只使用计数1,是把其作为一个互斥的排他锁使用——好比允许睡眠的自旋锁。不幸的是,信号量用途更通用,没多少使用限制。这使得信号量适合用于较复杂的、未明情况下的互斥访问,比如内核于用户空间复杂的交互行为。但这也意味着简单的锁定而使用信号量并不方便,并且信号量也缺乏强制的规则来行使任何形式的自动调试,即便受限的调试也不可能。为了找到一...原创 2018-10-12 09:17:57 · 233 阅读 · 0 评论 -
第10章内核同步方法
10.5 读-写信号量信号量也有区分读-写访问的可能。读-写信号量比普通的信号量更具优势。读-写信号量在内核中由rw_semaphore结构表示的,定义在文件<linux/rwsem.h>中。通过如下语句可以创建静态声明的读-写信号量:static DECLARE_RWSEM(name);其中name是新信号量名。#define DECLARE_RWSEM(name...原创 2018-10-11 10:17:05 · 331 阅读 · 0 评论