随笔分类 -  操作系统原理

摘要:1、去年逆向x音15.5.0版本时,可以直接用fiddler抓包。后来貌似升级到17版本时fiddler就抓不到包了,看雪有大佬破解了x音防抓包的功能,原理并不复杂:boringssl源码中有个SSL_CTX_set_custom_verify函数,定义如下: void SSL_CTX_set_cu 阅读全文
posted @ 2022-03-25 16:08 第七子007 阅读(4392) 评论(1) 推荐(1) 编辑
摘要:dpdk是intel主导开发的网络编程框架, 有这么多的优点,都是怎么实现的了? 1、UIO原理:dpdk绕过了操作系统内核,直接接管网卡,用户程序可以直接在3环读写网卡的数据,这就涉及到两个关键技术点了: 地址映射:3环的程序是怎么定位到网卡数据存放在哪的了? 拦截硬件中断:传统数据处理流程是网卡 阅读全文
posted @ 2022-03-24 11:21 第七子007 阅读(2981) 评论(1) 推荐(1) 编辑
摘要:1、操作系统、计算机网络诞生已经几十年了,部分功能不再能满足现在的业务需求。如果对操作系统做更改,成本非常高,所以部分问题是在应用层想办法解决的,比如前面介绍的协程、quic等,都是在应用层重新开发的框架,简单回顾如下: 协程:server多线程通信时,如果每连接一个客户端就要生成一个线程去处理,对 阅读全文
posted @ 2022-03-21 21:52 第七子007 阅读(1865) 评论(0) 推荐(1) 编辑
摘要:quic协议最早是google提出来的,所以狗家的源码肯定是最“正宗”的!google把quic协议的源码放在了chromium里面,所以要看quic的源码原则上需要下载chromium源码!但是这份源码体积很大,并且还需要FQ,所以多年前就有好心人把quic源码剥离出来单独放github了,在文章 阅读全文
posted @ 2022-03-16 21:47 第七子007 阅读(2387) 评论(0) 推荐(1) 编辑
摘要:1、网络通信时,为了确保数据不丢包,早在几十年前就发明了tcp协议!然而此一时非彼一时,随着技术进步和业务需求增多,tcp也暴露了部分比较明显的缺陷,比如: 建立连接的3次握手延迟大; TLS需要至少需要2个RTT,延迟也大 协议缺陷可能导致syn反射类的DDOS攻击 tcp协议紧耦合到了操作系统, 阅读全文
posted @ 2022-03-13 21:34 第七子007 阅读(2257) 评论(0) 推荐(1) 编辑
摘要:1、为了在进程间通信,linux推出了信号量、共享内存、消息队列、管道、信号等IPC的方式;为了提高IPC效率,android又进一步优化共享内存,推处了binder机制(本质就是把不同进程的虚拟内存映射到同一块物理内存)。进程间通信的问题解决了,线程间也需要通信,android是怎么解决的了?回顾 阅读全文
posted @ 2022-03-09 21:26 第七子007 阅读(250) 评论(0) 推荐(0) 编辑
摘要:1、协程只是一种思路,并且没有操作系统层面的参与,所以全靠3环的应用开发人员自己实现。市面上有各种协程框架,这里以微信的libco库为例,看看协程到底是怎么落地实现的!libco 是微信后台开发和使用的协程库,号称可以调度千万级协程;从使用上来说,libco 不仅提供了一套类 pthread 的协程 阅读全文
posted @ 2022-03-06 21:34 第七子007 阅读(757) 评论(0) 推荐(0) 编辑
摘要:1、协程原理阐述 (1)为了提升数据处理的效率,用户的应用程序通常采用多线程的形式,典型的就是生产者-消费者模型:生产者往共享内存块写数据,消费者从共享内存块读数据后处理!这种经典的模型具体落地实现时有两点需要特别注意: 多线程之间的互斥/同步:一般情况下共享内存块同时只能有1个线程写,写线程之间必 阅读全文
posted @ 2022-03-03 12:25 第七子007 阅读(701) 评论(0) 推荐(0) 编辑
摘要:1、linux提供了好几种IPC的机制:共享内存、管道、消息队列、信号量等,所有IPC机制的核心或本质就是在内核开辟一块空间,通信双方都从这块空间读写数据,整个流程图示如下: 这种通信方式天生的缺陷看出来了么? A进程把数据拷贝到内核,B进程从内核再拷贝走,同一份数据可能在内存存放了3份,同时还复制 阅读全文
posted @ 2022-02-25 11:08 第七子007 阅读(1307) 评论(0) 推荐(0) 编辑
摘要:众所周知,linux的理念是万物皆文件,自然少不了对文件的各种操作,常见的诸如open、read、write等,都是大家耳熟能详的操作。除了这些常规操作外,还有一个不常规的操作:mmap,其在file_operations结构体中的定义如下: 这个函数的作用是什么了? 1、对于读写文件,传统经典的a 阅读全文
posted @ 2022-02-23 16:47 第七子007 阅读(6516) 评论(2) 推荐(2) 编辑
摘要:为了确保进程数据的安全,cpu在硬件级别就支持不同进程的内存隔离了,采用的手段分别是:LDT和分页;每个进程都有自己的ldt描述符,严格规定了该进程使用的物理内存!同时还有分页机制,不同进程就算是同样的虚拟地址,也会映射到不同的物理地址!这两项措施严格保证了进程之间的物理内存是严格隔离的,互相无法读 阅读全文
posted @ 2022-02-20 21:25 第七子007 阅读(701) 评论(0) 推荐(0) 编辑
摘要:1、从网络问世直到10来年前,tcp拥塞控制采用的都是经典的reno、new-reno、bic、cubic等经典的算法,这些算法在低带宽的有线网络下运行了几十年。随着网络带宽增加、无线网络通信的普及,这些经典算法逐渐开始不适应新环境了: 手机、wifi等的无线通信在空口段由于信道竞争等原因导致数据包 阅读全文
posted @ 2022-02-12 21:44 第七子007 阅读(2045) 评论(0) 推荐(0) 编辑
摘要:网络拥塞的概念大家一定不陌生,肯定都有亲生体会:比如节假日的高速路堵车。本来车流量已经很大了,如果再不限制高速口的车进入,整条路只会越来越堵,所以交管部门可能会临时限流,只允许车辆下高速,不允许上高速!互联网刚发明的那会还没有拥塞的概念,各个节点死命地传输数据,导致网络中各种路由设备的buff瞬间被 阅读全文
posted @ 2022-02-09 19:50 第七子007 阅读(1768) 评论(0) 推荐(0) 编辑
摘要:前面介绍了用来管理存放网络数据包的sk_buff,以及描述通信协议的socket和sock结构体,现在终于轮到怎么和远程的计算机通信了!从常识上讲,通信之前必须要建立连接,比如有线的键盘给电脑发送信号,需要先让键盘通过usb接口连接到电脑,否则电脑怎么接受键盘的电信号了?同理:我要想使用鼠标,比如先 阅读全文
posted @ 2022-02-04 17:38 第七子007 阅读(932) 评论(0) 推荐(0) 编辑
摘要:linux下的网络编程离不开socket,中文被翻译为套接字。任何网络通信都必须先建立socket,再通过socket给对方收发数据!数据接受的demo代码如下: #include <string.h> #include <sys/socket.h> #include <sys/types.h> # 阅读全文
posted @ 2022-02-02 20:53 第七子007 阅读(1931) 评论(0) 推荐(0) 编辑
摘要:1、时至今日,已经找不到单机设备了,所有的IT硬件设备都会联网和其他的IT设备通信。设备之间传递数据总要遵守特定的协议规范吧,避免出现“鸡同鸭讲”的尴尬局面,这个就是至今世界范围内最流行的tcp/ip协议! 为了简化,又被分成了5层,各种体系的对应关系如下图: 看网络原理解析的各种技术文章时,经常会 阅读全文
posted @ 2022-02-01 13:05 第七子007 阅读(2601) 评论(0) 推荐(0) 编辑
摘要:定时器都知道吧?个人认为是linux最核心的功能之一了!比如线程sleep(5000),5s后再唤醒执行,cpu是怎么知道5s的时间到了?还有nginx这种反向代理每隔一段时间都要检测客户端的是否还在,如果掉线了就没必要再分配资源维护连接关系啦。那么间隔固定时间检测心跳的定时机制是怎么实现的了? 1 阅读全文
posted @ 2022-01-28 19:42 第七子007 阅读(1510) 评论(0) 推荐(0) 编辑
摘要:1、简单介绍一下epoll的出现的背景:这里以java代码为例,最原始的server代码如下: while(true){ ServerSocket ss = new ServerSocket(8888); System.out.println("启动服务器...."); Socket s = ss. 阅读全文
posted @ 2022-01-21 21:57 第七子007 阅读(2195) 评论(0) 推荐(0) 编辑
摘要:1、linux内核中利用红黑树增删改查快速、稳定的特性来管理的还有另一个非常重要的功能:虚拟内存管理!前面介绍了buddy和slab算法是用来管理物理页面的。由于早期物理页面远比虚拟页面小很多,而且只需要分配和回收合并,所以也没用树形结构来组织,简单粗暴地用链表来管理!但是虚拟内存不一样了:以32位 阅读全文
posted @ 2022-01-19 20:19 第七子007 阅读(1993) 评论(0) 推荐(0) 编辑
摘要:1、在现代的操作系统中,进程调度是最核心的功能之一;linux 0.11的调度算法简单粗暴:遍历task_struct数组,找到时间片counter最大的进程执行;显然这种策略已经不适合越来越复杂的业务场景需求了,所以后来逐步增加了多种调度策略,目前最广为人知的调度策略有5种:cfs、idle、de 阅读全文
posted @ 2022-01-15 21:29 第七子007 阅读(1560) 评论(1) 推荐(0) 编辑

点击右上角即可分享
微信分享提示