第1章 故事前传 1
1.1背景知识 1
1.1.1嵌入式网络概述 1
1.1.2写作背景 3
1.1.3几个疑问 4
1.2 TCP/IP扫盲班 5
1.2.1 OSI模型 5
1.2.2 TCP/IP协议 5
1.2.3 OSI模型VS TCP/IP模型 7
1.2.4嵌入式TCP/IP协议栈 8
1.3旅行集结号 9
1.3.1实验环境说明 9
1.3.2本书内容概述 10
1.3.3一起出发 12
第2章 有备而无患 13
2.1传说中的ARM微处理器 13
2.1.1背景知识 13
2.1.2存储器组织结构 15
2.1.3指令系统 17
2.1.4数据类型与存储格式 19
2.1.5处理器状态与处理器模式 21
2.1.6寄存器组织 23
2.1.7异常处理 28
2.2 S3C44B0X初体验 32
2.2.1简介 32
2.2.2存储管理器 34
2.2.3中断控制器 39
2.2.4其他模块 42
2.3 ARM汇编真经 46
2.3.1简介 46
2.3.2 ARM指令集编码格式 46
2.3.3 ARM寻址方式 48
2.3.4 ARM指令集简介 53
2.3.5 ARM汇编语言 55
第3章 让板子跑起来 65
3.1 ARM开发工具 65
3.1.1 ADS简介 65
3.1.2 ARM汇编器 70
3.1.3 ARM编译器 71
3.1.4 ARM连接器 78
3.2程序的调试 83
3.2.1几种调试方式 83
3.2.2 AXD调试器 87
3.2.3 ARMulator的使用 90
3.3编写启动代码 91
3.3.1开发板结构 91
3.3.2启动代码讲解 92
3.3.3几个测试程序 108
第4章 快马加鞭 115
4.1嵌入式实时操作系统 116
4.1.1概述 116
4.1.2 μC/OS-II的文件结构 118
4.1.3 μC/OS-II中的任务 120
4.1.4就绪任务的管理 126
4.1.5任务堆栈 129
4.2移植μC/OS-II实时操作系统 130
4.2.1概述 130
4.2.2编写OS_CPU.H 132
4.2.3编写OS_CPU_C.C 134
4.2.4编写OS_CPU_A.S 138
4.3测试程序 145
4.3.1系统时钟 145
4.3.2第一个测试程序 146
4.3.3第二个测试程序 147
第5章 无操作系统模拟层Lwl P的移植 150
5.1 LwIP综述 150
5.1.1简介 150
5.1.2用SI阅读源代码 156
5.2移植工作 160
5.2.1移植头文件 160
5.2.2 RTL8019AS网卡 163
5.2.3编写网卡驱动程序 176
5.3测试程序 186
5.3.1协议栈初始化 186
5.3.2数据包的查询接收 188
5.3.3数据包的中断接收 191
5.3.4一个简单的TCP服务器 193
5.3.5移植小结 195
第6章 动态内存管理 196
6.1背景知识 196
6.1.1内存管理概述 196
6.1.2常见内存分配策略 198
6.2动态内存池 200
6.2.1数据结构描述 200
6.2.2函数实现 205
6.3动态内存堆 207
6.3.1数据结构描述 208
6.3.2函数实现 209
6.4其他内存分配策略 214
第7章 数据包管理 218
7.1预备知识 218
7.1.1 LwIP的分层特点 218
7.1.2协议进程模型 219
7.2数据包管理 220
7.2.1数据包结构pbuf 221
7.2.2 pbuf的类型 221
7.2.3数据包申请函数 224
7.2.4数据包释放函数 227
7.2.5其他数据包操作函数 229
第8章 网络接口管理 230
8.1引言 230
8.2网络接口结构 231
8.2.1数据结构 231
8.2.2函数实现 234
8.3环回接口 236
8.3.1相关函数 236
8.3.2实验程序 238
第9章ARP协议 242
9.1 ARP协议简介 242
9.1.1物理地址与网络地址 242
9.1.2 ARP协议的本质 243
9.2数据结构 245
9.2.1 ARP表 245
9.2.2 ARP报文 249
9.3 ARP层数据包输入 253
9.3.1以太网数据包递交 253
9.3.2 ARP数据包处理 255
9.3.3 ARP攻击 258
9.3.4 ARP缓存表的更新 259
9.4 ARP层数据包输出 263
9.4.1 ARP层数据处理总流程 263
9.4.2广播包与多播包的发送 264
9.4.3单播包的发送 266
第10章 网际协议(IP) 269
10.1相关知识 269
10.1.1概述 269
10.1.2 IP地址 270
10.1.3特殊IP地址 271
10.1.4子网划分与子网掩码 273
10.1.5网络地址转换(NAT) 275
10.1.6单播、多播与广播 276
10.2数据报 277
10.2.1数据报组成结构 277
10.2.2数据结构 282
10.3 IP层输出 283
10.3.1发送数据报 283
10.3.2数据报分片 286
10.4 IP层输入 289
10.4.1数据报接收 290
10.4.2分片重装数据结构 294
10.4.3分片重装函数 297
10.4.4分片插入与检查 300
第11章 网际控制报文协议(ICMP) 303
11.1基本知识 303
11.1.1 ICMP协议 303
11.1.2报文交付 304
11.1.3报文类型 304
11.1.4报文格式 306
11.1.5差错报文 306
11.1.6查询报文 308
11.2 ICMP的实现 309
11.2.1数据结构 310
11.2.2发送差错报文 311
11.2.3 ICMP报文的处理 312
11.2.4 ping命令 315
11.2.5 ICMP洪水 316
第12章 用户数据报协议(UDP) 319
12.1背景知识 319
12.1.1传输层协议 319
12.1.2 UDP协议 320
12.1.3端口号 321
12.1.4 UDP报文的交付 322
12.1.5 UDP报文格式 322
12.1.6 UDP伪首部与校验和 324
12.2 UDP数据结构 325
12.2.1报文首部结构 325
12.2.2控制块 326
12.3控制块操作函数 329
12.3.1使用UDP编程 329
12.3.2新建控制块 329
12.3.3绑定控制块 329
12.3.4连接控制块 331
12.3.5其他控制块操作函数 332
12.4报文处理函数 333
12.4.1报文的发送 333
12.4.2报文接收与递交 335
12.5测试程序 338
12.5.1回送程序 338
12.5.2测试结果 339
12.5.3回调编程的缺陷 339
第13章 传输控制协议(TCP) 341
13.1协议简介 341
13.1.1 TCP的必要性 341
13.1.2 TCP的特性 342
13.1.3连接的定义 344
13.1.4数据流编号 345
13.1.5滑动窗口 345
13.2 TCP报文 346
13.2.1报文格式 346
13.2.2 TCP选项 348
13.2.3紧急数据 349
13.2.4强迫数据交互 349
13.2.5报文首部数据结构 350
13.3 TCP连接 350
13.3.1建立连接 350
13.3.2断开连接 351
13.3.3复位连接 352
13.3.4 TCP状态转换图 353
13.3.5特殊的状态转换 355
13.4 TCP控制块 356
13.4.1控制块数据结构 356
13.4.2控制块链表 358
13.4.3接收窗口 359
13.4.4发送窗口 359
13.5 TCP编程函数 360
13.5.1控制块新建 360
13.5.2控制块绑定 361
13.5.3控制块侦听 362
13.5.4控制块连接 363
13.5.5发送数据 364
13.5.6关闭连接 365
13.5.7其他函数 366
13.6 TCP输出处理 366
13.6.1报文段缓冲 366
13.6.2报文段构建 367
13.6.3报文段发送 370
13.7 TCP输入处理 372
13.7.1 TCP层函数调用流程 372
13.7.2报文输入 373
13.7.3 TIME_WAIT状态的报文处理 376
13.7.4 LISTEN状态的报文处理 376
13.7.5 SYN攻击 378
13.7.6 TCP状态机函数 379
13.7.7 TCP数据输入 382
13.8可靠的传输服务 387
13.8.1超时重传与RTT估计 387
13.8.2慢启动与拥塞避免 392
13.8.3快速重传与快速恢复 395
13.8.4糊涂窗口与避免 397
13.8.5零窗口探查 399
13.8.6保活机制 401
13.8.7 TCP定时器 403
13.9测试程序 406
13.9.1 Telnet服务器 406
13.9.2测试结果 409
第14章 移植操作系统模拟层 411
14.1移植过程 411
14.1.1移植综述 411
14.1.2添加文件 413
14.1.3修改头文件lwipopts.h 414
14.1.4头文件sys_arch.h 414
14.1.5全局变量与初始化 415
14.1.6信号量函数 416
14.1.7邮箱函数 417
14.1.8超时相关函数 420
14.1.9创建新进程 420
14.2测试程序 421
14.2.1初始化函数 421
14.2.2简单的HTTP服务器 421
14.2.3测试结果 422
第15章 用户编程接口 424
15.1定时事件 424
15.1.1定时结构 424
15.1.2定时链表 425
15.1.3内核进程 427
15.1.4处理定时事件 428
15.2消息机制 430
15.2.1消息结构 430
15.2.2数据包消息 431
15.2.3协议栈API实现 432
15.2.4 API消息 434
15.3协议栈接口 436
15.3.1用户数据缓冲netbuf 436
15.3.2数据缓冲操作 436
15.3.3连接结构netconn 439
15.3.4内核回调接口 441
15.3.5协议栈API函数 443
15.3.6测试程序 448
15.4套接字接口 450
15.4.1 socket的实现 450
15.4.2套接字函数 451
15.4.3测试程序 453
第16章 最后的战役 457
16.1域名解析 457
16.1.1域名系统(DNS) 457
16.1.2测试程序 458
16.1.3测试结果 460
16.2动态主机配置 460
16.2.1 DHCP协议 460
16.2.2测试程序 461
16.2.3测试结果 463
16.3 Internet组管理 464
16.3.1 IGMP协议 464
16.3.2测试程序 465
16.3.3测试结果 466
16.4终结篇 467
16.4.1常见问题及解决方法 467
16.4.2故事结局 473
参考文献 474