十三:关于http的补充
1.HHTP/HTTPS
HTTP 是在 TCP/UDP 之上、用于浏览器与服务器交换明文请求/响应的应用层协议;HTTPS 是在 HTTP 之上加了 TLS(加密+认证+完整性)------端到端加密的"HTTP over TLS"。
HTTP 默认端口80 HTTPS 默认端口443
2. HTTP交互
本质上就是三次握手,四次挥手
3.http的格式

4.TCP四层对应内容
链路层(Link / Data Link) --- 负责帧的局域网传输(Ethernet, Wi-Fi 等),包含 MAC(网卡)。
网际层(Internet / Network) --- IP(IPv4/IPv6)、路由、ICMP(ping)、ARP(ARP 实现于链路与网际之间)。
传输层(Transport) --- TCP / UDP:端口、分段、重传、流控、可靠性等。
应用层(Application) --- HTTP、DNS、SSH 等协议,使用端口与传输层协作
MAC = 网卡匹配(局域网设备识别)
IP = 主机匹配(全网主机寻址)
端口 = 进程匹配(同一主机上的应用区分)
MAC → IP → Port
5.两道笔试题
c
若某主机的IP地址及网络前缀为192.168.5.121/29,则该主机所在子网地址为_____
IP 地址:192.168.5.121
网络前缀:/29
第一步:确定子网掩码
/29 表示 前 29 位是网络位。
二进制子网掩码:
11111111.11111111.11111111.11111000
换算成十进制:
255.255.255.248
第二步:确定子网大小
子网掩码 /29 → 主机位 = 32 - 29 = 3 位
可用 IP 数量 = 2³ - 2 = 6 个
子网块大小 = 2³ = 8
所以每个子网的范围是 以 8 为步长 递增。
第三步:找出子网地址
看 IP 的最后一段(121):
子网范围:0--7, 8--15, 16--23, ..., 120--127
121 落在 120--127 这个范围
所以 子网地址 = 192.168.5.120
c
在Internet中,使用_____协议可以检查目标主机是否可达,常用的命令_____
ICMP(Internet Control Message Protocol,互联网控制报文协议)。
常用的命令是 ping。
十四:关于项目中的补充
1. lvgl/fb
gui-guider
(免费开源) 可以和lvgl
库绑定
framebuffer是一种通用的框架
open() ; /dev/fb0
通过ioctl来控制 取的就是分辨率240*320 和16bit(565)
然后通过内存映射(mem) 返回值是一个指针 指向显示的地址
2.线程邮箱
多线程并发模型处理----线程邮箱----线程间如何交互
在其中队列起着缓冲作用
线程交互(send/recv) 其中有着便利链表的功能,根据名字来入队/出队(也传tid),从而数据共享
c
IPC = Inter-Process Communication
就是 进程之间交换数据、共享信息的一类机制。
c
话术:
"线程之间没有像进程那样的 IPC,因为它们共享同一个地址空间,所以通信一般就是读写共享内存。但为了避免竞争条件,需要用 同步机制,比如互斥锁、条件变量、信号量。另外我在项目里用过 线程邮箱(消息队列),这种方式可以把线程间通信抽象化,代码更清晰。"
3.mqtt
mqtt/http
都是应用层协议
mqtt的格式 固定头(各种动作,eg:心跳包)
可变头:
payload:
端口号:1883
mqtts(加密后):8883
十五:linux设备驱动相关补充
1.内核 版本
c
uname -r
5.4.0-150-generic
2.U-Boot版本
c
上电串口调试
U-Boot 2012.04.01 (Feb 19 2019 - 18:35:11)
3.linux启动流程
1.Bootloader (U-Boot)
- 初始化硬件(时钟、DDR、串口、网口等)
- 下载/引导内核到内存
- 传递内核启动参数
2.Linux 内核
- 解压内核映像(zImage/uImage)
- 硬件驱动初始化(CPU、内存、总线、外设)
- 挂载根文件系统
- 启动第一个用户态进程(通常是
/sbin/init
)
3.根文件系统 & 用户空间
init
进程启动,解析/etc/inittab
- 运行系统服务、启动脚本,进入 Shell 或应用
4.U-Boot常用命令
c
printenv:显示环境变量
setenv var value:设置环境变量
saveenv:保存环境变量到 Flash
bootm addr:启动内核(uImage)
bootz addr:启动 zImage
tftpboot addr filename:通过 TFTP 下载文件到内存
help:查看命令帮助
5.内核启动参数
c
U-Boot 2012.04.01 (Feb 19 2019 - 18:35:11)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB //内存--SDRAM
WARNING: Caches not enabled
Flash: 0 KB
NAND: 256 MiB //NAND Flash
In: serial
Out: serial
Err: serial
Net: dm9000
Warning: dm9000 MAC addresses don't match:
Address in SROM is ff:ff:ff:ff:ff:ff
Address in environment is 00:0c:29:4d:e4:f4
Hit any key to stop autoboot: 0
6.内核编译原理及步骤
c
Kconfig:定义功能选项(菜单)
Makefile:根据配置决定编译哪些源码
.config:用户配置结果(保存的选项)
make menuconfig:图形化配置工具,修改 .config
------------------------------------------------------------------------
1.make menuconfig //配置内核
2.make uImage //编译内核映像--------生成 U-Boot 可识别的格式
3.编译模块 //make modules
4.静态/动态 tftp /nfs uImage/.ko
7.驱动的分类/设备号的组成/设备节点
驱动分类
字符设备驱动:没有缓存机制(或较弱),一次读写就直接触发设备访问
块设备驱动
网络设备驱动:没有对应的 /dev 设备节点,而是通过 套接字 socket 访问
设备节点
本质上是 用户态到内核态驱动的入口。
8.内核定时器的使用
c
static struct timer_list my_timer; //定义定时器结构体
void my_timer_callback(struct timer_list *t)
{
printk(KERN_INFO "my_timer_callback called (%ld).\n", jiffies);
// 如果要周期执行,可以再次启动
mod_timer(&my_timer, jiffies + msecs_to_jiffies(1000));
}
// 初始化并设置回调
timer_setup(&my_timer, my_timer_callback, 0);
mod_timer(&my_timer, jiffies + msecs_to_jiffies(1000)); //启动定时器 // 设置 1 秒后超时
del_timer(&my_timer); //删除定时器
9.设备树的补充
1.后缀名
c
.dts(Device Tree Source)
设备树源码文件,描述某一块具体的开发板(Board)。
比如 imx6ull-14x14-evk.dts。
.dtb(Device Tree Blob)
编译后的二进制文件,由 dts/dtsi 转换而来。
U-Boot 启动内核时,把 dtb 传给内核。
内核解析 dtb,根据里面的描述注册和初始化外设。
c
面试回答:
设备树(Device Tree)是 Linux 内核用来描述硬件的机制。源码是 .dts,公共部分放在 .dtsi,编译后生成 .dtb(二进制 blob)。U-Boot 把 .dtb 传给内核,内核解析后根据 compatible 匹配驱动,完成外设初始化。这样硬件信息和内核解耦,方便移植和维护