浏览文章

Posts

87 项

音视频基础- 编解码 码控

why rate control Rate control is a crucial step in determining that tradeoff between size and quality. Rate Control Modes CQP(Constant QP) 恒定QP,所有编码图像区域,编码帧,编码片 …

继续阅读

音视频基础- 直播业务

直播业务 直播的业务一般包括:推流,拉流/播放,回源,录制,时移,转码。 推流 直播推流是指通过推流协议,把音视频数据推送到CDN的服务器。 推流协议主要是RTMP,也可以使用WebRTC。 推流端需要把音视频数据封装成FLV格式或者RTP格式的数据。 推流端需要选择最近的一个节点推送数据。 拉流/播放 拉流:服务器之 …

继续阅读

音视频基础- 流媒体协议

流媒体协议 HLS HLS 全称是 HTTP Live Streaming,是一个由 Apple 公司提出的基于 HTTP 的媒体流传输协议,用于实时音视频流的传输。目前HLS协议被广泛的应用于视频点播和直播领域。 HLS协议将整条流切割成一个小的能够经过HTTP下载的媒体文件,而后提供一个配套的媒体列表文件M3U8。 …

继续阅读

webrtc 03 - 常见webrtc流媒体服务器的设计

流行的 webrtc 流媒体服务器 licode janus mesooze mediasoup 整体设计 优缺点 完全支持 WebRTC,文档和教程有限,性能可能表现不佳 高度灵活插件和扩展,支持多种通信模式,依赖特定版本的外部库或系统,升级和维护时可能会遇到兼容性问题 高性能、支持webrtc,可扩展性强,文档和教 …

继续阅读

webrtc 02 - NAT网络和P2P打洞

NAT 原理 NAT(网络地址转换)主要用于在本地网络和外部网络之间转换IP地址。它在改善IP地址利用率和网络安全方面起到了重要作用。NAT有几种主要类型,每种类型在处理网络流量和安全方面都有不同的特点。以下是详细介绍: 1. 全锥形NAT(Full Cone NAT) 特点: 所有外部主机都可以通过相同的外部IP地 …

继续阅读

webrtc-01 视频采集和录制

整体架构 https://webrtc.github.io/webrtc-org/architecture/ 整体设计图 示例 进行视频采集 解释放代码注释中, html5 和 webrtc 标准互通 确实让音视频的生态、开发者的处境变得更好,很好的思路,接触音视频有点晚少了很多有意思的尝试。 <body> …

继续阅读

音视频基础- rtmp协议

RTMP 推流 拉流 消息格式 FLV 协议

继续阅读

音视频基础- 直播系统

直播系统简述

继续阅读

音视频基础- H264码流结构

H264码流结构 案例 SPS & PPS

继续阅读

音视频基础- H264视频编码

有损压缩 帧内压缩 帧间压缩 案例 无损压缩

继续阅读

音视频基础-视频基础-01

继续阅读

音视频基础-音频基础-04

音频重采样

继续阅读

音视频基础-音频基础-03

音频编码基本原理 (1) 音频信号的冗余信息 数字音频信号如果不加压缩地直接进行传送,将会占用极大的带宽。例如,一套双声道数字音频若取样频率为44.1KHz,每样值按16bit量化,则其码率为: 2*44.1kHz*16bit=1.411Mbit/s 如此大的带宽将给信号的传输和处理都带来许多困难,因此必须采取音频压缩 …

继续阅读

音视频基础-音频基础-02

怎样对声音进行数字化? 对声音进行数字化,首先要使用特定的设备对声音进行采集,比如麦克风就是常见的声音采集设备。麦克风里面有一层碳膜,非常薄而且十分敏感。声音是一种纵波,会压缩空气也会压缩这层碳膜,碳膜在受到挤压时也会发出振动,在碳膜的下方就是一个电极,碳膜在振动的时候会接触电极,接触时间的长短和频率与声波的振动幅度和 …

继续阅读

音视频基础-音频基础-01

本文基本逻辑:声音的定义是什么 → 声音有哪些特征 → 怎样对声音进行数学描述 → 怎样对声音进行数字化 → 数字音频数据是什么 『声音』是我们司空见惯再熟悉不过的一种物理现象。我们唱歌发出声音,用耳朵听到声音,用手机记录并分享声音;如果作为音视频开发人员,我们还会在工作中处理众多声音数据。但是,你真的了解『声音』吗 …

继续阅读

FFMPEG常用命令

FFMPEG常用命令 FFMPEG是特别强大的专门用于处理音视频的开源库。你既可以使用它的API对音视频进行处理,也可以使用它提供的工具,如 ffmpeg, ffplay, ffprobe,来编辑你的音视频文件。 本文将简要介绍一下 FFMPEG 库的基本目录结构及其功能,然后详细介绍一下我们在日常工作中,如何使用 …

继续阅读

数字货币交易撮合引擎demo

注:本文是普及金融市场交易的基础知识,不是为了鼓励大家去炒股炒币。相反,通过学习证券知识,理解衍生品原理,可以更好地认识市场风险,自觉放弃杠杆赌博暴富等不切实际的幻想,避免落入各种理财、带单、空气币等诈骗套路。本文一切内容均不构成任何投资意见或建议。 在证券交易系统中,撮合引擎是实现买卖盘成交的关键组件。本文我们将分析 …

继续阅读

可变基数树技术分享

可变基数树分享 使用可变基数树优化交易订单簿以及使用SIMD硬件加速查找 主要参考论文: https://db.in.tum.de/~leis/papers/ART.pdf 背景 内存变得容量更大更便宜,整个数据库/存储引擎可以放到内存 传统的内存数据索引一般是平衡二叉树 在现代的硬件上效率不高 另一类索引结构 …

继续阅读

我的程序员生涯_雷军

有的人学习编程技术,是把高级程序员做为追求的目标,甚至是终身的奋斗目标。后来参与了真正的商品化软件开发后,反而困惑了,茫然了。 一个人只要有韧性和灵性,有机会接触并学习电脑的编程技术,就会成为一个不错的程序员。刚开始写程序,这时候学得多的人写的好,到了后来,大家都上了一个层次,谁写的好只取决于这个人是否细心、有韧性、 …

继续阅读

Go语言 goroutine调度

G、P、M 是 Go 调度器的三个核心组件,各司其职。在它们精密地配合下,Go 调度器得以高效运转,这也是 Go 天然支持高并发的内在动力。今天这篇文章我们来深入理解 GPM 模型。 先看 G,取 goroutine 的首字母,主要保存 goroutine 的一些状态信息以及 CPU 的一些寄存器的值,例如 IP 寄存 …

继续阅读

Go语言 goroutine VS thread

goroutine,绕不开的一个话题是:它和 thread 有什么区别? 参考资料【How Goroutines Work】告诉我们可以从三个角度区别:内存消耗、创建与销毀、切换。 内存占用 创建一个 goroutine 的栈内存消耗为 2 KB,实际运行过程中,如果栈空间不够用,会自动进行扩容。创建一个 thread …

继续阅读

Go语言 - 从 channel 接收数据

源码分析 我们先来看一下接收相关的源码。在清楚了接收的具体过程之后,再根据一个实际的例子来具体研究。 接收操作有两种写法,一种带 “ok”,反应 channel 是否关闭;一种不带 “ok”,这种写法,当接收到相应类型的零值时无法知道是真实的发送者发送过来的值,还是 channel 被关闭后,返回给接收者的默认类型的零 …

继续阅读

Go语言 - 向 channel 发送数据

源码分析 发送操作最终转化为 chansend 函数,直接上源码,同样大部分都注释了,可以看懂主流程: // 位于 src/runtime/chan.go func chansend(c *hchan, ep unsafe.Pointer, block bool, callerpc uintptr) bool { // …

继续阅读

Go语言 channel底层结构

数据结构 底层数据结构需要看源码,版本为 go 1.9.2: type hchan struct { // chan 里元素数量 qcount uint // chan 底层循环数组的长度 dataqsiz uint // 指向底层循环数组的指针 // 只针对有缓冲的 channel buf …

继续阅读

C++内存问题排错小工具

在 C++ 开发中,使用 -fsanitize=address 编译器标志启用了 AddressSanitizer,这是一个功能强大的内存错误检测工具,用于检测各种内存相关的错误,包括但不限于内存泄漏、越界访问和使用后释放。这个工具是为了帮助开发者在开发阶段发现潜在的错误,以增强程序的稳定性和安全性。 …

继续阅读

数字货币交易系统设计与开发

注:本文是普及金融市场交易的基础知识,不是为了鼓励大家去炒股炒币。相反,通过学习证券知识,理解衍生品原理,可以更好地认识市场风险,自觉放弃杠杆赌博暴富等不切实际的幻想,避免落入各种理财、带单、空气币等诈骗套路。本文一切内容均不构成任何投资意见或建议。 期货合约 合约交易,通常指期货合约。现货合约我们以后再讨论。这里我们 …

继续阅读

C++程序内存泄露工具

在使用 gperftools 的 heap profiler 分析 C++ 程序的内存使用情况时,您可以生成多个内存分配描述文件(heap profiles),这些文件记录了程序在特定时间点的内存分配状态。通过对比这些描述文件(即进行 “diff” 操作),可以发现在两个时间点之间的内存分配差异。 具体来说,pprof …

继续阅读

基于protobuf 的 rpc

基于protobuf 的 rpc protobuf 实现了序列化部分,预留了 RPC 接口,但是没有实现网络交互的部分。 基于pb里面的 service 接口,自己实现实际的通信过程,实现一个简易的 rpc是比较容易的, 对我们阅读 brpc、muduo、grpc等著名开源的rpc有很大帮助。 google的 文档这里 …

继续阅读

汇率、资产与货币

汇率跟什么有因素关系 1. 经济增速跟汇率相关吗? 顺周期货币:经济增速与汇率正相关的国家,外围地区国家:出售原材料的发展中国家 逆周期货币:经济增速与汇率负相关的国家,中心地区国家:日元、瑞士法郎、美元 人民币:从前是顺周期,过去20年表现为无周期,现在表现为逆周期 关于顺周期与逆周期: 在经济形势好的时候,利差交易 …

继续阅读

用strip和objcopy精简二进制

问题: 设置到 LD_PRELOAD的动态库 找不到符号 在设置了优先加载的 动态库以后,先加载的库里面的函数与 后加载的库里面的函数可能是有冲突的,比如遇到的这个例子,先加在的动态库中其实不存在完整的函数实现,只有符号表,并不能执行,但是它被设置成先加载了。 对于有多个动态库中存在同一个符号的,一定程度上,我们可以从 …

继续阅读

渴望明天

渴望明天 2021年高考,看到个图,挺好玩的,作为标题吧 哈哈哈 TCP 三次握手主要做什么 同步 初始序列号 同步 MSS 四次挥手一定是四次吗? 很容易抓到 三次挥手的包 MSS & MTU 尽可能避免IP的分片 网络通信,尽一切可能避免IP的分片!为什么?因为负责IP分片的那台主机、路由器会花费很多CPU …

继续阅读

tcpdump note

tcpdump -i eth0 -v -nn -X -v 'port 80' -c 5 -w cap.tcpdump 选项 i, interface 指定监听哪个网卡 nn, 如遇到21这类的端口号,显示21而不是 ftp X, 显示16进制和 ASCII码 ‘port 53’ 过滤端口 c : …

继续阅读

gdb指令级别单步调试

gdb单步调试 原来服务的的启动方式 /data/home/2333/xx/matchsvr/bin/matchsvr --noloadconf --conf-file=../conf/matchsvr_conf.xml --log-file=../log --tlogconf=../conf/tlogconf.xml …

继续阅读

redis消息队列

消息队列的特征 消息队列在存取消息时,必须要满足三个需求,分别是 消息保序 处理重复的消息 保证消息可靠性 消息保序 对于 单队列,单进程的queue, 是满足先入先出的特点的,本身是有序的,但是如果有多个队列或多个消费者线程的时候,可能会产生乱序的问题。 kafka的例子: stream的缺点就是在redis内部 …

继续阅读

redis数据冗余与分片

redis数据冗余与分片 数据冗余-主从复制 Redis 提供了主从库模式,以保证数据副本的一致,主从库之间采用的是读写分离的方式。 读操作:主库、从库都可以接收; 写操作:首先到主库执行,然后,主库将写操作同步给从库。 主从库间如何进行第一次同步? replicaof 172.16.19.3 6379 断网增量更新 …

继续阅读

redis持久化

AOF 机制 (Append Only File) flush时间配置 AOF 配置项 appendfsync 的三个可选值: Always,同步写回:每个写命令执行完,立马同步地将日志写回磁盘; Everysec,每秒写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,每隔一秒把缓冲区中的内容写入磁盘 …

继续阅读

redis基础

如果你只是急于解决太多细微的问题,能力就很难得到质的提升 Redis 学习的路线 底层数据结构 基础数据结构 key-value的管理方式 如果哈希表里写入的数据越来越多,哈希冲突可能也会越来越多,这就会导致某些哈希冲突链过长,进而导致这个链上的元素查找耗时长,效率降低。Redis 默认使用了两个全局哈希表:哈希表 1 …

继续阅读

C++11 lambda

Introduction C ++ 11引入了lambda,该lambda提供了一种语法上轻量级的方式来动态定义函数。它们还可以通过值或引用来捕获(或封闭)周围范围的变量。在本文中,我们将研究lambda与纯函数和函子类(实现的类)在实现方面的区别operator()。 Capture By Value class …

继续阅读

C++ 11 Atomic

引入的原子指令 SSE2 extensions introduce two new fence instructions (LFENCE and MFENCE) as companions to the SFENCE instruction introduced with SSE extensions. The …

继续阅读

ddia-事务

transaction 事务是一个抽象层,允许应用程序假装某些并发问题和某些类型的硬件和软件故障不存在。各式各样的错误被简化为一种简单情况:事务中止(transaction abort),而应用需要的仅仅是重试。 如果没有事务处理,各种错误情况(进程崩溃,网络中断,停电,磁盘已满,意外并发等)意味着数据可能以各种方式变 …

继续阅读

ddia 存储与检索

存储与检索

继续阅读

理解右值引用

一句话概述 std::move本身只做类型转换,对性能无影响。 我们可以在自己的类中实现移动语义,避免深拷贝,充分利用右值引用和std::move的语言特性。 移动语义目的就是用浅拷贝代替深拷贝,右值引用跟深拷贝放到同一场景才是有意义的。 实现移动语义 在没有右值引用之前,一个简单的数组类通常实现如下,有构造函数、拷贝 …

继续阅读

一个Linux 动态库常见bug

遇到的问题 对于正在运行的程序,当更新动态库尝试重新加载时,可能会导致程序 CoreDump 。 case: 我们的一个开发环境中有多个进程依赖同一个动态库.so, 我更新这个so的时候,直接用 cp new.so old.so 导致多个进程同时core,😮😮😮 这里简单解释下其原因,以及规避方案。 简介 在加载动态库 …

继续阅读

c++虚函数表

概述 首先,相较于C语言,C++语言并没有额外增加内存消耗(确切说,在没有虚函数情况下)。 对于一个C++类对象,每个对象有独立的数据成员(非static),但是内存中成员函数只有一份,该类的所有对象共享成员函数。 编译器在编译阶段,进行函数的重构,即将成员函数进行非成员化。通过将this指针作为函数的第一个参数,通过 …

继续阅读

std::shared_ptr

shared_ptr template< class T > class shared_ptr; (C++11 起) 多个shared_ptr管理同一个指针,仅当最后一个shared_ptr析构时,指针才被delete。这是怎么实现的呢?答案是:引用计数(reference counting)。引用计数指的 …

继续阅读

从hook的并发症理解x64指令格式

hook的并发症 可以理解成一个有意思的问题,假如地址 addr1 上有一个函数func1,长度为len, 将这个函数 整体换一个位置,挪到 addr2, 移动之后的函数成为func2 memcpy(addr2 ,addr1,len ); 原来调用 func1 语法是: func1(arg1 , arg2 , …

继续阅读

网络游戏同步模型

常见的网络游戏同步模型 何为网络同步,通俗点讲,就是在一个网络游戏里有玩家A和B同框,当A释放了一个技能,状态发生了变化,B又是如何及时表现A的当前状态的呢,就是通过网络同步技术。 不同的同步模型,目的都是为了保持每个客户端的状态一致,而一般客户端的初始状态是相同的,不同的同步模型采用不同的方式,其实就是在玩家有操作输 …

继续阅读

画画

继续阅读

程序的机器级表示

CSAPP 机器级表示 汇编 两个抽象 硬件 指令集 ISA 的抽象 虚拟内存 大数组 汇编与高级语言的区别 暴露的可操作 程序计数器 rip 条件寄存器 整数寄存器 ATT 汇编与 intel 汇编区别 intel 省略了 指示大小的后缀 Intel省略了 寄存器前的 % Intel 有很多不同的方法 描述内存的位置 …

继续阅读

多进程游戏压测工具

概述 首先对于游戏的业务,一般是玩家登陆到大厅,有一些任务、物品、好友、排行榜、聊天这种交互,其次是玩家与玩家之前的匹配与对局。以Moba游戏为例,玩家主要的行为就是登陆后进行匹配,匹配到水平差不多的10个人,分为两队,每组5个人创建对局进行pvp战斗,玩家的操作以指令的方式由客户端发到服务器。 大厅中客户端与服务器的 …

继续阅读

hook的几种方式及原理学习

概述 对于大型的工程项目,依赖许多人的配合,包含大量不同的代码库与服务,有的我们能够访问程序的源代码,有的可以访问程序的可重定位文件,有的可以访问到可执行文件及其环境,假如我们想在在不同的层面改变或者添加一些逻辑,操作系统、编译器以及程序语言、代码库等都提供了 一些机制使得 开发者可以 方便的 增加或替换代码逻辑,对于 …

继续阅读

去看天问一号发射

天问一号发射 卫星发射时间表 时间表在网上有很多,善用搜索基本找是没什么问题.微博上关注了一个圈内的小姐姐,更新时间和信息都比较及时. 论坛 http://www.spaceflightfans.cn/china-launch-schedule 微博 …

继续阅读

Linux中的段

Linux中的段 Intel 微处理器的段机制是从8086 开始提出的, 那时引入的段机制解决了从CPU 内部 16 位地址到20 位实地址的转换。为了保持这种兼容性,386 仍然使用段机制,但比以前复杂。 因此,Linux 内核的设计并没有全部采用Intel 所提供的段方案,仅仅有限度地使用 了一下分段机制。这不仅简 …

继续阅读

附近的人

why 位置信息在软件以及显示生活中有了越来越多的应用,比如微信里面附近的人,很多游戏里面也加入了地理位置的玩法,让玩家与玩家有更多的互动,提高黏性。 假想这样一个需求:玩家获取附近的人,一起开黑或者某些社交软件获取附近的人交友或者交流,需要怎么实现,假定该软件的使用者比较多。 本身学过一些硬件、传感器的东西,想从计算 …

继续阅读

ucontext

概述 ucontext系列允许在C中实现高级控制流模式,例如迭代器,纤维和协程。 主要的4个函数 int setcontext(const ucontext_t *ucp) This function transfers control to the context in ucp. Execution …

继续阅读

程序员的自我修养 - 系统调用及原理

什么是系统调用 系统调用是应用程序(包含运行库)与操作系统内核的接口,它决定了应用程序如何与内核打交道。在现在的操作系统系统里,程序运行的时候,本身是没有权利访问系统的资源,由于系统有限的资源有可能被不同的应用程序同时访问,因此,如果不加以保护,各个应用程序的冲突在所难免。所以现代操作系统都尽可能的把冲突的资源保护起来 …

继续阅读

程序员的自我修养 - 可执行文件的装载与进程

进程的建立 从操作系统的角度看,一个进程最关键的特征是它拥有独立的虚拟地址空间,这使得它有别于其他进程,很多时候一个程序程序被执行同时伴随着一个新进程的创建,在有虚拟存储的情况下,创建一个进程,然后加载可执行文件并且执行,需要做三件事: 创建一个独立的虚拟地址空间 读取可执行文件头,并且建立虚拟空间与可执行文件的映射关 …

继续阅读

程序员的自我修养-线程安全

原子操作 自增(++i)操作在多线程环境下出现错误是因为这个操作被编译成的代码不止一条指令,因此在执行的时候可能执行到一半被系统调度打乱,去执行别的代码。我们把单指令的操作称为原子的(atomic),因为无论如何,单条指令的执行时不会被打乱的,为了避免出错,很多体系结构都提供了一些常用操作的原子指令。 同步与锁 为了避 …

继续阅读

一种定时器的实现

概述 一个Timer的实现需要具备以下几个行为: StartTimer(Interval, ExpiryAction) 注册一个时间间隔为 Interval 后执行 ExpiryAction 的定时器实例,其中,返回 TimerId 以区分在定时器系统中的其他定时器实例。 StopTimer(TimerId) 根据 …

继续阅读

tcp socket api

socket是网络协议栈的抽象 socket api在tcp中的体现 TCP三次握手后有个accept队列,进到这个队列才能从Listen变成accept,默认backlog 值是50。 如上图所示,这里有两个队列:syns queue(半连接队列);accept queue(全连接队列) 三次握手中,在第一步 …

继续阅读

Understanding TCPIP Network Stack

概述 TCP & socket 总结, 网卡 network interface card 网卡需要有驱动才能工作,驱动是加载到内核中的模块,负责衔接网卡和内核的网络模块,驱动在加载的时候将自己注册进网络模块,当相应的网卡收到数据包时,网络模块会调用相应的驱动程序处理数据。 内核如何从网卡接受数据,传统的经典过 …

继续阅读

TCP的几个问题

IP header UDP header TCP header MTU & MSS MSS=MTU-IP包头长-TCP包头长 三次握手 交换初始序列号 交换TCP窗口大小信息 四次挥手 可以三次挥手吗,可以,ack+fin一起发就是三次,启用延迟确认就有三次挥手 2MSL等待状态 TIME_WAIT状态也称为 …

继续阅读

awk note

处理流程 当使用 awk 命令处理一个或者多个文件时,它会依次读取文件的每一行内容,然后对其进行处理,awk 命令默认从 stdio 标准输入获取文件内容,awk 使用一对单引号来表示一些可执行的脚本代码,在可执行脚本代码里面,使用一对花括号来表示一段可执行代码块,可以同时存在多个代码块。awk 的每个花括号内同时可以 …

继续阅读

进程通信 & PIPE

历史 UNIX两大贡献者贝尔实验室和BSD,在进程之间通信侧重不同,前者基于内核对进程之间的通信手段进行了改进,形成了“System V IPC”,而后者则是基于网络形成了套接字。 而POSIX则是IEEE制定的标准,目的是为运行在不同操作系统上的软件提供统一的接口,实现者则是不同的操作系统内核开发人员。 System …

继续阅读

linux定时器时间轮算法

时间轮实现 Linux定时器分为低精度定时器和高精度定时器两种类型,内核对其均有实现。本文讨论的是我们在应用程序开发中比较常见的低精度定时器。作为常用的基础组件,定时器常用的几种实现方法包括:基于排序链表实现、基于小根堆实现、基于红黑树实现、基于时间轮实现。本文讲解的是时间复杂度最优,也是linux内核采用的基于时间轮 …

继续阅读

临界区、信号量、互斥锁、自旋锁与原子操作

临界区、信号量、互斥锁、自旋锁与原子操作 临界区 程序想要使用共享资源,必然通过一些指令去访问这些资源,若多个任务都访问同一资源,那么访问该资源的指令代码组成的区域称临界区。简而言之,临界区是代码 信号量 信号量简单的说是一种计数器,用P/V操作表示减和增。 增加操作包括两个微操作: 增加: 将信号量的值加一 唤醒此信 …

继续阅读

xargs note

作用 xargs,是execute arguments的缩写,它的作用是从标准输入中读取内容,并将 此内容传递给它要协助的命令,并作为那个命令的参数来执行。 与管道的区别 管道可以实现:将前面的标准输出作为后面的 标准输入 管道无法实现:将前面的标准输出作为后面的 命令参数 $ cat /etc/passwd | …

继续阅读

江湖爱情故事

【潇湘夜雨 莫大先生】 衡山派掌门人莫大先生一直没有婚娶。 有一回群雄聚会,刘正风忍不住问他:”师兄,你都一把年纪了,怎么还不娶妻生娃呢?” 莫大先生眼睛半开半闭,拉着他的胡琴,慢悠悠地说出一番话来: 要说成婚哪,首先得找个女人,对吧? 婚姻本来就是男人和女人的事。――东方不败脸色一沉,绣花的手倏然停下。 那么找个什么 …

继续阅读

写一个操作系统_15 内存管理初步

内存管理初步 物理内存 认为的先规划成两部分,用户的物理内存和内核的物理内存,专项专用,内核有方法去占用用户的内存,但是规定两部分内存是专用的,内核只使用自己的物理内存。 物理内存的内核、用户部分分别用 bitmap 来统计管理。 虚拟内存 首先,虚拟内存也是需要管理的,毕竟程序要申请堆上的内存,假定我们只支持512M …

继续阅读

写一个操作系统_14 C 链接与系统调用

用C语言写内核 无论什么语言,要编译成 ELF文件格式(或者定一个其他的标准) int main() { while(1){}; return 0; } 链接可以指定最终生成的可执行文件的起始虚拟地址,我们 指定 内核加载到 0x1500的地方,内核初始化的时候跳转内核要跳转到这个地方。 ld …

继续阅读

写一个操作系统_13 内核的宏观视角

规划内核的内存分布 MBR、loader部分 我们把 加MBR、Loader以及后面需要加载的内核都放到 物理内存的 0-1M 这个空间里面,其中,MBR执行完了以后,我们把它覆盖掉,如下面的图。 图1: MBR,loader的物理内存定位 图二: 覆盖MBR位置写kerner.bin 分离用户空间和内核空间 用保护模 …

继续阅读

写一个操作系统_12 linux 原始的几个进程

原始进程 Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2) idle进程 由系统自动创建, 运行在内核态 idle进程其pid=0,其前身是系统创建的第一个进程,也是唯一一个没有通过fork或者kernel_thread产生的进程。完成加 …

继续阅读

写一个操作系统_11 Linux是怎么实现线程的

Linux2.6以前的线程 在Linux内核2.6出现之前进程是(最小)可调度的对象,当时的Linux不真正支持线程。Linux 2.4内核中不知道什么是“线程”,只有一个“task_struct”的数据结构,就是进程。 Linux内核有一个系统调用指令clone(),这个指令产生一个调用调用的进程的复件,而且这个复件 …

继续阅读

写一个操作系统_10 操作系统是由中断驱动的

中断分类 按照中断的来源分类,来自CPU外部的中断称为外部中断,来自CPU内部的称为内部中断;细分的话,外部中断根据严重程度,分为可屏蔽中断和不可屏蔽中断;内部中断按照是否正常分为软中断和异常。 外部中断 外部中断来自CPU的外部的某个硬件,因此又被称为硬件中断,比如网卡收到了一个数据包,它就会通知CPU,CPU得到通 …

继续阅读

2019年4月

2019年4月 上交拜访颢C 和大学室友爬黄山 黄山周边 遇到一个可爱的小妹妹 :)

继续阅读

写一个操作系统_09 C语言和汇编语言

函数调用约定 编译器一般使用堆栈实现函数调用,每个进程都有自己的栈,用栈来传递参数,会带来以下问题: 参数存储在栈中,那么谁来负责回收参数所占的栈空间,是调用者?还是被调用者 当参数很多的时候后,主调函数将参数以什么样的顺序传递 高级语言有调用的约定: 举例: int sub(int a , int b){ // 被调 …

继续阅读

文件描述符限制

文件描述符限制 文件描述符 Linux的核心思想之一就是”一切皆文件”。即Linux中所有的内容都是以文件的形式保存和管理的,它为不同类型的文件提供了统一的操作接口,对于不同类型的文件,我们都可以使用fopen()/fclose()/fwrite()/fread()等对这些文件进行读写处理。在Linux中,普通文件、目 …

继续阅读

写一个操作系统_08 内核与C语言

内核与C语言 写内核能用C标准库吗? 我们开发用户应用程序的时候,有标准库可以用,最典型的就是GUN C库,标准库一般是系统调用的封装,表面上是通过标准库访问系统资源,实际上是通过系统调用实现的。Linux的系统调用一般是先往eax寄存器写入系统调用号,然后通过0x80中断来实现。中断向量号为0x80称为系统中断门,更 …

继续阅读

写一个操作系统_07 设计自己的页表

设计自己的页表 只针对32位的操作系统,设计一个二级页表,目的是构建一个简易的能跑起来的操作系统。对于4G的地址空间,每个页大小是4K,模仿Linux早期的做法,32位地址的前10位为页目录项,中间10位为页表,后面10位为偏移量。 |--目录项----|--页表-----|---地址偏移-| …

继续阅读

写一个操作系统_06 内存寻址

保护模式 为什么要有保护模式 实模式是有很大弊端的,首先,直接操作物理内存,这样的话每次只能运行一个程序,并且不安全;另外,内存最大使用到1M,限制太大。 保护模式下,程序不能直接访问物理地址,程序的虚拟地址需要被转换为物理地址后再去访问,地址转换是由处理器和操作系统协作完成的,处理器在硬件上提供地址转换部件,操作系统 …

继续阅读

写一个操作系统_05 调试MBR

熟悉MBR引导 MBR的512字节里面也是代码,他被BIOS加载执行,自身执行的时候加载操作系统的loader,我们在没有操作系统loader的情况下先写一段测试程序,体验一下。 实现的功能如下: BIOS 加载 MBR中的代码,执行,用BIOS 中断 INT 0x10显示字符串 MBR的代码 ;主引导程序 ; 起始编 …

继续阅读

写一个操作系统_04 内核调试环境搭建

环境准备工作 有一台win10的笔记本,调试想选择在Linux环境下,选择配置虚拟机,然后安装bochs调试内核 需要准备的软件: VirtualBox和增加工具包 安装CentOS 6.8minimal 设置CentOS的网卡,使之能上网 用yum安装开发工具和GNOME 安装bochs 进入GNOME,在GNOME …

继续阅读

写一个操作系统_03 引导内核

操作系统引导 MBR 接上一篇BIOS启动,BIOS完成了基础的硬件检测和硬件的中断向量表的初始化,然后BIOS找到MBR并且把MBR加载在内存中,跳转到该位置。加载的位置在内存中的0x7C00,至于为什么是这个位置,主要是因为历史的原因吧,最初的内存只有32K,历史选择了0x7C00(31k)。 MBR引导扇区的内容 …

继续阅读

东西冲海岸线

去东西冲转,记录一下: 穿专业点的徒步鞋,有的上下坡很滑,土很滑 花草扎人,长袖 很多地方上坡超过70度,注意安全,天气不好就改天吧 Enjoy :)

继续阅读

写一个操作系统_02 硬件与BIOS

硬件与BIOS流程 硬件 传统来说,主板上两个主要芯片,靠上方的叫北桥,靠下方的叫南桥。 大体上说:北桥负责与CPU通信,并且连接高速设备(内存/显卡),并且与南桥通信;南桥负责与低速设备(硬盘/USB)通信,时钟/BIOS/系统管理/旧式设备控制,并且与北桥通信。 Intel从第一代Core i7 (i7 9xx)开 …

继续阅读

男人与婚姻

有朋友问到区分激情和爱情,其实很好区分的,当你不见她时茶饭不思,是激情。老想见到她,想和她一起玩,一起上床,一起做白日梦,是激情。每天短信电话多的没完,是激情。为了生日节日费尽心思想浪漫的点子,是激情。当你和她在一起时脑子里不自觉的规划实实在在的将来,是爱情。当你们争吵到很凶,火很大时,也不忍心说一句伤害她的话,是爱 …

继续阅读

vmstat

最近遇到了机器特别卡,请求发到服务器收不到响应的情况,总结了下 vmstat 定位系统性能问题的用法 快速上手 [root@VM_80_251_centos ~]# vmstat 1 procs -----------memory---------- ---swap-- -----io---- -system-- …

继续阅读