前言:内核开发比用户空间开发更难的一个因素就是内核调试艰难。内核错误往往会导致系统宕机,很难保留出错时的现场。调试内核的关键在于你的对内核的深刻理解。 1、调试前的准备 在调试一个bug之前,我们所要做的准备工作有: 有一个被确认的bug。 包含这个bug的内核版本号,需要分析出这个bug在哪一个版本被引入,这个对于解决问题有极大的帮助。可以采用二分查找法来逐步锁定bug引入版本号。 对内核代码理解越深刻越好,同时还需要一点点运气。 该bug可以复现。如果能够找到复现规律,那么离找到问题的原因就不远了。 最小化系统。把可能产生bug的因素逐一排除掉。 2、内核中的bug 内核中的bug也是...

一、设备树概念以及作用 1.1设备树概念 设备树(DeviceTree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做DTS(DeviceTreeSource),这个DTS文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU数量、内存基地址、IIC接口上接了哪些设备、SPI接口上接了哪些设备等等,如图所示: 在图中,树的主干就是系统总线,IIC控制器、GPIO控制器、SPI控制器等都是接到系统主线上的分支。IIC控制器有分为IIC1和IIC2两种,其中IIC1上接了FT5206和AT24C02这两个IIC设备,IIC2上只接了MPU6050这个设备。DTS文件的主要功...

1,Linux简介 Linux是一种自由和开放源码的操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、台式计算机。 1.1Linux介绍 Linux出现于1991年,是由芬兰赫尔辛基大学学生LinusTorvalds和后来加入的众多爱好者共同开发完成 1.2Linux特点 多用户,多任务,丰富的网络功能,可靠的系统安全,良好的可移植性,具有标准兼容性,良好的用户界面,出色的速度性能 1.3开源 CentOS 主流:目前的Linux操作系统主要应用于生产环境,主流企业级Linux系统仍旧是RedHat或者...

1、进程的状态和装换 1.1进程的三态模型 按进程在执行过程中的不同情况至少要定义三种状态: 运行(running)态:进程占有处理器正在运行的状态。进程已获得CPU,其程序正在执行。在单处理机系统中,只有一个进程处于执行状态;在多处理机系统中,则有多个进程处于执行状态。 就绪(ready)态:进程具备运行条件,等待系统分配处理器以便运行的状态。当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行,进程这时的状态称为就绪状态。在一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列。 等待(wait)态:又称阻塞态或睡眠态,指进程不具备运行条件,正...

前言:相信通过前面的虚拟文件系统VFS及一个具体的Ext2文件系统博文,大家对基本的VFS体系有一个大致的掌握了吧。从本章开始,我们将讨论一些VFS底层的技术细节,磁盘高速缓存就是其中一个重要的技术。磁盘高速缓存是一种软件机制,它允许系统把通常存放在磁盘上的一些数据保留在RAM中,以便对那些数据的进一步访问而不用再访问磁盘。 因为对同一磁盘数据的反复访问频繁发生,所以磁盘高速缓存对系统性能至关重要。与磁盘交互的用户进程有权反复请求读或写同一磁盘数据。此外,不同的进程可能也需要在不同的时间访问相同的磁盘数据。例如,你可以使用cp命令拷贝一个文本文件,然后调用你喜欢的编辑器修改它。为了满足你的请求...

前言:Linux是一个多任务的操作系统,可以支持远大于CPU数量的任务同时运行,但是我们都知道这其实是一个错觉,真正是系统在很短的时间内将CPU轮流分配给各个进程,给用户造成多任务同时运行的错觉。所以这就是有一个问题,在每次运行进程之前CPU都需要知道进程从哪里加载、从哪里运行,也就是说需要系统提前帮它设置好CPU寄存器和程序计数器。 1、CPU上下文 CPU上下文其实是一些环境正是有这些环境的支撑,任务得以运行,而这些环境的硬件条件便是CPU寄存器和程序计数器。CPU寄存器是CPU内置的容量非常小但是速度极快的存储设备,程序计数器则是CPU在运行任何任务时必要的,里面记录了当前运行任务的...

前言 我们大都是被高级语言惯坏了的一代,源源不断的新特性正在逐步添加到各类高级语言之中,汇编作为最接近机器指令的低级语言,已经很少被直接拿来写程序了,不过我还真的遇到了一个,那是之前的一个同事,因为在写代码时遇到了成员函数权限及可见性的问题,导致他无法正确调用想执行的函数,结果他就开始在C代码里嵌入汇编了,绕过了种种限制终于如愿以偿,但是读代码的时候我们傻眼了… 因为项目是跨平台的,代码推送的Linux编译的时候他才发现,汇编代码的语法在Linux和Windows上居然是不一样的,结果他又用一个判断平台的宏定义“完美”地解决了,最终这些代码肯定是重写了啊,因为可读性太差了,最近在学习左值、右值...

前言:我们之前的文章提到了操作系统的三个抽象,它们分别是进程、地址空间和文件,除此之外,操作系统还要控制所有的I/O设备。操作系统必须向设备发送命令,捕捉中断并处理错误。它还应该在设备和操作系统的其余部分之间提供一个简单易用的接口。操作系统如何管理I/O是我们接下来的重点。 不同的人对I/O硬件的理解也不同。对于电子工程师而言,I/O硬件就是芯片、导线、电源和其他组成硬件的物理设备。而我们程序员眼中的I/O其实就是硬件提供给软件的接口,比如硬件接受到的命令、执行的操作以及反馈的错误。我们着重探讨的是如何对硬件进行编程,而不是其工作原理。 1,I/O设备 什么是I/O设备?I/O设备又叫做输入/...

1,基本概念 在多道程序系统中,进程的数量往往多于处理机的个数,进程争用处理机的情况就在所难免。处理机调度是对处理机进行分配,就是从就绪队列中,按照一定的算法(公平、低效)选择一个进程并将处理机分配给它运行,以实现进程并发地执行。 处理机调度是多道程序操作系统的基础,它是操作系统设计的核心问题。 2,调度的层次 一个作业从提交开始直到完成,往往要经历以下三级调度,如图2-4所示。 \1)作业调度。又称高级调度,.其主要任务是按一定的原则从外存上处于后备状态的作业中挑选一个(或多个)作业,给它(们)分配内存、输入/输出设备等必要的资源,并建立相应的进程,以使它(们)获得竞争处理机的权利。简言之,...

1、RAID磁盘阵列 简称:独立冗余磁盘阵列 把多块独立的物理硬盘按不同的方式组合起来形成一个硬盘组(逻辑硬盘)。从而提供比单个硬盘更高的存储性能和提供数据备份技术。 1.1RAID级别 组成磁盘阵列的不同方式称为RAID级别(RAIDLevels) 常用的RAID级别: RAID0、RAID1、RAID5、RAID6、RAID1+0等 ①、RAID0(条带化存储) RAID0连续以位或字节为单位分割数据,并行读/写于多个磁盘上,因此具有很高的数据传输率,但它没有数据冗余。 RAID0只是单纯地提高性能,并没有为数据的可靠性提供保证,而且其中的一个磁盘失效将影响到所有数据 RAID0不能应用...

ARM的概念 ARM(AdvancedRISCMachine),既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。ARM公司并不生产芯片也不销售芯片,它只出售芯片技术授权。其合作公司针对不同需求搭配各类硬件部件,比如UART、SDI、I2C等,从而设计出不同的SoC芯片。 ARM的应用场景 基于ARM的处理器具有高速度、低功耗、价格低等优点被广泛应用于以下领域: 为通信、消费电子、成像设备等产品,提供可运行复杂操作系统的开放应用平台; 在海量存储、汽车电子、工业控制和网络应用等领域,提供实时嵌入式应用; 安全系统,比如信用卡、SIM卡等。 ARM的技...

  c8XLDopoKJD8   2023年11月02日   31   0   0 嵌入式Linux内核IP寄存器指令集

前言 我们大都是被高级语言惯坏了的一代,源源不断的新特性正在逐步添加到各类高级语言之中,汇编作为最接近机器指令的低级语言,已经很少被直接拿来写程序了,不过我还真的遇到了一个,那是之前的一个同事,因为在写代码时遇到了成员函数权限及可见性的问题,导致他无法正确调用想执行的函数,结果他就开始在C代码里嵌入汇编了,绕过了种种限制终于如愿以偿,但是读代码的时候我们傻眼了… 因为项目是跨平台的,代码推送的Linux编译的时候他才发现,汇编代码的语法在Linux和Windows上居然是不一样的,结果他又用一个判断平台的宏定义“完美”地解决了,最终这些代码肯定是重写了啊,因为可读性太差了,最近在学习左值、右值...

并发同步 并发是指在某一时间段内能够处理多个任务的能力,而并行是指同一时间能够处理多个任务的能力。并发和并行看起来很像,但实际上是有区别的,如下图(图片来源于网络): 上图的意思是,有两条在排队买咖啡的队列,并且只有一架咖啡机在处理,而并行就有两架的咖啡机在处理。咖啡机的数量越多,并行能力就越强。可以把上面的两条队列看成两个进程,并发就是指只有单个CPU在处理,而并行就有两个CPU在处理。为了让两个进程在单核CPU中也能得到执行,一般的做法就是让每个进程交替执行一段时间,比如让每个进程固定执行100毫秒,执行时间使用完后切换到其他进程执行。而并行就没有这种问题,因为有两个CPU,所以两个进程...

进程概念 1)正在执行的程序 2)正在计算机上执行的程序实例 3)能分配处理器并由处理器执行的实体 进程的两个基本元素是程序代码和代码相关联的数据集。Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态。这就可以引入‘进程状态’,进程在内存中因策会略或调度需求,会处于各种状态。 Linux下的进程状态 staticconstcharconsttask_state_array[]={ "R(running)",/0/ "S(sleeping)",/1/ "D(disksleep)",/2/ "T(stopped)",/4/ "t...

一,实时调度器类 实时调度类有两类进程: 循环进程SCHED_RR:循环进程有时间片,随着进程的运行时间会减少。当时间片用完时又将其置为初值,并将进程置于队列末尾。先进先出SCHED_FIFO:没有时间片调度,运行后可执行任意长时间直到自己放弃CPU。实际上两类进程在相同优先级队列上都是先进先出的,只是一个有时间片一个没有时间片。 现在实时进程的调度其实就是使用之前内核的O(1),每个优先级(总共MAX_RT_PRIO)有一个queue,并且通过一个bitmap(位数也是MAX_RT_PRIO+1)表示所有优先级队列的状态,即bitmap的第0位,表示优先级queue[0]是否有等待运行的进程...

1,三态模型 三态模型:在多道程序系统中,进程在处理器上交替运行,状态也不断地发生变化。进程一般有3种基本状态:运行、就绪和阻塞。 (1)运行:当一个进程在处理机上运行时,则称该进程处于运行状态。处于此状态的进程的数目小于等于处理器的数目,对于单处理机系统,处于运行状态的进程只有一个。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。 (2)就绪:当一个进程获得了除处理机以外的一切所需资源,一旦得到处理机即可运行,则称此进程处于就绪状态。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而...

一,进程 程序是指储存在外部存储(如硬盘)的一个可执行文件,而进程是指处于执行期间的程序,进程包括代码段(textsection)和数据段(datasection),除了代码段和数据段外,进程一般还包含打开的文件,要处理的信号和CPU上下文等等。 二,进程描述符 Linux进程使用structtask_struct根据描述(include/linux/sched.h),如下: structtask_struct{/offsetsofthesearehardcodedelsewheretouchwithcare/ volatilelongstate;/-1unrunnable,0runnable...

关于对Socket的认识,大致分为下面几个主题,Socket是什么,Socket是如何创建的,Socket是如何连接并收发数据的,Socket套接字的删除等。 Socket是什么以及创建过程 一个数据包经由应用程序产生,进入到协议栈中进行各种报文头的包装,然后操作系统调用网卡驱动程序指挥硬件,把数据发送到对端主机。整个过程的大体的图示如下。 我们大家知道,协议栈其实是位于操作系统中的一些协议的堆叠,这些协议包括TCP、UDP、ARP、ICMP、IP等。 通常某个协议的设计都是为了解决某些问题,比如TCP的设计就负责安全可靠的传输数据,UDP设计就是报文小,传输效率高,ARP的设计是能够通过I...

  c8XLDopoKJD8   2023年11月02日   43   0   0 服务器数据套接字

什么是IO 在计算机操作系统中,所谓的I/O就是输入(Input)和输出(Output),也可以理解为读(Read)和写(Write),针对不同的对象,I/O模式可以划分为磁盘IO模型和网络IO模型。 IO操作会涉及到用户空间和内核空间的转换,先来理解以下规则: 内存空间分为用户空间和内核空间,也称为用户缓冲区和内核缓冲区; 用户的应用程序不能直接操作内核空间,需要将数据从内核空间拷贝到用户空间才能使用; 无论是read操作,还是write操作,都只能在内核空间里执行; 磁盘IO和网络IO请求加载到内存的数据都是先放在内核空间的; 再来看看所谓的读(Read)和写(Write)操作: 读...

  c8XLDopoKJD8   2023年11月02日   18   0   0 应用程序数据内核空间

前言:Linux内核里大部分都是C语言。建议先看《Linux内核设计与实现(LinuxKernelDevelopment)》,RobertLove,也就是LKD。 Linux是一种动态系统,能够适应不断变化的计算需求。Linux计算需求的表现是以进程的通用抽象为中心的。进程可以是短期的(从命令行执行的一个命令),也可以是长期的(一种网络服务)。因此,对进程及其调度进行一般管理就显得极为重要。 在用户空间,进程是由进程标识符(PID)表示的。从用户的角度来看,一个PID是一个数字值,可惟一标识一个进程。一个PID在进程的整个生命期间不会更改,但PID可以在进程销毁后被重新使用,所以对它们进行...

  c8XLDopoKJD8   2023年11月02日   20   0   0 Linux系统调用父进程
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~