总结备忘

Dear:
"文件传输助手"和"童梦(Kevin Luo)"的聊天记录如下:
————— 2020-5-26 —————
童梦(Kevin Luo) 下午2:40
锁是针对内存资源的 关中断与关抢占是针对单cpu的

童梦(Kevin Luo) 下午10:51
链表删除操作必须找到前驱节点 如果是单链表 只能遍历去找 效率低

————— 2020-5-28 —————
童梦(Kevin Luo) 下午4:52
临界区要串行执行 可以通过原子操作或者锁来保证 为了尽快执行完 可以关中断

————— 2020-5-30 —————
童梦(Kevin Luo) 上午9:24
vmalloc和高端内存没有必然联系 只是优先使用高端物理内存

————— 2020-5-31 —————
童梦(Kevin Luo) 上午9:38
申请一块内存 实例化一个结构体 填充结构体数据

童梦(Kevin Luo) 上午9:39
内存池是前两步先做好

————— 2020-6-7 —————
童梦(Kevin Luo) 下午11:29
位置无关码 可以使文件系统的页直接映射到任意地址重定位后都可运行 代码页共享 数据页写时复制 执行到才重定位 可以推迟写 省内存

————— 2020-6-9 —————
童梦(Kevin Luo) 下午5:17
并发对应线程 并行对应cpu

童梦(Kevin Luo) 下午10:34
Linux是以进程为调度单位的,调度器只看到进程内核栈,而看不到中断栈。在独立中断栈的模式下,如果linux内核在中断路径内发生了调度(从技术上讲,睡眠和调度是一个意思),那么linux将无法找到“回家的路”,未执行完的中断处理代码将再也无法获得执行机会。

童梦(Kevin Luo) 下午10:42
逻辑上说中断很急迫 尽快处理 不能睡眠

童梦(Kevin Luo) 下午10:44
技术上如果中断使用独立中断栈 切换出去就换不回来

————— 2020-6-10 —————
童梦(Kevin Luo) 上午11:53
自旋锁不能睡眠:

A获得锁睡眠,B在等锁怎么办,可能会等很久哦,B就一直自旋等着,光等着不干活。获得锁,本来就是要操作一些共享资源,所以赶快的,别墨迹,还睡个球。

禁止中断不能睡眠:

禁止中断就是希望不被打扰,赶紧干完自己该做的事,还睡觉,我靠,还想不想干了。当硬件中断来的时候,这种情况不能睡眠,想想也对,你来强行打断人家,还想带着人家去睡,怎么可以,中断上下文不应该睡眠,只有进程上下文可以睡,技术当然可以实现,但没有意义。
spinlock的初衷是关调度,别人别和我抢这个临界区,同时也不让其他核抢。

关中断时不能睡眠,因为睡眠依赖调度器,调度器通过时钟中断判断何时唤醒任务。

————— 2020-6-11 —————
童梦(Kevin Luo) 下午10:12
线程池 异步解藕

————— 2020-6-12 —————
童梦(Kevin Luo) 上午10:19
同一指令完成设新值取旧值 之后通过判断旧值 决定是否进入

童梦(Kevin Luo) 下午5:31
异步的本质是不确定性

童梦(Kevin Luo) 下午5:33
中断 异常 信号 都是异步 所以不能主动调用 只能注册回调

————— 2020-6-17 —————
童梦(Kevin Luo) 下午12:42
Open 开始多态

————— 2020-6-18 —————
童梦(Kevin Luo) 上午1:41
驱动+设备 本质是提供IO 设备可以模拟 也可以半虚拟化

童梦(Kevin Luo) 上午1:46
设备可以抽象成一堆存储 都可用内存来模拟

童梦(Kevin Luo) 上午8:42
不可抢占 说明一气呵成 执行完为止

童梦(Kevin Luo) 上午9:48
块设备驱动完成读写块的功能 文件系统完成提供读写哪一块的信息 彼此合作 为用户提供文件视图

————— 2020-6-26 —————
童梦(Kevin Luo) 上午9:19
线程是直线 进内核相当于打个圈 从哪进了回到哪

————— 2020-6-28 —————
童梦(Kevin Luo) 下午12:30
驱动的本质是获得io 可以从外设 内存

童梦(Kevin Luo) 下午3:20
线程睡醒时是可以被唤醒处理异步事件的

童梦(Kevin Luo) 下午4:00
执行流 包括 硬中断 软中断 用户线程 内核线程 没有代码执行了 这个流就结束了 执行流是可以被打断的 也可以进入等待或睡眠

————— 2020-6-30 —————
童梦(Kevin Luo) 上午10:40
队头阻塞 连接高延时 移动设备连接ID标识

童梦(Kevin Luo) 上午11:19
流量控制与拥塞控制叠加 决定了发送行为

童梦(Kevin Luo) 下午12:31
多线程带来并发 多cpu带来并行 这带来了代码重入 数据重入问题 要引进锁与信号量解决

童梦(Kevin Luo) 下午1:03
asmlinkage 汇编形式调用 栈来传递参数

————— 2020-7-2 —————
童梦(Kevin Luo) 下午2:08
内核安全监控系统

童梦(Kevin Luo) 下午2:13
动态注入系统调用挂钩函数 产生日志 驱动或者添加系统调用获取日志信息 并持久化作实时分析

童梦(Kevin Luo) 下午4:04
约定 获得锁才能进临界区 进了临界区就不被打断 一气呵成执行完 然后释放锁

童梦(Kevin Luo) 下午4:11
临界区要求只能串行执行 对单cpu来说 进入临界区只要关中断 关抢占 就可以 对多cpu来说 还要加一把锁

童梦(Kevin Luo) 下午4:20
CPU 提供这么一条指令 本身原子操作 可以把旧值拿到同时把新值设进去 如新旧不一样 说明成功加锁 往下执行 值一样 说明失败 自旋或睡眠

童梦(Kevin Luo) 下午5:45
高精度时钟可以准确到纳秒级 并非每隔一纳秒来一个中断 所以使红黑树来实现

————— 2020-7-4 —————
童梦(Kevin Luo) 下午5:21
一开始上来一个spinlock保证可用;
接着分析读写对称程度用rwlock替换spinlock;
然后将rwlock分拆成读和写两侧面;
读侧用RCU替换rwlock;
写侧用spinlock保护,并用RCU API进行实际写操作;
进一步差分细化spinlock的粒度,比如per cpu化。

————— 2020-7-5 —————
童梦(Kevin Luo) 下午8:14
1 更新重传队列。
2 更新发送窗口。
3 从sack的信息或者重复ack来决定是否进入拥塞模式。

————— 2020-7-6 —————
童梦(Kevin Luo) 下午8:16
缺页异常 一种是本来就没分配 那就分配 另一种是已经有物理页 那就是写时复制

————— 2020-7-7 —————
童梦(Kevin Luo) 上午11:58
取址&加* 取值

童梦(Kevin Luo) 下午1:07
宏 inline 增加代码量 但省去了函数调用开销

创建进程先准备好内核态的结构体 然后execv调用加载进程代码 准备用户空间的运行 后续动态链接由用户空间完成 最后main函数入口

童梦(Kevin Luo) 上午1:35
反调试 防注入 防hook

童梦(Kevin Luo) 下午6:43
要访问零地址 很简单 把页表项构建好 物理页挂上去 权限设置好 就可以访问

童梦(Kevin Luo) 下午6:44
虚拟地址提供各表偏移索引 去查表 最后得到物理地址

童梦(Kevin Luo) 下午7:11
Page归宿 伙伴系统 slab系统 用户进程空间 文件系统 mmap时 进程与文件

Inline hook 的时候 最好是jmp过去再jmp回来 这样不会改变原函数栈 jmp出去时先保存一下现场 jmp回来再恢复 对称操作 栈是平衡的 中间的代码可以call

中断总的流程是收到中断信号 就查idt表 找到入口 执行 返回 中断信号从哪来 这很关键 一种是cpu在进程中执行了某些int x指令 这是故意的 如系统调用 一种是执行指令过程中产生异常 如除零缺页等 这些都是来自cpu内部 还有一种来自外部的中断 是可以抢占前者 也可以被设置屏蔽 为减小复杂度 外部硬件中断 在处理中断上半部时都关中断关抢占 这样可以避免中断嵌套

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值