![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux内核
文章平均质量分 76
嵌入式软件和硬件
有趣才精彩,而不是精彩才有趣
展开
-
MMU 内存管理单元
MMU 内存管理单元作用:讲CPU发出的访存地址(虚拟地址)转换为总线上的物理地址。基本构成:页表TBL的作用:缓存最近访问的页表项;cache:linux相关基本知识Linux的虚拟地址划分:1G用于内核,3G用于用户;Linux进程的页表:页表的前面1G内容相同,即所有进程的1G内存都映射到相同的物理地址上。驱动如果需要访问一个外设的绝对物理地址:需要使用ioremap函数进行映射,该函数会修改页表,将该物理地址映射到对应的虚拟地址上面。...原创 2022-01-08 17:34:28 · 575 阅读 · 0 评论 -
DMA(待续)
关于DMA:DMA获取总线控制权,可能修改内存。如果修改的内存在cache中映射了,那么存在cache数据和DRAM数据不一致。解决方法:最简单的:将DMA访问的内存禁止cache。 DMA本身不属于一种外设,只是外设和内存数据交互的一种方式。Linux下的DMA编程:对于ISA设备,使用DMA传输数据,必须使用内存的最低16MB的地址空间。【kmalloc 和 __get_fr...原创 2019-07-09 21:26:27 · 160 阅读 · 0 评论 -
Linux IO内存访问
注:本文资料全部来源于网络,同时加上个人理解。若有侵权,告知即删。若有错误,告知商讨。1、IO内存访问32位Linux系统,内核使用高端内存的vmalloc区来映射IO地址空间。具体地址可以自己定义。例如:三星4412提供的源码使用0xF6000000 至0xF6000000+96MB的内存空间映射IO端口的寄存器。2、内存和IO基础知识内核访问外设IO内存之前,先要将...原创 2019-07-09 21:13:50 · 307 阅读 · 0 评论 -
Linux i2c总线驱动框架
注:本文资料全部来源于网络,同时加上个人理解。若有侵权,告知即删。若有错误,告知商讨。1、Linux系统的IIC总线体系结构主要包括:IIC核心、IIC总线驱动、IIC设备驱动。IIC总线驱动:对应一个SOC的IIC控制器 IIC设备驱动:对应一个具体的IIC外设 IIC核心:具体的外设挂载在具体的IIC控制器上,因此IIC设备驱动需要和IIC总线驱动对应。因此需要IIC核心mat...原创 2019-07-09 15:10:23 · 280 阅读 · 0 评论 -
设备树--简介
引入设备树的原因:Linux3.1之前的版本,对于一般的ARM平台的设备,板级信息一般存放在/arch/arm/mach-**目录下。这些代码存在大量重复。避免各个厂商代码的重复,加速linux内核的bsp的开发。编译一个镜像可以支持多个不同设备,只需要编译对应的设备树并打包就可以。设备树:一种描述板子硬件信息的数据结构,设备树源文件存放在/arch/arm/boot/dts/***.dt...原创 2019-07-08 18:37:29 · 955 阅读 · 0 评论 -
Linux内核启动 --- __create_page_tables
ARM内核的做法首先建立开启MMU函数turn_mmu_on所在页的一个平映射,同时创建内核起始地址的线性映射,然后开启MMU,完成turn_mmu_on函数物理运行地址到虚拟运行地址的一个无缝衔接,之后在进行链接地址的跳转。【平映射的作用:在这一段代码,既可以用虚拟地址访问内存,也可以用实际的物理地址作为虚拟地址访问物理内存,应为这两段虚拟地址都映射到了内核代码】原文:https://...原创 2019-07-08 16:57:58 · 253 阅读 · 0 评论 -
uboot简介
一般调试嵌入式开发板喜欢选择 利用 TFTP 传送 内核与 设备树, 利用 nfs 加载根文件系统。uboot 环境变量 设置如下:bootargs=root=/dev/nfs rw nfsroot=192.168.1.4:/exports/rfs ip=192.168.1.200 video=HDMI-A-2:1280x800Bootcmd tftp 0x4808000...原创 2019-07-08 19:00:18 · 709 阅读 · 0 评论 -
Linux内核移植流程 应该怎么开始着手
1、首先要找到该处理器核的芯片手册,不像SOC芯片手册会介绍SOC的外设资源,处理器核芯片手册介绍的是处理器内部逻辑以及特性,手册需要重点关注的几点有:(1)地址空间管理,包括上电取指地址(一般存储在SOC的内部存储flash),MMU如何配置使用等(2)寄存器定义,包括通用寄存器,特殊功能寄存器(3)中断异常的定义,异常向量表如何定义和使用(4)cache管理(5)处理器核r...原创 2019-07-08 15:21:55 · 200 阅读 · 0 评论 -
Linux内核启动--汇编部分
版本:Linux3.0原创 2019-07-08 18:38:28 · 582 阅读 · 0 评论 -
Linux内核--设备驱动模型
原创 2019-07-02 16:01:23 · 149 阅读 · 0 评论 -
Linux内核错误panic oops
注:本文资料全部来源于网络或书籍,同时加上个人理解。若有侵权,告知即删。若有错误,留言商讨。1、panic当内核遇到严重错误的时候,内核panic,立马崩溃。死机。2、oopsoops是内核遇到错误时发出的提示“声音”,oops有时候会触发panic,有时候不会,而是直接杀死当前进程,系统可以继续运行。比如说内核态下的段错误,当内核设置了panic_on_oops=1的时候,o...原创 2019-07-15 10:25:21 · 3708 阅读 · 0 评论 -
虚拟的根文件系统及其作用和工作机理
为什么需要虚拟根文件系统:Linux内核加载真正根文件系统执行/sbin/init程序前,需要找到根设备位置,如果根文件系统所在设备需要驱动的支持,内核有可能无能为力,通过提供一个过渡的临时根文件系统可以使得内核的设计更灵活简单.通常过渡的临时根文件系统基本上是内存文件系统.内核总是能安装ramdisk的(注:这是因为ramdisk临时文件系统和内核一样,也是由bootloader通过低级...原创 2019-06-30 13:39:03 · 696 阅读 · 0 评论 -
Linux设备驱动--platform虚拟总线
1、resource结构体:在内核中表示了一个设备使用的资源,描述一个具体的硬件。包括:在总线上的地址,资源名字等/* * Resources are tree-like, allowing * nesting etc.. */struct resource { resource_size_t start; /* 这段资源的起始 */ resource_size_t...原创 2019-07-12 08:22:14 · 159 阅读 · 0 评论 -
Linux read系统调用的处理过程
转载:https://www.cnblogs.com/tcicy/p/8454740.htmlRead 系统调用在用户空间中的处理过程当调用发生时,库函数在保存 read 系统调用号以及参数后,陷入 0x80 中断。这时库函数工作结束。Read 系统调用在用户空间中的处理也就完成了。Read 系统调用在核心空间中的处理过程0x80 中断处理程序接管执行后,先检察其系统调用号,然后根...转载 2019-08-12 15:45:56 · 921 阅读 · 0 评论 -
Linux操作系统--进程调度
1、Linux的CFS调度器并没有直接分配时间片到进程,而是将处理器的使用比例划分给进程。在大多数操作系统中,是否将一个进程立刻投入运行完全取决于:进程优先级和是否有时间片。CFS调度器抢占时机取决于:可运行程序消耗了多少处理器使用比。2、调度器类:每个调度器都有一个优先级,都有0个或若干个可执行进程。基础调度器会按照优先级遍历调度器类,选择一个有可执行进程的最高优先级的类,再从此类中选择可执........................原创 2019-08-15 20:45:57 · 358 阅读 · 0 评论 -
exec系统调用
因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段。exec函数函数:通常exec函数不返回,成功的调用会调转到新程序的入口点作为结束,而刚刚才被运行的代码是不会存在于进程进程的地址空间中。exec函数调用,改变哪些属性:任何挂起的信号都被丢失; 捕捉的任何信号会被还原为缺省的处理方式; 任何内存的锁定都会丢...转载 2019-06-24 21:45:40 · 1952 阅读 · 0 评论 -
fork系统调用
一次调用两次返回:一次在父进程中返回,返回值是子进程的pid;另一次是在子进程中返回,返回值为0。在Linux下如果内存没有被写的话,那么父子进程是共用地址空间的,所以内存中的同一个fork函数会在两个进程中调用到。在父进程中返回的就是子进程id,子进程中返回的是0。子进程是父进程的副本:子进程获得父进程的数据段【意味着全部变量不互相影响】、堆栈段、栈的副本。(所谓副本是重新复制一份(或者写时...原创 2019-06-20 10:06:20 · 256 阅读 · 0 评论 -
tty consloe pty pts
注:本文资料全部来源于网络或书籍,同时加上个人理解。若有侵权,告知即删。若有错误,留言商讨。/dev目录下面一大堆tty*的字符设备文件,今天来理一理。虚拟控制台or虚拟终端:【ctrl+atl+f1~f6切换】,tty1 tty2等串口终端(ttyS*):系统中的串口设备的设备文件。是/dev/tts/0(或/dev/ttyS0), /dev/tts/1(或/dev/ttyS1)等...原创 2019-07-25 10:57:24 · 346 阅读 · 0 评论 -
Linux时钟系统
注:本文资料全部来源于网络或书籍,同时加上个人理解。若有侵权,告知即删。若有错误,留言商讨。实时时钟(RTC):X86体系结构下,RTC实时时钟在系统断电的时候使用备用电池继续运行,RTC能在IRQ8上周期的发出中断,频率在2~8291HZ之间,linux只是用RTC在启动的时候来获取时间和日期。不过也可以使用/dev/rtc来对RTC设备编程修改其值。时间戳计数器(TSC):Pe...原创 2019-07-17 16:11:00 · 674 阅读 · 0 评论 -
Linux i2c 驱动实例
主要的数据结构体:// include/linux/i2c.hstruct i2c_client { unsigned short flags; /* div., see below */ unsigned short addr; /* chip address - NOTE: 7bit */ /* addresses are stored in the */ ...原创 2019-07-12 08:22:35 · 603 阅读 · 1 评论 -
Linux系统编程--第四章 高级文件IO
散布/聚集IO: 在单个系统调用中同时对多个缓冲区进行读取或者写入操作,适合聚集不同数据结构进行统一的IO操作。epoll:poll() 和 select() 的改进版本,在一个程序需要处理数百个文件描述符的时候很有用内存文件映射IO:将文件映射到内存,可以通过简单的内存管理方式来处理文件文件IO提示: 允许进程将文件IO使用上的一些提示信息提供给内核,能提升IO性能异步IO ...原创 2019-06-24 08:58:46 · 593 阅读 · 0 评论 -
Linux操作系统--进程地址空间
进程的地址空间:进程的地址空间由进程可以使用的全部线性区集合组成,每个进程的线性区集合是不同的,也是不相关的。进程获得线性区的情况:创建一个新的进程,fork+execve 正在运行的进程,装入一个不同的程序,pid不变,但是线性地址空间重新分配。execve()。 mmap文件映射,创建一个线性区来映射这个文件 用户态堆栈的扩展 IPC共享内存,与其他进程共享数据,内核给该进...原创 2019-07-02 09:56:33 · 165 阅读 · 0 评论 -
Linux操作系统--抢占
1、用户抢占: 从系统调用 或者 中断 返回用户空间时,检查当前进程的need_resched标志(位于thread_info结构体中),当该标志为0时,可以发生进程切换。2、内核抢占: 在内核空间中,从中断返回内核空间 或者 preempt_count计数重新为0(当前进程持有的所有锁都被释放)时 并且need_resched==0,系统处于进程上下文,此时也...原创 2019-06-18 16:25:06 · 658 阅读 · 0 评论 -
Linux操作系统--系统调用
1、应用程序一般不直接使用系统调用,而是使用API(应用程序编程接口)。POSIX标准定义了API 。Linux的API使用C库实现。2、系统调用返回值:返回负值表示错误,0表示成功。错误时,将错误码写入error全局变量。可以通过库函数perror()打印。3、系统调用只能从栈中获取函数参数。使用了asmlinkage 限定词。?[LKD--P59]4、系统调用的处理程序也即是int...原创 2019-05-13 09:55:05 · 249 阅读 · 0 评论 -
linux 的make .config Kconfig 联系和Linux的组织架构
Linux内核源码文件繁多,搞不清Makefile、Kconfig、.config间的关系,不了解内核编译体系,编译修改内核有问题无从下手,自己写的驱动不知道怎么编进内核,不知道怎么配置内核,这些问题都和Makefile、Kconfig、.config有关,下面简单谈谈Makefile、Kconfig和.config。希望对你有启发。三者的作用:简单来说就是去饭店点菜:Kconfig是菜单...转载 2019-05-16 15:40:42 · 352 阅读 · 0 评论 -
Linux操作系统--中断、中断处理、中断上下部
注:本文资料全部来源于网络或书籍,同时加上个人理解。若有侵权,告知即删。若有错误,留言商讨。中断响应过程:中断请求——>CPU响应中断,清除中断标志——>保护现场——>确定中断号,响应中断服务程序——>中断返回、恢复现场1、中断上半部:禁止响应其他中断执行,下半部:打开中断执行2、如果设备使用中断,相应的驱动程序就会注册一个中断处理程序。注册中断处...原创 2019-05-11 20:56:43 · 1023 阅读 · 0 评论 -
Linux操作系统--页高速缓存和页回写
1、页高速缓存中的页可能包含了多个不连续的物理磁盘块。buffer cache 和 page cache :buffer cache:当一个块被调入内存时,它首先存放在一个缓冲区中,每个缓冲区与一个块对应,它相当于磁盘块在内存中的表示,每个缓冲区都有一个对应的描述符,叫做buffer_head。缓冲区头的目的在于描述磁盘块和物理内存缓冲区之间...原创 2019-05-16 09:35:50 · 679 阅读 · 0 评论 -
Linux操作系统--内核同步方法
临界区:临界区的代码不能被打断,原子的执行。进入临界区不能发生进程切换,不能发生中断。造成并发的原因:1、中断——中断可能随时打断当前正在执行的代码2、软中断和tasklet——内核可以在任何时刻唤醒软中断,打断正在执行的代码3、内核抢占——内核中的任务可能被另一个任务抢占4、睡眠和用户空间的同步——内核代替进程执行,可能会被阻塞,导致进程切换,不同的进程访问共享资源导致竞争...原创 2019-05-09 17:07:47 · 223 阅读 · 0 评论 -
Linux操作系统--块IO层
1、块设备的最小寻址单元是扇区,以安装文件系统的方式访问。2、最小逻辑可寻址单元:块。块是文件系统的一种抽象,只能基于块来访问文件系统。一个块包含多个扇区,不能超过页。3、缓冲区和缓冲区头:【和页高速缓存的区别】缓冲区(buffer):每个缓冲区和一个磁盘块对应,相当于磁盘块在内存中的表示,一个缓冲区对应一个缓冲区描述符(缓冲区头)。一个块存储在一个缓冲区中,一个块不会超过一个页面大小...原创 2019-05-14 11:24:54 · 380 阅读 · 0 评论 -
slab分配器简介(1)
转载:https://blog.csdn.net/u012398362/article/details/533661863.内核内存管理的目标a.最小化管理内存所需的时间b.最大化用于一般应用的可用内存4.内存分页:连续内存和分散内存的取舍Linux内核管理物理内存是通过分页机制实现的,它将整个内存划分成无数个4k(在i386体系结构中)大小的页,从而分配和回收内存的基本单位便是内...转载 2019-05-08 22:08:01 · 210 阅读 · 0 评论 -
深入理解Linux内核-第八章内存管理
页框管理:页描述符:描述页框的状态,所有的页描述符存储在mem_map数组中。每个描述符长度为32字节。内存区管理:(X86结构为例)zone_DMA:包含低于16MB的内存页框【ISA总线直接内存存取的限制】zone_NORAML:包含16MB--896MB的内存页框zone_HIGHMEM:高于896MB的内存页框。zone_DMA和zone_NORAML包含的常规内存,通...原创 2019-05-06 18:52:19 · 263 阅读 · 0 评论 -
Linux操作系统--虚拟文件系统VFS
1、内核通过抽象层能够方便、简单的支持各种类型的文件系统。实际文件系统通过编程提供VFS所期望的抽象接口和数据结构。2、Unix系统将文件信息和文件本身区分。文件信息包括:访问控制权限、大小、拥有者、时间信息等。称为元数据。存储在索引节点中。3、Unix文件系统的物理磁盘按照VFS的组织概念布局。其他非Unix风格的文件系统也可以工作在Linux上。但是需要在使用现场引入一些特殊处理,在内...原创 2019-05-13 19:51:29 · 209 阅读 · 0 评论 -
Linux操作系统--进程管理
1、每个线程都有独立的:程序计数器、进程栈、一组进程寄存器。同一进程不同线程共享内容:进程地址空间、打开的文件、文件系统的信息、信号处理函数 、命名空间。2、进程状态:运行(TASK_RUNNING):包括正在运行和就绪态。可中断睡眠状态(TASK_INTERRUPTIBLE):相应的进程被放在对应事件的等待队列中。等待事件发生,进程被唤醒。不可中断睡眠状态(TASK_UNINTE...原创 2019-05-13 10:48:22 · 205 阅读 · 0 评论 -
Exynos4412启动--BootLoader(待续)
iROM:64K片内ROM,初始化基本系统的功能(ROM中的代码运行需要一定sram),如:堆栈、时钟、加载BL1到SRAM。BL1存储在启动设备上,BL1初始化系统时钟,DRAM控制器、加载OS到DRAM。(由三星提供)(初始化SOC,芯片级别)BL2:初始化平台(开发板级别),不由三星提供。BootLoader需要完成以下功能:初始化RAM:因为Linux 内...翻译 2019-05-13 16:01:42 · 285 阅读 · 0 评论 -
Linux启动和0 1 2 号进程
在linux启动的C阶段start_kernel()的最后,rest_init()会开启两个进程:kernel_init,kthreadd,之后主线程变成idle线程。idle进程:pid=0前身是系统创建的一个进程,也是唯一一个没有通过fork()创建或者kernel_thread产生的进程。idle进程的创建:vmlinux的入口是arch/arm/kernel/head.S...原创 2019-06-11 22:19:57 · 783 阅读 · 0 评论 -
Linux进程间通信之IPC (信号量、消息队列、共享内存)
1、首先要注意一个概念:IPC结构都是内核的结构。也就是说IPC结构由内核维护,对于每个进程都是公共的,不属于某个特定进程。只有这样,IPC结构才能支持它们“进程间通信”的功能。2、标识符(ID)和键(key):ID是IPC结构的内部名。内部即在进程内部使用,这样的标识方法是不能支持进程间通信的。key就是IPC结构的外部名。当多个进程,针对同一个key调用get函数(msgget...原创 2019-06-04 18:00:20 · 283 阅读 · 0 评论 -
根文件系统
Linux 内核在完成系统初步的初始化之后需要挂载某个文件系统做为根文件系统(Root Filesystem)。根文件系统是 Linux 系统的核心组成部分,它可以做为Linux 系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用软件所需要的库。总结根文件系统的作用:(1)init进程的应用程序(Linuxrc)在根文件系统上(2)根文件系统提供了根目录/(3)内核启动...原创 2019-06-15 21:17:46 · 288 阅读 · 0 评论 -
Linux源码阅读的一些笔记
内核入口:stext,在arch/arm/kernel/vmlinux.lds.S中定义的: (该文件定义各个函数编译后在内核镜像中的位置,链接脚本)1、start_kernel()函数 【/kernel/init/main.c】C程序的入口,所有Linux平台的Linux内核入口,主要完成剩余的与硬件平台初试化的工作。和调用第一个init进程。...原创 2019-06-15 10:30:37 · 130 阅读 · 0 评论 -
Linux内核启动过程
启动条件:CPU位于SVC模式,并且IRQ和FIQ都是禁止的;MMU内存管理关闭,此时都是物理地址;数据cache关闭,指令cache无要求;通用寄存器R0=0,R1=CPU类型,R2=内核参数列表的物理地址(设备树地址)。Linux 内核有两种映像:一种是非压缩内核,叫 Image,另一种是它的压缩版本,叫zImage。根据内核映像的不同,Linux 内核的启动在开始阶段...原创 2019-06-15 10:30:26 · 141 阅读 · 0 评论 -
Linux进程状态和转换分析
转载https://blog.csdn.net/shenwansangz/article/details/51981459Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态。Linux进程状态:R (TASK_RUNNING),可执行状态。只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可...原创 2019-05-29 20:03:48 · 368 阅读 · 0 评论