生活破破烂烂,小猫尝尝咸淡
这是一篇C++学习的笔记汇总帖,边复习边记录。
- 绝大部分是hands-on实操写代码。
- 一部分是knowledge知识&问答。
- 一点点有用的reference参考链接。
- 全部的markdown编写。
- 有的note可能有点“巨长”。
C++
C++ 学习路线和就业方向
C Basic & C With Classes
C++ 泛型 & STL 标准模板库
C++ 11 新特性 lambda表达式
C++ 11 新特性 函数封装器和绑定器
C++ 设计模式
基础算法&数据结构
算法
贪心算法
千奇百怪的排序算法
双指针
二分查找
搜索算法
回溯算法
数据结构
二叉树和搜索树
堆和优先级队列
并查集
Trie前缀树
LRU最近最少使用
数据结构与基础算法
Linux 操作系统基础
CSDN上一篇关于APUE/内核编程的优质文章
Linux 下 Bash 命令基础
Linux 下 g++ 编译基础和Makefile
Linux 下 gdb 调试
Linux 系统操作基础
Linux 信号与进程
Linux 生产消费者模型实现
Linux Socket网络编程
Linux 下 TCP/IP协议
Linux 下 select网络I/O复用模型
Linux 下 poll/epoll模型
Linux 下 MySql实操
Linux 下 Redis实操
Linux 下 Reactor 高并发服务器
基于RIS-V指令集架构的Xv6操作系统内核优化
本项目以MIT6.S081课程为向导,基于RIS-V指令集架构的xv6操作系统为基础,对其系统调用,内存管理,进程管理,中断,文件系统等模块进行优化和扩展
学习资料和环境搭建
一个比较好的学习资料
Lab0:实验配置 by CSDN 上一篇关于Ubuntu环境下搭建实验环境的文章
Lab0:实验配置 by 知乎 上一篇关于Windows环境下搭建实验环境的文章
版本控制和GDB
建议每个实验checkout到相应的分支,然后创建相应的测试分支,完成后没有问题在进行合并merge(也可以不合并)
注意: 在切换分支的时候一定要跟踪远程分支,否则Git 不知道要从哪个远程分支拉取更新,因此需要手动指定
1
2
3
4
5
6
7
8
9
10
11
12
git checkout util # 切换到util分支(不跟踪)
git checkout -b util origin/util # 切换到util分支(并跟踪)
git checkout -b util_test # 建立并切换到util的测试分支
git add .
git commit -m "完成了第一个作业"
git checkout util
git merge util_test
git push github util:util
git branch //查看分支
启动GDB调试:
1
2
3
4
5
6
7
make qemu //直接make
ctrl+a->松开->x //退出xv6系统
make qemu-gdb //带GDB调试的make
make qemu-gdb CPUS=1 //需要单核启动可以设置此参数
gdb-multiarch //在另一个窗口打开gdb进行调试
有如下结果说明进入成功
0x0000000000001000 in ?? ()
系统运行(gdb中输入continue命令):
1
2
3
4
gdb中输入c即启动,此时Xv6操作系统可以正常使用,bt有如下结果
(gdb) bt
#0 scheduler () at kernel/proc.c:465
#1 0x0000000080000f1c in main () at kernel/main.c:44
GDB常规调试:
1
2
3
4
break main //打断点
info register //查看寄存器
step //单步执行
step n //执行n步
Lab代码仓库
fork了实验原始main分支,然后完成所有main下分支的lab,每一个完成的lab都在对应的“分支名+_test”的分支中。
Lab1:Makefile、基本系统调用、多进程编程、文件描述符、IPC管道、sleep、find、pingpong、primes、xargs
总结:学习了一些操作系统接口,用系统调用编写了一些实用的用户级程序。
Lab2:系统资源抽象(CPU抽象(线程、调度器)、内存抽象(虚拟内存、分页)、存储抽象(文件系统、块设备)、I/O抽象(设备驱动)、网络抽象(socket、VPN、SDN));强隔离性(内核态用户态M/S/U);内核组织(微内核、宏内核、混合内核、客户/服务器模式);Xv6架构(模块化内核);Xv6进程管理和隔离机制(进程抽象(独立地址空间、时间片、IPC、并发)、进程状态(运行、就绪、阻塞、等待、退出)、进程信息(页表、内核、寄存器状态));trace、sysinfo
总结:学习了操作系统架构和进程,学习了系统调用是怎么进入的 (usys.pl脚本使用entry函数自动生成汇编(交叉编译?),譬如fork会通过entry中的li a7, SYS_fork语句把 SYS_fork(即 fork 的系统调用号)加载到 a7 寄存器) (user.h暴露系统调用的接口,usy.pl将系统调用变成汇编并转到特定寄存器),向xv6添加了一些新的系统调用,扩展了Xv6操作系统。
Lab3:内存映射(虚拟地址、物理地址、页内偏移、分页硬件);内存管理MMU(进程页表、用户地址空间、内核地址空间、进程地址空间的独立性);sbrk、exec;