
王利涛Linux高级编程学习笔记
文章平均质量分 60
风不止G
这个作者很懒,什么都没留下…
展开
-
Linux高级编程
个人认为王利涛老师的课程非常优秀深入,能够帮助大三大四以及工作一两年的初级工程师快速入门。课程的定价如下,不到500块可以买到300多课时的教程还是比较超值的。第7期:嵌入式数据结构和Linux面向对象思想。第5期:Linux内核中的GNU C扩展语法。第2期:计算机系统架构与ARM汇编语言。本文都是基于王利涛老师的教程做的笔记。内容大部分是搬运王利涛老师的文档。第3期:程序的编译、链接和运行。第9期:CPU和操作系统入门。第8期:C语言的模块化编程。第6期:数据存储与指针。第4期:堆栈内存管理。转载 2020-09-20 21:53:35 · 395 阅读 · 0 评论 -
4.13 Linux堆内存管理(3) 内存申请释放示例
跟踪系统调用情况。原创 2024-05-19 19:11:47 · 186 阅读 · 0 评论 -
4.12 Linux堆内存管理(2) 堆内存申请与释放
Linux堆内存管理(2) 堆内存申请与释放1. 学习的必要性加深对堆内存的理解系统设置与优化2. chunk通过malloc申请的内存都使用一个malloc_chunk的结构体表示Glibc/malloc/malloc.c2.1 已分配的chunk标志位:A: =0 表示从主分配区分配内存;= 1 从非主分配区分配内存M: =0 表示从Heap分配内存;=1表示从MMAP映射区分配内存P: =0 表示前一个chunk空闲2.2 空闲的chunk使用free释放掉的内存块原创 2024-05-19 18:48:58 · 751 阅读 · 0 评论 -
4.11 Linux堆内存管理(1) 内存分配器
理论上大约2.9G的虚拟地址空间,对应下图绿色部分,和黄色区域的一部分。原创 2024-05-19 17:52:55 · 340 阅读 · 0 评论 -
4.9 堆管理: 内存的申请与释放
由程序员动态分配的内存区域。原创 2024-05-19 17:17:41 · 553 阅读 · 0 评论 -
4.2 栈的初始化
FILO:先进后出栈指针SP。原创 2024-05-19 16:20:46 · 319 阅读 · 0 评论 -
4.1 程序与内存的关系
内存映象指的是内核如何在内存(虚拟地址空间)中存放可执行程序。所有进程的内核空间都映射到同样的物理内存。注:页表会被映射到内核空间中。原创 2024-05-19 16:07:25 · 293 阅读 · 0 评论 -
3.21:U-boot重定位分析
u-boot 一般是加到内存的最高端。原创 2024-05-12 16:50:45 · 699 阅读 · 0 评论 -
3.16 动态链接(3): 共享库
x:主版本号,表示库的重大升级、不同主版本号之间不兼容依赖旧版本的程序需要重新编译、才能运行y:次版本号,库的增量升级即增加一些新的接口符号,原来的接口符号不变,高版本向后兼容低版本z:发布版本号,一些错误修正、性能改进等,不增加新接口、原来接口保持不变。原创 2024-05-05 20:05:28 · 374 阅读 · 0 评论 -
3.15 动态链接(2): 全局偏移表
got:编译器将对外部引用(绝对地址)的符号全部分离出来放到该表中。每一个引用外部模块定义的符号在GOT表中有相应的条目。ELF就是采用PLT的方式来实现。程序运行之前的动态链接、重定位。延迟绑定:提高运行速度。原创 2024-05-05 19:50:29 · 584 阅读 · 0 评论 -
3.14 动态链接(1): 与位置无关代码
对于每个进程,共享库都链接到一个不同的地址,导致动态库无法在多个进程之间共享,无法节省内存,违背了动态库的设计初衷。加载到内存中的地址是随机的,根据地址空间空闲情况分配。动态库被装载到内存任意地址都可以运行,怎么实现?放到哪里,都可以执行,无须重定位,无须改变。核心问题:如何使引用外部模块的符号地址无关。原创 2024-05-05 18:26:57 · 507 阅读 · 0 评论 -
3.13 链接静态库
如果只调用一个函数,将链接整个静态库,可执行体积大大增加!每个函数的实现都使用一个源文件,生成对应目标文件。原创 2024-05-04 17:45:45 · 173 阅读 · 0 评论 -
3.12 main函数入口分析
完成进入main函数的一系列初始化操作。C running time:C运行库。– 留给程序员编程接口:main。– 按照C标准实现各种库函数。原创 2024-05-04 17:13:30 · 264 阅读 · 0 评论 -
3.11 BSS段的处理
comm:在BSS段申请一段buffer空间。BSS段的汇编级代码实现。原创 2024-05-04 17:00:46 · 252 阅读 · 0 评论 -
3.10 程序的运行
操作系统环境下:可执行ELF文件运行裸机环境下:BIN/HEX文件运行。原创 2024-05-03 21:35:32 · 288 阅读 · 0 评论 -
3.8 链接过程(2):符号解析 强符号与弱符号
函数名初始化的全局变量。原创 2024-05-03 20:50:47 · 424 阅读 · 0 评论 -
3.7 链接过程(1) 地址空间分配与链接脚本
将所有的可重定位目标文件合并、组装成可执行目标文件。原创 2024-05-03 20:24:08 · 247 阅读 · 0 评论 -
3.6 编译过程(3):符号表
在编译过程中,符号表用来保存源程序中各种符号的信息主要包括符号的地址值、类型、占用空间的大小。原创 2024-05-03 19:46:19 · 1723 阅读 · 0 评论 -
2.12 链接脚本
GNU Linux环境下,链接脚本一般是xxx.lds,如u-boot下的链接。不同系统下,链接脚本的文件后缀一般不一样。脚本u-boot.lds。原创 2024-04-14 15:01:09 · 216 阅读 · 0 评论 -
2.10 C和汇编混合编程
GNU编译器对ANSI C扩展,使用__asm__修饰,表示后面的代码为。内嵌汇编,其后可选择使用__volatile__告诉编译器不要优化代码。ARM编译器对ANSI C进行扩展,使用__asm在C语言中内嵌汇编。使用满递减FD堆栈,入栈出栈操作使用LDMFD/STMFD。内嵌单行汇编代码示例。原创 2024-04-14 14:36:18 · 249 阅读 · 0 评论 -
2.6 ARM体系结构及指令
• Load/store体系结构,只能处理寄存器的数据 (从内存里加载)• 固定指令长度、单周期指令• 流水线• 倾向于使用更多的寄存器用来存储数据。原创 2024-04-14 14:02:38 · 546 阅读 · 0 评论 -
2.5 指令集、微架构与编译器
具体表现为CPU硬件电路,其功能是,实现指令集规定的各种操作、运算注:微架构仅仅是一个CPU内核(CPU硬件电路), 是指令集的一个具体实现,它不是SOC。原创 2024-04-13 21:25:40 · 1160 阅读 · 0 评论 -
2.4 总线与地址
I/O端口I/O内存。原创 2024-04-13 19:21:27 · 177 阅读 · 0 评论 -
2.2 X86与ARM架构对比分析
整个系统使用同一个时钟频率。原创 2024-04-13 16:33:57 · 395 阅读 · 0 评论 -
9.22 内存管理单元MMU(下)
9.22 内存管理单元MMU(下)权限管理通过页表项管理页表项地址转换信息访问权限交换分区内存不够用的时候在磁盘开辟空间页帧指向磁盘空间原创 2020-11-02 00:03:31 · 144 阅读 · 0 评论 -
9.21 内管管理单元MMU(上)
9.21 内管管理单元MMU(上)MMU 内存管理单元地址转换![[Pasted image 20201003231724.png]]地址转换(改进) 页帧号+页内偏移虚拟地址1000410 代表虚页号0004代表页内偏移![[Pasted image 20201003231846.png]]权限管理交换分区MMU的TLB加速解析内核空间的页表...原创 2020-11-02 00:03:00 · 146 阅读 · 0 评论 -
9.20 位域
9.20 位域位域的应用信息的压缩存储、节省存储单元读写方式方便、可读性强操作系统内核、驱动源码:tcphdr注意事项位域不能跨越字节存储长度不允许超过一个字节允许匿名函数代码#include<stdio.h>#include<string.h>struct register_usb{ unsigned short en:1; unsigned short ep:4; //ep占4个位 unsigned short mode:3;};struct原创 2020-11-02 00:02:20 · 110 阅读 · 0 评论 -
9.19 位运算(下)
9.19 位运算(下)寄存器读写操作1 .#include<stdio.h>#define BIT_0 0x1#define BIT_1 0x1<<1#define BIT_2 0x1<<2#define BIT_3 0x1<<3#define BIT_5 0x1<<5#define BIT_6 0x1<<6#define BIT_9 0x1<<9#define BIT_12 0x1<<1原创 2020-11-02 00:01:54 · 120 阅读 · 0 评论 -
9.18 位运算(上)
9.18 位运算(上)位运算应用场合特殊算法嵌入式位运算符操作运算符取反~左移<<右移>>与&异或^或\经典用法高低位互换int main2(void){ printf("%X\n",0xAABB); printf("%X\n",0xAABB>>8 | 0xAABB<<8 & 0xFF00); //从右向左 return 0;} mask &原创 2020-11-01 23:50:12 · 106 阅读 · 0 评论 -
9.17 IO端口与IO内存
9.17 IO端口与IO内存CPU与外设通信51单片机直接赋值(统一编址)sbit P10=P1^0;P10 = 1;汇编格式:mov P1,#01Bsetb p1.0![[Pasted image 20201003195007.png]]通过控制器IP寄存器配置(独立编址)GPFCON |= BIT0设置GPF0为输出管脚输出1:GPFDAT[0]=1![[Pasted image 20201003195102.png]]外设控制器的寄存器独立编址IO端口:每个寄存器对原创 2020-11-01 23:49:41 · 120 阅读 · 0 评论 -
9.16 内存、外存与外设
9.16 内存、外存与外设按速度排列寄存缓存内存外存存储分类内存又称主存:CPU能直接寻址的存储空间、存取速度快包括:RAM、ROM、cache等外存又称辅存:除CPU缓存和内存以外的存储器包括:磁盘、NAND Flash、SD卡、EEPROM等外部设备计算机系统中输入、输出设备的统称(包括外存)外设:鼠标、键盘、显卡、声卡、打印机、磁盘外设接口:UART、USB、I2C、GPIO、I2S、Ethernet、AD/DA外设控制器设备控制:打开、关闭、运行协议控制:USB原创 2020-11-01 23:49:10 · 2080 阅读 · 0 评论 -
9.15 存储抽象:文件系统
9.15 存储抽象:文件系统文件系统格式化对存储设备的抽象地址管理:文件/目录与磁盘存储地址的映射权限管理:文件读写、安全保护统一接口:文件系统的相关系统调用文件系统的挂载文件系统要先挂载到某一个目录,然后才能使用mount的本质:改变映射关系根目录“/”Linux内核初始化后,创建的一个根目录接着会mount第一个文件系统:根文件系统其它分区、磁盘、SD先mount到RootFS上,然后通过文件接口访问根文件系统Linux内核运行所需要的一些目录:挂载、命令、库启动脚本、配原创 2020-11-01 23:48:35 · 164 阅读 · 0 评论 -
9.13 存储器映射(上)
9.13 存储器映射(上)存储器分类ROMRead Only Memory:只读、不能写、数据断电不消失PROM:可以写一次EPROM:可多次紫外线照射擦除EEPROM:可多次电擦除,可访问和修改任何一个字节Flash :广义的EEPROM,以块为单位擦除FLASHNOR Flash:数据、地址线分开,具有随机寻址功能NAND Flash :数据、地址线复用,不能随机寻址、按页读取eMMC:Nand Flash + 读写控制器 + MMC协议接口、BGA封装SD:Nand Flash原创 2020-11-01 23:48:03 · 119 阅读 · 0 评论 -
9.14 存储器映射(下)
9.14 存储器映射(下)存储映射存储映射:给存储单元分配逻辑地址的过程每个物理存储单元并没固定的地址每个物理存储单元的地址通过重映射,可以改变![[Pasted image 20201003193118.png]]存储映射的实现跟处理器有关存储映射寄存器:起始地址、结束地址或大小设置BANK基地址位带区、位带区别名时机:复位之前由CPU自动完成...原创 2020-11-01 23:46:31 · 97 阅读 · 0 评论 -
9.12 中断(下):中断函数的编写
9.12 中断(下):中断函数的编写中断特性可随时打断正在执行的任务可在任何地方打断正在执行的任务中断返回后,CPU不一定重新执行被打断的任务中断函数调用时间不固定:中断要自己保护现场调用地点不固定:无法给中断函数传参返回地点不固定:中断函数不能有返回值裸机环境下的中断函数基本流程保存中断现场– 状态寄存器、返回地址入栈– 中断函数中要使用到的寄存器入栈清中断//关中断,保护现场、有些硬件自动清除,重启开启中断前记得要清除执行中断函数体恢复现场– 将栈中的寄存器弹出,恢原创 2020-11-01 23:45:58 · 1444 阅读 · 0 评论 -
9.11 中断(中):进程栈与中断栈
9.11 中断(中):进程栈与中断栈进程上下文进程上下文pc 指针指向 task函数体sp 指针指向 任务栈栈是C语言运行的基础函数调用:局部变量、函数参数、返回地址、寄存器现场保护:状态寄存器 、寄存器、返回地址SP指到哪,我就可以在哪里执行函数栈帧符号访问:SP/FP + 相对偏移SP指针的切换饭店与小摊儿进程栈task3执行完之后状态寄存器、堆栈指针、中断地址重新弹到cpu![[Pasted image 20201003182707.png]]Linux进程的内核栈!原创 2020-11-01 23:45:26 · 1110 阅读 · 0 评论 -
9.10 中断(上):中断处理流程
9.10 中断(上):中断处理流程中断的重要性时钟是操作系统的“心脏”中断是理解操作系统的切入点系统调用任务调度内存管理中断广义的概念任何打断系统正常执行流程外部中断内部异常软中断中断向量表![[Pasted image 20201003180626.png]]IRQ中断处理流程硬件自动跳转handler 要自己写![[Pasted image 20201003180706.png]]...原创 2020-11-01 23:44:51 · 125 阅读 · 0 评论 -
9.8 系统调用 (上)
9.8 系统调用 (上)函数调用自定义函数C标准库第三方库框架操作系统ucos 多任务编程示例void task1(void){ while(1) { ; }}void task2(void){ for(;1;) { ; }}OS_STK stack1[512];OS_STK stack1[512];int main(void){ serial_init(); board_init(); OSInit(); OSTaskCreate(task1原创 2020-11-01 23:44:11 · 112 阅读 · 0 评论 -
9.7 临界区与临界资源
9.7 临界区与临界资源不可重入函数应用场合多任务环境在执行过程中可能会被中断、任务切换打断临界资源一次只允许一个进程使用的共享资源互斥访问,同一时刻只允许一个进程访问举例:打印机、全局变量、静态变量、缓冲区临界区访问临界资源的代码段临界区访问方式:互斥访问同时刻只允许一个进程访问临界区的实现操作原语EnterCriticalSection()LeaveCriticalSection()实现方式互斥访问:信号量、互斥量、自旋锁关中断uC/OS 临界区实现#if OS_原创 2020-10-31 00:17:51 · 723 阅读 · 0 评论 -
9.8 系统调用 (上)
9.8 系统调用 (上)函数调用自定义函数C标准库第三方库框架操作系统ucos 多任务编程示例void task1(void){ while(1) { ; }}void task2(void){ for(;1;) { ; }}OS_STK stack1[512];OS_STK stack1[512];int main(void){ serial_init(); board_init(); OSInit(); OSTaskCreate(task1原创 2020-10-31 00:10:43 · 141 阅读 · 0 评论