linux 内存原理,linux 查看内存使用情况

大家好,如果您还对linux 内存原理不太了解,没有关系,今天就由本站为大家分享linux 内存原理的知识,包括linux 查看内存使用情况的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

Linux嵌入式系统开发的目录

第1章嵌入式系统概述 1

1.1嵌入式系统的概念 1

1.1.1嵌入式系统的定义 1

1.1.2嵌入式系统的特点 2

1.2嵌入式系统的组成 2

1.2.1嵌入式处理器 2

1.2.2外围设备 3

1.2.3嵌入式操作系统 3

1.2.4应用软件 3

1.3嵌入式处理器 4

1.3.1嵌入式处理器的分类 4

1.3.2嵌入式微处理器 5

1.3.3嵌入式微控制器 5

1.3.4嵌入式DSP处理器 6

1.3.5嵌入式片上系统 6

1.3.6选择嵌入式处理器 7

1.4嵌入式操作系统 7

1.4.1操作系统的概念和分类 7

1.4.2实时操作系统 8

1.4.3常用的嵌入式操作系统 10

1.5新型的嵌入式操作系统 13

1.5.1 Android 13

1.5.2 MontaVista 14

1.6嵌入式系统的应用 15

1.7嵌入式系统的发展趋势 18

1.7.1嵌入式系统面临的挑战 18

1.7.2嵌入式系统的发展前景 18

1.8本章小结 19

第2章嵌入式系统开发过程 20

2.1嵌入式软件开发介绍 20

2.1.1嵌入式软件开发的特殊性 20

2.1.2嵌入式软件的分类 21

2.1.3嵌入式软件的开发流程 21

2.1.4嵌入式软件开发工具的发展趋势 23

2.2嵌入式软件的调试技术 24

2.2.1调试技术介绍 24

2.2.2基于JTAG的ARM系统调试 25

2.3嵌入式软件测试技术 26

2.3.1宿主机-目标机开发模式 26

2.3.2目标监控器 27

2.4嵌入式系统集成开发环境 29

2.4.1 ADS的介绍 29

2.4.2 ADS建立工程的使用介绍 31

2.4.3 AXD调试器的使用介绍 36

实例2-1:ARM开发环境ADS的使用实例 38

2.5本章小结 42

第3章 ARM体系结构 43

3.1 ARM体系结构概述 43

3.1.1 ARM体系结构简介 44

3.1.2 ARM体系结构的技术特征 46

3.1.3 CISC的体系结构 47

3.1.4 RISC的体系结构 47

3.1.5 RISC系统和CISC系统的比较 49

3.2 ARM微处理器的分类 50

3.2.1 ARM7微处理器 50

3.2.2 ARM9微处理器 51

3.2.3 ARM9E微处理器 51

3.2.4 ARM10E微处理器 52

3.2.5 ARM11微处理器 53

3.2.6 SecurCore微处理器 53

3.2.7 trongARM微处理器 53

3.2.8 XScale微处理器 54

3.3 ARM微处理器的应用 54

3.3.1 ARM微处理器的应用选型 54

3.3.2 S3C2410处理器 55

3.4存储器 56

3.4. 1存储器简介 56

3.4.2 SDRAM操作 58

3.4.3 Flash 59

3.5 ARM编程模型 60

3.5.1数据类型 60

3.5.2存储器格式 61

3.5.3处理器工作状态 61

3.5.4处理器运行模式 62

3.5.5寄存器组织 62

3.5.6内部寄存器 65

3.6 ARM指令的寻址方式 66

3.6.1立即寻址 66

3.6.2寄存器寻址 67

3.6.3寄存器间接寻址 67

3.6.4相对寻址 68

3.6.5堆栈寻址 68

3.6.6块复制寻址 69

3.6.7变址寻址 69

3.6.8多寄存器寻址 70

3.7 ARM指令集 70

3.7.1 ARM指令的格式 70

3.7.2 ARM指令分类 71

3.7.3 Thumb指令介绍 77

3.7.4 Thumb指令分类 78

3.7.5 ARM指令集和Thumb指令集的区别 81

3.8 ARM微处理器的异常 82

3.8.1 ARM体系结构所支持的异常类型 83

3.8.2异常向量表 84

3.8.3异常优先级 84

3.8.4应用程序中的异常处理 85

3.8.5各类异常的具体描述 86

3.9本章小结 90

第4章 Linux基本操作 91

4.1 Linux系统的介绍 91

4.1.1 Linux的概况 91

4.1.2 Linux操作系统的构成 93

4.1.3 Linux常见的发行版本 94

4.1.4 Linux内核的特点 95

4.2 Linux命令的使用 96

4.3 vi编辑器的使用 106

4.3.1 vi编辑器的进入 107

4.3.2命令模式的命令 107

4.3.3末行模式的命令 108

实例4-1:vi编辑器使用实例 109

4.4 Shell编程 110

4.4.1 Shell基础介绍 110

4.4.2 Shell程序的变量和参数 113

4.4.3运行Shell程序 114

4.4.4 Shell程序设计的流程控制 115

4.4.5 Shell输入与输出 120

4.4.6 bash介绍 121

4.5综合实例 123

实例4-2:编写清除/var/log下的log文件综合实例 123

实例4-3:编写寻找死链接文件综合实例 126

4.6本章小结 129

第5章 Linux进程 130

5.1进程概述 130

5.1.1进程结构 131

5.1.2进程的控制操作 132

5.1.3进程的属性 134

5.1.4进程的创建和调度 135

5.1.5 Linux进程命令 137

5.2系统调用 141

5.2.1系统调用简述 141

5.2.2系统调用的进入 142

5.2.3与进程管理相关的系统调用 142

5.3管道 143

5.3.1管道系统调用 143

5.3.2管道的分类 144

实例5-1:管道通信实例 145

5.4信号 147

5.4.1常见的信号种类 147

5.4.2系统调用函数 148

5.4.3信号的处理 149

5.4.4信号与系统调用的关系 150

实例5-2:信号实例 151

5.5信号量 152

5.5.1信号量概述 152

5.5.2相关的数据结构 153

5.5.3相关的函数 155

实例5-3:信号量实例 156

5.6共享内存 161

5.6.1共享内存原理 161

5.6.2共享内存对象的结构 162

5.6.3相关的函数 162

实例5-4:共享内存实例 163

5.7消息队列 169

5.7.1有关的数据结构 169

5.7.2相关的函数 171

实例5-5:消息队列实例 173

5.8综合实例 177

实例5-6:多线程编程实例 177

5.9本章小结 178

第6章建立Linux开发环境 179

6.1建立Linux开发环境 179

6.1.1 Cygwin开发环境 179

6.1.2 VMware Workstation开发环境 181

6.2交叉编译的使用 183

6.2.1 GNU交叉工具链的设置 183

6.2.2 ARM GNU常用汇编语言 186

6.2.3 GNU交叉工具链的常用工具 188

6.2.4交叉编译环境 191

6.3 Linux下的C编程 194

6.3.1 Linux程序设计特点 194

6.3.2 Linux下C语言编码的风格 195

6.3.3 Linux程序基础 195

6.3.4 Linux下C编程的库依赖 197

6.4 gcc的使用与开发 197

6.4.1 gcc简介和使用 197

6.4.2 gcc选项 198

6.4.3 gcc的错误类型 201

实例6-1:gcc编译器环境的应用实例 202

6.5 gdb调试器的介绍和使用 203

6.5.1 gdb调试器的使用 203

6.5.2在gdb中运行程序 204

6.5.3暂停和恢复程序运行 206

6.5.4远程调试 209

实例6-2:gdb调试器环境的应用实例 209

6.6 GNU make和Makefile的使用 211

6.6.1 Makefile的基本结构 212

6.6.2 Makefile的变量 213

6.6.3 Makefile的隐含规则 215

6.6.4 Makefile的命令使用 218

6.6.5 Makefile的函数使用 219

6.6.6 Makefile文件的运行 221

6.6.7 Makefile规则书写命令 223

实例6-3:Makefile的命令使用实例 229

6.7 autoconf和automake的使用 231

6.7.1 autoconf的使用 231

6.7.2 Makefile的编写 234

6.7.3 automake的使用 234

6.7.4使用automake和autoconf产生Makefile 235

6.7.5自动生成Makefile的方法 235

6.8综合实例 236

实例6-4:gcc编译器的综合实例 236

实例6-5:gdb调试器的综合实例 239

实例6-6:Makefile的综合实例 242

6.9本章小结 244

第7章 Linux操作系统移植 245

7.1移植的概念 245

7.1.1 Linux可移植性发展 246

7.1.2 Linux的移植性 246

7.2 Linux内核结构 247

7.2.1 Linux内核组成 247

7.2.2子系统相互间的关系 251

7.2.3系统数据结构 252

7.2.4 Linux内核源代码 252

7.3 Linux内核配置 256

实例7-1:Linux内核配置实例 256

7.4 Linux操作系统移植介绍 259

7.4.1 Linux系统移植的两大部分 259

7.4.2内核文件的修改 261

7.4.3系统移植所必需的环境 265

7.5综合实例 268

实例7-2:编译Linux内核应用实例 268

实例7-3:Linux内核的烧写实例 270

实例7-4:使用Kgdb构建Linux内核调试环境 271

7.6本章小结 280

第8章 Bootloader的使用 281

8.1 Bootloader概述 281

8.1.1 Bootloader的作用 282

8.1.2 Bootloader的功能 283

8.1.3 Bootloader的种类 283

8.1.4 Bootloader的工作模式 285

8.1.5 Bootloader的启动方式 285

8.1.6 Bootloader的启动流程 287

8.1.7 Bootloader与主机的通信 287

8.2 vivi 287

8.2.1 vivi的常用命令和文件结构 288

8.2.2 vivi第一阶段的分析 288

8.2.3 vivi第二阶段的分析 295

8.2.4 vivi的配置与编译 297

8.3 U-boot 298

8.3.1 U-boot常用命令和源代码目录结构 298

8.3.2 U-boot支持的主要功能 301

8.3.3 U-boot的编译和添加命令 302

8.3.4 U-boot的启动介绍 305

8.3.5 U-boot的移植和使用 307

8.3.6 U-boot的启动过程 308

8.3.7 U-boot的调试 310

8.4其他常见的Bootloader 312

8.5综合实例 313

实例8-1:vivi编译实例 314

实例8-2:U-boot在S3C2410上的移植实例 315

实例8-3:Bootloader设计实例 317

8.6本章小结 319

第9章构建Linux根文件系统 320

9.1 Linux文件系统概述 320

9.1.1 Linux文件系统的特点 320

9.1.2其他常见的嵌入式文件系统 322

9.1.3 Linux根文件目录结构 324

9.1.4 Linux文件属性介绍 324

9.2使用BusyBox生成工具集 325

9.2.1 BusyBox概述 325

9.2.2 BusyBox进程和用户程序启动过程 326

9.2.3编译/安装BusyBox 327

实例9-1:用BusyBox建立简单的根文件系统 331

9.3构建根文件系统 333

实例9-2:构建根文件系统 337

9.4配置yaffs文件 339

9.4.1 yaffs文件系统设置 340

9.4.2 yaffs文件系统测试 341

9.5综合实例 343

实例9-3:制作/使用yaffs文件系统映像文件 343

实例9-4:制作/使用jffs2文件系统映像文件 345

9.6本章小结 347

第10章设备驱动程序开发 348

10.1设备驱动程序概述 348

10.1.1驱动程序的简介 349

10.1.2设备分类 349

10.1.3设备号 350

10.1.4设备节点 350

10.1.5驱动层次结构 351

10.1.6设备驱动程序的特点 352

10.2设备驱动程序与文件系统 353

10.2.1设备驱动程序与文件系统的关系 353

10.2.2设备驱动程序与操作系统的关系 353

10.2.3 Linux设备驱动程序的接口 353

10.2.4设备驱动程序开发的基本函数 359

10.2.5 Linux驱动程序的加载 359

10.3设备驱动程序的使用 364

10.3.1驱动程序模块的加载 364

10.3.2创建设备文件 364

10.3.3使用设备 364

10.4网络设备基础知识 365

10.4.1网络协议 365

10.4.2网络设备接口基础 366

10.5网络设备驱动程序的架构 369

10.5.1网络设备驱动程序体系结构 369

10.5.2网络设备驱动程序模块分析 369

10.5.3网络设备驱动程序的实现模式 376

10.5.4网络设备驱动程序的数据结构 376

10.6综合实例 381

实例10-1:键盘驱动开发实例 381

实例10-2:I2C总线驱动的编写实例 384

实例10-3:TFT-LCD显示驱动实例 388

10.7本章小结 393

第11章嵌入式GUI开发 394

11.1嵌入式系统中的GUI简介 395

11.1.1嵌入式GUI系统的介绍 395

11.1.2基于嵌入式Linux的GUI系统底层实现基础 397

11.1.3嵌入式GUI系统的分析与比较 397

11.2嵌入式系统下MiniGUI的实现 399

11.2.1图形用户界面MiniGUI简介 399

11.2.2 MiniGUI的发布版本 401

11.2.3 MiniGUI在S3C2410处理器上的移植过程 404

11.3 Qt/Embedded嵌入式图形开发基础 407

11.3.1 Qt/Embedded开发环境的安装 407

11.3.2 Qt/Embedded底层支持及实现代码分析 411

11.3.3 Qt/Embedded信号和插槽机制 412

11.3.4 Qt/Embedded窗口部件 415

11.3.5 Qt/Embedded图形界面编程 418

11.3.6 Qt/Embedded对话框设计 419

11.3.7数据库 420

实例11-1:Qt/Embedded图形开发应用实例 423

11.4 Qtopia移植 424

11.4.1 Qtopia简介 424

11.4.2交叉编译、安装Qtopia 424

实例11-2:Qtopia移植应用实例 426

11.5 Qt/Embedded应用开发 427

11.5.1嵌入式硬件开发平台的选择 427

11.5.2 Qt/Embedded常用工具的介绍 429

11.5.3交叉编译Qt/Embedded的库 430

11.5.4 Qt/E程序的编译与执行 431

实例11-3:Qt/Embedded实战演练 432

11.6综合实例 436

实例11-4:Hello,Qt/Embedded应用程序 436

实例11-5:基本绘图应用程序的编写 439

11.7本章小结 443

第12章综合工程实例 444

12.1文件系统的生成与烧写 444

12.1.1 yaffs文件系统的制作与生成 445

12.1.2 jffs2文件系统的制作与生成 449

12.2基于Linux的数码相框 452

12.2.1系统需求分析 452

12.2.2系统总体设计 453

12.2.3软件设计实现 454

12.2.4软硬件集成 460

12.3基于Linux的MPlayer解码播放器 461

12.3.1可行性分析报告 461

12.3.2系统总体设计 462

12.3.3软件总体设计 463

12.3.4软件详细设计 467

12.3.5软硬件集成 477

12.4基于Linux的GPS导航系统的开发 478

12.4.1嵌入式开发流程图 479

12.4.2 GPS导航定位系统的系统定义 481

12.4.3 GPS导航系统的可行性分析报告 486

12.4.4 GPS导航系统需求分析 487

12.4.5 GPS导航系统总体设计实现 489

12.4.6 GPS导航系统硬件设计实现 491

12.4.7 GPS导航系统软件概括设计 495

12.4.8 GPS导航系统软件详细设计 495

12.4.9 GPS导航系统数据库的配置设计 522

12.4.10 GPS导航系统软件实现 534

12.5本章小结 538

关于linux的内存概念

1:“交换出去的代码”物理内存不够或系统需要把与用户空间建立了映射关系的物理页面的交出去。

“没有映射到内存的代码”任务还没有用到呢。

系统级别的一般常驻。

2:也不很懂,感觉“实际使用的内存数”:正在被用着,没被换出映射到内存中的页面,一个进程独享的部分。

“驻留在内存中的内存数”:还包括了该进程用到的一些lib库的共享部分。

简单概括Linux内核源码高速缓存原理(图例解析)

高速缓存(cache)概念和原理涉及在处理器附近增加一个小容量快速存储器(cache),基于SRAM,由硬件自动管理。其基本思想为将频繁访问的数据块存储在cache中,CPU首先在cache中查找想访问的数据,而不是直接访问主存,以期数据存放在cache中。

Cache的基本概念包括块(block),CPU从内存中读取数据到Cache的时候是以块(CPU Line)为单位进行的,这一块块的数据被称为CPU Line,是CPU从内存读取数据到Cache的单位。

在访问某个不在cache中的block b时,从内存中取出block b并将block b放置在cache中。放置策略决定block b将被放置在哪里,而替换策略则决定哪个block将被替换。

Cache层次结构中,Intel Core i7提供一个例子。cache包含dCache(数据缓存)和iCache(指令缓存),解决关键问题包括判断数据在cache中的位置,数据查找(Data Identification),地址映射(Address Mapping),替换策略(Placement Policy),以及保证cache与memory一致性的问题,即写入策略(Write Policy)。

主存与Cache的地址映射通过某种方法或规则将主存块定位到cache。映射方法包括直接(mapped)、全相联(fully-associated)、一对多映射等。直接映射优点是地址变换速度快,一对一映射,替换算法简单,但缺点是容易冲突,cache利用率低,命中率低。全相联映射的优点是提高命中率,缺点是硬件开销增加,相应替换算法复杂。组相联映射是一种特例,优点是提高cache利用率,缺点是替换算法复杂。

cache的容量决定了映射方式的选取。小容量cache采用组相联或全相联映射,大容量cache采用直接映射方式,查找速度快,但命中率相对较低。cache的访问速度取决于映射方式,要求高的场合采用直接映射,要求低的场合采用组相联或全相联映射。

Cache伪共享问题发生在多核心CPU中,两个不同线程同时访问和修改同一cache line中的不同变量时,会导致cache失效。解决伪共享的方法是避免数据正好位于同一cache line,或者使用特定宏定义如__cacheline_aligned_in_smp。Java并发框架Disruptor通过字节填充+继承的方式,避免伪共享,RingBuffer类中的RingBufferPad类和RingBufferFields类设计确保了cache line的连续性和稳定性,从而避免了伪共享问题。

阅读剩余
THE END