- 博客(86)
- 资源 (4)
- 收藏
- 关注
原创 内存管理篇-09伙伴系统初始化一:memblock管理
计算机加电后进行硬件检测。加载引导程序,将Linux内核加载到内存中。:内核被加载后开始初始化各个子系统。进行CPU架构相关的初始化。初始化内存控制器和其他设备驱动。在内核初始化的过程中,会调用mm_init函数来初始化内存管理系统。mm_init函数会初始化包括伙伴系统在内的各种内存管理组件。mm_init将由初始内存分配器(如memblock allocator)管理的内存空间释放到伙伴系统中内核就可以使用伙伴系统来管理物理内存的分配和回收。
2024-08-25 15:37:17
516
原创 内存管理篇-08连续内存分配器CMA
DMA区域会极大的浪费内存的使用,因为即使DMA没有人使用,DMA区域也会空在这里,因此引入CMA解决这种问题。为了解决既不浪费内存,又能申请到连续的物理内存空间,在嵌入式中引入了CMA的概念。CMA区域和DMA功能一样,专门用于DMA或者其他功能。只有当dma或者其他模块需要连续大块内存的时候,它才会分配出一个CMA区域。
2024-08-25 10:51:35
428
原创 内存管理篇-07页分配器接口-alloc_page
----终于到了编码实战阶段了,前面都是在将思想和实现机制,即使看了源代码还是模模糊糊,不够清晰。本节通过内核接口从伙伴系统进行申请和释放内存。其实很多缓存机制最终都是通过伙伴系统申请一大片内存,然后内部再进行对这些页处理优化。伙伴系统提供了free_page和alloc_pages两个函数进行申请和释放内存,至于函数内部的实现机制,这里还没开始讲,主要讲了如何使用。
2024-08-24 17:07:34
223
原创 内存管理篇-06Per-CPU页帧缓存
是一种缓存机制,对伙伴系统的完善。由于伙伴系统管理的页面都是全局的,每个进程在申请页面的时候都需要加锁解锁等操作,极大的引入了开销。为了提高效率就引入页帧缓存,为每个cpu提供一个变量指针__percpu *pageset(定义在struct zone),这样每个cpu就不用去加锁解锁申请,直接使用本地物理页面。把单个物理页面的申请和释放做成缓存,每个cpu都有这个链表。给每个cpu本地定义一个页表,维护这样一个变量。因此,不需要去全局伙伴系统上去申请释放。
2024-08-24 15:37:33
268
原创 内存管理篇-05物理页面的迁移类型migratetype
本节内容依旧是对上节课伙伴系统的补充,主要介绍了新版伙伴系统的页面迁移相关的内容为什么要引入页面迁移类型?新版本伙伴系统针对老版本的伙伴系统的升级改进。主要优化memory compaction内存碎片整理的过程。页面迁移实际上就是伙伴系统中free_area[MAX_ORDER]结构体保存的链表指针将链表分类,如上图所示。并且页面在申请的时候也去考虑它的类型。将不可移动的放一块,可移动的放一块等等;
2024-08-24 13:00:54
223
原创 内存管理篇-04伙伴系统
首相将系统中的内存分为大小不同的物理块,对于物理地址相连的物理页合并成大的物理块,对于相同大小的物理块用链表连接起来,通过一个struct free_area free_are[MAX_ORDER]保存,每个元素都指向一个链表(他们内存块大小不一样)。相反,如果用户释放内存,如果发现释放后的page和旁边的相连,就会逆向的把它合并在一起。对每个free_area[order]进行分类,观察哪些是可移动的,不可移动的,可回收的,预留的,隔离的以及CMA等等。首先,伙伴系统的实现是基于分区zone的实现的。
2024-08-24 12:40:50
141
原创 内存管理篇-01内存管理学习概述
内存管理相关知识:为什么要分为虚拟内存和物理内存? 用户空间,内核空间 物理地址,虚拟地址 页表是什么?谁在维护?存在哪里?什么格式? mmu,tlb 映射:文件映射,匿名映射,io内存映射 驱动如何申请内存? 面试:缺页中断,伙伴系统本期课程主要内容:物理内存管理: zone, page 伙伴系统 虚拟内存管理 mmu,页表,tlb 内存申请与释放接口 映射机制底层实现 预期收获:物理内存,虚拟内存的划分 深入理解页表,地址转换,映射 学会使用内核提供的接口申请内
2024-08-23 21:07:29
139
原创 AES算法
收集了几个博主1、https://blog.csdn.net/shaosunrise/article/details/802199502、https://blog.csdn.net/qq_36310253/article/details/1096673813、https://www.cnblogs.com/hello-/articles/8718186.html4、https://blog.csdn.net/qq_38289815/article/details/809008135、ht
2024-05-29 22:23:56
1166
原创 Unix环境高级编程--4-文件和目录--4.1-4.2函数stat-4.3文件类型
struct stat { mode_t st_mode; // file type & mode(permissions) ino_t st_ino; // i-node number(serial number) dev_t st_dev; // device number(filesystem) dev_t st_rdev; // device number for specials files .
2024-05-29 22:22:33
423
1
原创 Unix环境高级编程--7-进程环境--7.1-7.2main函数-7.3进程退出
1、几个问题①main函数如何被调用?②命令行参数如何传递给新程序?;③典型储存空间布局是什么样的?;④进程如何使用环境变量 ?;⑤进程的各种终止方式?2、main函数当内核执行C程序时,...
2024-05-29 22:22:08
588
原创 Unix环境高级编程--8-进程控制---8.1-8.2进程标识-8.3fork函数-8.4 vfork函数
1、进程控制几个过程创建进程--》执行进程---》终止进程2、进程标识(1)专用进程:ID为0的进程是调度进程,常常被称为交换进程,也称为系统进程; ID为1通常是init进程,在自举结束时由内核调用;(2)函数:pid_t getpid(void); 获取当前进程id pid_t getppid(void);获取父进程id3、fork函数...
2024-05-29 22:21:56
738
原创 Unix环境高级编程--8-进程控制---8.7函数waitid 8.8函数wait3 wait4
1、Single Unix Specification支持一个取得进程终止状态的函数--waitid,此函数类似于waitpid: pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options); int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);2、wait3和wait4 ...
2024-05-29 22:21:41
595
原创 第三章 Linux目标文件解析
解析目标文件内容:举例说明//root@ubuntu:/mnt/hgfs/share/019-proself/04# cat simplesection.cint printf(const char* format,...);int global_init_var=84;int global_uninit_val;void func1(int i){ printf("%d\n",i);}int main(void){ static int static_
2024-05-29 22:21:27
937
原创 全新Linux教程-驱动大全-PCI和PCIe子系统-P6-PCIe路由方式
和前面讲的类似,就是通过桥的地址范围进行过滤,不管来自上层的地址还是来自endpoint的地址,桥都会进行处理转发。主要是TLP的头部。主设备要给EndPoint的内存写数据,它发出"内存写报文",不需要对方回应。主设备要给EndPoint的IO写数据,它发出"IO写报文",需要对方回应。主设备要读EndPoint的内存数据,它发出"内存读报文",需要对方回应。主设备要读EndPoint的IO数据,它发出"IO读报文",需要对方回应。PCIe设备(EndPoint)被配置后,它记录有分配给它的基地址。
2024-04-20 15:55:11
713
原创 全新Linux教程-驱动大全-PCI和PCIe子系统-P4从软件的角度看pcie硬件结构
注释:了解pcie的硬件接口,lanes,link,串行,并行,包结构。
2024-04-20 12:42:07
638
原创 全新Linux教程-驱动大全-PCI和PCIe子系统-P3-PCI设备的访问方法-桥设备
本节主要讲了如何去配置桥设备和桥之后的设备。上节已经讲到可以直接通过不同引脚访问直连的PCIe Agent设备。①IDSEL ②C/BE ③AD[31:0]访问funciotn和寄存器。
2024-04-20 12:24:59
365
原创 全新Linux教程-驱动大全-PCI和PCIe子系统-P1-从软件角度看PCI和PCIE
①使用差分信号串行接口。②PCI和pcie对于CPU来说是兼容的。参考:01_pcie接口引脚电路示例_AX99100.pdf`
2024-04-20 11:46:18
585
原创 全新Linux教程-驱动大全-PCI和PCIe子系统-P5-PCIe设备的配置过程
2. 从Bus 0开始扫描(发出配置0的读,读到A的配置寄存器):先尝试读到BDF(0,0,0)设备的Vendor ID,如果不成功表示没有这个设备,就尝试下一个设备BDF(0,1,0)。RC传过来的地址,会经过每个P2P的判断,判断该地址在不在P2P处理的范围之内(图中,假设了每个P2P的地址范围分别是A-B,C-D,E-F)。但是,由于设备号是在硬件上就写死了的,例如RC后pcie桥的所有p2p桥,会从做到右一次进行编号0,1,2(因此在RC这一层也就是bus0这层,可以根据设备号来选择哪个设备)。
2024-04-20 11:19:04
1265
原创 win10网卡“该设备无法启动(代码10)”
微星电脑突然出现网卡无法启动,后来尝试了网上的各种方法没解决(网卡驱动卸载重装,升级驱动,释放静电等待)。然后用下面的办法才解决的。(1)win+x 选择windoes shell 管理员。
2023-06-23 11:13:05
2887
3
原创 第二季--上学期--专题8 不用内存怎么行--01从内部看内存
知识点1、内存分类1.1 sram1.2 dram 1.2.1 sdram 1.2.2 ddr 1.2.3 ddr22、内存内部结构2.1 表结构2.2 L-Bank2.3 寻址信息 2.3.1 L-BANK选择信号 2.3.2 行地址 2.3.3 列地址sram:它是一种具有静止存取功能的内存,不需要定期刷新电路就能保存它内部的存储的数据。存储速度快,但是功耗大,成本高,常用作存储容量不高,但是存储速度快的场合,例如steppi...
2022-04-30 22:48:55
282
原创 第二季--上学期--专题10 C语言环境初始化--05 C与汇编混合编程
知识点:1、汇编调用C函数2、C函数调用汇编函数3、C内嵌汇编1、为什么需要混合编程(1)执行效率(2)能够直接控制寄存器2、汇编调用C函数ldr pc, =gboot_main 在汇编脚本中直接改变pc指针即可3、C函数调用汇编函数.global _start.global light_ledint gboot_main(){ light_led();直接调用汇编脚本中的标识即可,但是同时需要light_led申明全局 return 0; }...
2022-04-30 18:34:37
1206
原创 第二季--上学期--专题9 代码搬移sram->sdram
1、arm启动流程回顾2440(1)从nand flash中的前4KB拷贝到sram(垫脚石)中进行运行。(2)然后pc指针指向0地址,执行垫脚石的第一条指令;(3)接着运行这4KB的指令,这4kb的内容需要完成必要的初始化工作:①内存sdram初始化好,nand flash初始化好;②再把整个nand flah上的程序拷贝到内存。③剩下的代码就在内存中运行了。210开发板注意210和2440有一些区别,多出来一个srom2、代码移植(1)确定起点(2)相
2022-04-30 18:33:58
414
原创 第二季--上学期--专题10 C语言环境初始化--03跳转C大门
1、采用什么方式跳跃?--跳转到C代码相对跳转: B BL绝对跳转:pc =xxxx2、检验是否跃成功?sram跳转到ram直接跳转:直接将需要跳转的地址赋值给pc指针相对跳转:由于逻辑程序是通过sram中拷贝到ram中的,所以sram中也有main函数ldr pc, =gboot_mainMakefileall: start.o main.o arm-linux-ld -Tgboot.lds -o gboot.elf $^ arm-linux-objc...
2022-04-30 10:45:04
801
原创 第二季--上学期--专题10 C语言环境初始化--02bss段初始化
1、bss段bss段为什么要清零?bss段的起始地址和结束地址是如何确定的?在boot裸板开发的bss段清零工作和应用程序的bss段清零工作有什么区别?初始化的全局:数据段局部:栈malloc:堆未初始化全局:bss段clean_bss: ldr r0, =bss_start ldr r1, =bss_end cmp r0, r1 moveq pc, lrclean_loop: mov r2, #0 str r2, [r0]...
2022-04-30 10:19:12
306
原创 第二季--上学期--专题10 C语言环境初始化--01栈初始化
1、参考链接ARM——栈 - dongry - 博客园【精华】程序员的自我修养视频教程_哔哩哔哩_bilibili2、栈的初始化1、概念解析:栈桢---sp栈指针 fp栈基址栈:栈是一种具有后进先出的数据组织方式,也就是说后放进去的数据后面取出来(也可以是数据结构体对象)。栈底是第一个进栈的数据所在的位置,栈顶是最后一个数据所处在的位置。数据组织有:链表、图、树等等。我们把数据的组织实现方式当成黑盒使用即可。pop(stack,&data)push(stack,&
2022-04-29 21:11:21
1506
原创 008 -1 内存映射原理--虚拟内存区域的结构体--系统调用
1、内存映射原理参考文献:深入理解Linux内存子系统 (qq.com)经典|图解Linux内存性能优化核心思想 (qq.com)CPU对外设端口物理地址的编址方式有两种:一种是IO映射方式,另一种是内存映射方式。(1)IO映射方式:CPU是i386架构的情况在i386系列的处理中,内存和外部IO是独立编址,也是独立寻址的。MEM的内存空间是32位可以寻址到4G,IO空间是16位可以寻址到64K。(2)内存映射方式:arm,powerpc在这一类的嵌入式处理器中,IO Port的寻址方式..
2022-04-22 20:15:54
955
原创 007-2虚拟地址空间布局
二、虚拟地址空间布局ARM64处理器不支持64位完全虚拟地址。在ARM64结构的linux内核中,内核虚拟地址和用户虚拟地址都是48位,并没有占用前面的16位。所有进程共享内核虚拟地址:ffff 0 0 0 - ffff ffff ffff ffff。每个进程拥有独立的用户空间:0 0 0 0 -- 0 ffff ffff ffff 。同一个进程底下的线程组共享用户的虚拟地址,内核线程不具备用户态的虚拟地址空间。1、用户虚拟地址的划分进程的用户虚拟空间的起始地址是0, 长度是TASK_S
2022-04-17 15:02:43
934
原创 C语言可变参数解析与实现
#include <stdio.h>#include <stdarg.h>struct person{ char *name; int age; char score;};struct person1{ char *name; int age; char score;}__attribute__((packed));struct person2{ char *name; int age; char score;}__attribut...
2022-02-25 21:23:18
477
原创 smart210 使用sd卡烧写uboot
1、刚刚拿到210开发板,发现资料只要友善的superboot,这个是他们没有公开的二进制文件,只能用来刷系统。而且只能配合他们的minitools SD-flasher.exe软件来使用。对于学习boot和linux内核来说简直一点用没有。2、于是碰到了一个致命的问题,如何把自己编译的uboot放在sd卡,将sd卡制作启动盘?在网上百度了一大堆,发现方式多种多样,有window专门制作sd卡,还有朱友鹏老师的sd_fusing2.sh sd_fusing.sh等等脚本,最后发现都或多或少有以下问题。
2022-01-03 14:03:47
1098
原创 linux内核链表移植详解
1、介绍linux内核链表重要是针对:普通链表无法管理所有结构体节点串联起来;普通链表利用一种结构只能表示一个对象。加入我只想对某个节点添加某种属性int number;将会需要改变所有节点结构体。struct list_node{int value1;char value2;struct list_node *next;struct list_node *prev;};改成内核链表的方式:struct list_node{struct list_node *n
2022-01-01 14:03:42
811
原创 硬件原理图之GPIO
1、GPIO和门电路学习什么是输入输出引脚?作为输入引脚2、什么是上拉电阻?什么是下拉电阻??3、查看LED电路图nLED1-4直接接芯片,当它们作为输出引脚的时候,并且赋予低电平时,点灯。反之。分别接芯片的GPB5 6 7 8引脚。继续查看芯片手册IO端口的章节,查看如何配置该引脚作为输出或者输入。按键电路图分析4、中断对于某些芯片来说,GPIO的引脚同时也可以用于中断引脚。...
2021-10-30 19:26:05
520
原创 linux中断驱动程序
1、内核和芯片初始化代码已经将异常或者中断的架构处理了。此时需要用户提供处理函数。也就说用户需要告诉内核当某一个中发生时,处理哪些内容!!需要使用到的注册函数request_irqint request_irq(unsigned int irq, irq_handler_t handler,unsigned long irqflags, const char *devname, void *dev_id){(1)分配一个irqaction结构 action = kmalloc(si...
2021-10-24 23:04:06
3031
原创 Linux内核中断处理机制--初始化
1、Linux内核从start_kernel函数开始进行初始化(1)trap_init主要就是异常的初始化。(2)init_IRQ才是中断的初始化。2、trap_init都干了啥呢?void __init trap_init(void){.... 把向量表拷贝到ffff0000地址memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start);.... 把复杂向量表拷贝到ffff0200mem.
2021-10-23 09:42:47
1958
原创 中断处理机制
(1)为什么内核需要中断?(2)硬件实现一个中断需要做什么?注册就是告诉内核的存在;(3)什么是快中断 什么是慢中断?前者不允许发生中断嵌套read属于中断上下文还是进程上下文?中断上下文,进程上下文的区别?因为函数是由进程主动实现的,所以属进程上下文。中断上下文属于硬件引起的。在中断处理函数中,没有所谓的进程的概念。所以不存在直接向用户空间发送消息,也不存在进程的调度,以及进程阻塞。内核中...
2021-10-19 22:35:08
260
ANSI《C标准库》P.J.plauger的著作;也就是我们经常调用的库函数接口
2021-05-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人