自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(52)
  • 收藏
  • 关注

原创 eBPF入门

BPF和eBPF是什么?简单来说, BPF提供了一种在和各种内核和应用程序事件发生时运行一段小程序的机制BPF是一项灵活而高效的技术, 由指令集, 存储对象和辅助函数等几部分组成,由于它采用了虚拟指令集规范, 因此也可将它视作一种虚拟机的实现. 这些指令由Linux内核的BPF运行时模块执行. 具体来说, 它运行时提供两种机制:一个解释器和一个将BPF指令动态转换为本地化指令的即时(JIT)编译器主要作用:跟踪, 嗅探, 采样, 剖析和可观察性BCC, bptrace和IO Visor直接通过BP

2021-10-22 22:40:50 329

原创 AT&T语法

在linux内核编写中, 为了维持与gcc输出汇编程序的兼容性, as汇编器使用AT&T系统的V的汇编语法(下面简称为AT&T语法). 这种语法与Intel汇编程序使用的语法(简称Intel语法)很不一样, 他们之间的主要区别有以下几点:AT&T语法中立即操作数前面要加一个字符"$";寄存器操作数名前要加字符百分号"%", 绝对跳转/调用(相对于与程序计数器有关的跳转/调用)操作数前面要加"*". 而Intel汇编语法没有这些限制AT$T语法与Intel语法使用的源和目的操作数

2021-10-21 22:24:45 821

原创 linux内核2.6.16版本启动分析(1)

在这里插入代码片

2021-10-18 16:50:19 210

原创 linux内核目录分析

最近准备开始研读linux的内核了, 今天在deepin内核版本为4.8.15上编译安装了内核4.19.6, 本来是先装2.6.16版本的, 但2.6.16版本的内核版本要求gcc的版本为4.6之下, 装4.6版本的gcc的时候出了点问题, 还没解决安装教程内核编译教程, 结束后重启在grub的界面上选advance的选项, 就有不同版本的内核选项了,选择你需要的就好了突然有一个问题, ...

2021-10-16 22:12:23 122 1

原创 文件系统的内部结构

硬盘实际上是由一些磁性盘片组成的计算机系统的一个设备, 文件系统是对该设备的一种多层次的抽象第一层抽象: 从磁盘到分区一个磁盘能够存储大量数据. 可被划分成分区, 以便在一个大的实体内创建独立的区域, 每个分区都可以看作是一个独立的磁盘第二层抽象: 从磁盘到块序列(此处假设你了解机械硬盘的形状)为每个磁盘块分配连续的编号以一个磁盘接着一个磁盘从上到下给所有的块编号, 或者以一个磁道接着一个磁道的从外向里给所有的块编号, 一个磁盘扇区编号的系统是的我们可以把磁盘视做一系列块地组合第三层抽象: 从块序

2020-12-28 15:15:31 1051

原创 CPU原生支持的任务切换方式

CPU 厂商原本计划的一种任务切换方法,并不是咱们项目中任务切换的方法, 未采用的原因是此方法效率不高,现代操作系统很少用这种方法切换任务为了支持多任务, CPU 厂商提供了 LDT TSS 这两种原生支持,他们要求为每个任务分别配一个 LDT TSS (这由咱们操作系统程序员来构建), LDT 中保存的是任务自己的实体资源,也就是数据和代码,TSS 中保存的是任务的上下文状态及三种特权级的栈指针、 I/O 位图等信息。既然 LDT TSS 用来表示任务,那么任务切换就是换这两个结构:将新任务对应的 LD

2020-11-27 22:28:14 487 3

原创 实现线程的两种方式

起初,操作系统中只有进程的概念,人们那时候对并发没有太高的要求。后来有些人想提高程序的井发,这才有了线程这一新生事物。任何新生事物在诞生之初都会被小心谨慎地对待,人们提出线程的需求时,操作系统也抱着“围观”的心态不敢轻举妄动,只能坐看其发展,真正待需求明朗时才会在操作系统一级来实现。想想也是,如果稍微有个新需求就往内核里面塞,内核开发成本很高不说,至少内核中肯定有很多“不切实际”的功能,所以人们还是能够体谅操作系统研发厂商的.为此,既然不能说服操作系统支持线程,人们只好在用户进程内想办法。所以,线程的实现

2020-11-17 13:45:48 942

原创 门描述符

门,顾名思义,是通往某处的入口。在计算机中,用门来表示一段程序的入口。拿它和段描述符对比一下就容易理解了,段描述符中描述的是一片内存区域,而门描述符中描述的是一段代码。 门描述符中的各属性位与段描述符中的属性意义相同,大伙可以参考全局描述符表部分的介绍。下面简要说下这几种门描述符,这里咱们只讨论 32 位保护模式。任务门任务门和任务状态段TSS是 Intel 处理器在硬件一级提供的任务切换机制,所以任务门需要和 TSS 配合在一起使用,在任务门中记录的是 TSS 选择子,偏移量未使用。

2020-11-04 12:24:22 853

原创 组件协作模式

"组件协作"模式现代软件专业分工之后第一个结果就素"框架与应用程序的划分", "组件协作"模式通过晚期绑定, 来实现框架与应用程序间的松耦合典型模式template MethodStrategyObserver / EventTemplate Method: 定义一个操作中的算法的骨架(稳定), 而将一些步骤延迟(变化)到子类. 它使得子类可以不改变(复用)一个算法的结构即可重用(override 重写)该算法的某些特殊步骤下面是refactoring to patterns 的代码

2020-10-14 18:22:27 140

原创 设计模式

如何解决复杂的问题?分解抽象画图工具class Point {public: int x; int y;};//线class Line {public:}//矩形class Rect {}class MainFrom : public Form {private: point p1, p2; vector<Line> lineVector; vector<Rect> rectVector;pritected: virtual vo

2020-10-14 15:25:34 79

原创 虚拟内存(分页机制)

以前的一片文章讲了为什么会出现分页, 是为了解决什么问题?首先澄清一个概念.其实虚拟内存和分页是两件事, 分页是指将把地址空间人为地等分成固定大小的页, 这个页的粒度比段更小, 以方便在外存与内存换入换出, 而虚拟内存是为了解决线性地址与物理地址之间的相等关系, 因为如果这样, 线性地址是由编译器翻译出来的, 它本身是连续的, 而物理地址也必须连续才行, 但物理内存往往在运行时间长了之后, 成为各个碎片, 这就导致物理地址很难成为连续的(所以平时使用完电脑要记得关机), 所以要建立一种线性地址与物理地址之

2020-09-30 17:20:05 1954

原创 进入保护模式

设置全局描述符表打开A20地址线在实模式采用段基址:段内偏移地址的形式, 有20根地址线,最大寻址空间1MB, 但这种寻址方式可以寻址范围0x0000: 0x0000 ~ 0xffff: 0xffff, 即0 ~ 0x10ffef, 而20位地址线的访问空间是0 ~ 0xfffff, 即1MB范围, 所以当寄存器的表示范围超过地址线所能表示的范围后, 会发生地址会绕, 即或舍弃高位的溢出, 比如, 0x10000寻址到0x0000所表示的内存地址.CPU发展到了80286后, 虽然地址总线从原来的2.

2020-09-29 22:58:49 226

原创 全局描述符表

首先,实模式下存在一些问题:实模式的用户程序可以破坏存储代码的内存区域,所以要添加个内存段类型属性来阻止这种行为实模式下的用户程序和操作系统是同一级别的,所以要添加个特权级属性来区分用户程序和操作系统的地位其次, 是一些访问内存段的必要属性条件内存段是一片内存区域,访问内存就要提供段基址,所以要有段基址属性为了限制程序访问内存地范围,还要对大小进行约束,所以要有段界限属性...

2020-09-25 13:15:02 906

原创 C语言内联汇编

开门见山,汇编语言和C语言混合编程可分为两大类:单独的汇编代码文件与单独的C语言分别编译成目标文件后,一起链接成可执性文件在C语言中嵌入汇编代码,直接编译生成可执行程序今天主要介绍第二种内联汇编称为inline assembly, GCC支持在C代码中直接嵌入汇编代码,所以称为GCC inline assembly.内联汇编按格式分为两大类,一类是最简单的基本内联汇编,另一类是复杂一些的扩展内联汇编.(内联汇编中所用的汇编语言是AT&T,并不是咋们熟悉的Intel语法,GCC只支持它,

2020-09-06 12:31:56 319

原创 开源的Bochs虚拟机软件

如果你准备写一个操作系统或者只是体验一下linux的开机流程,写一个简单的bootloader,你可能会需要一个软件–Bochs, Bochs是一个开源软件,是你唯一可选择的调试器.开源意味着你不需要花钱购买就可以使用它. 它用软件来模拟处理器取指令和执行指令的过程,以及整个计算机硬件.当它开始运行时,就直接模拟计算机的启动过程.正是因为如此,它才有可能做一些调试工作.很重要的一点,它本身就是一个虚拟机,类似于Virtualbox.因此,它也很容易就让你单步跟踪硬盘的控制权,查看寄存器的内容和状态.Boc

2020-08-03 15:03:06 417

原创 8086处理器的寻址方式

处理器的一生,是忙碌的一生,只要它工作着,就必定是在取指令和执行指令.所以,如果你问处理器整天忙什么,它一定会说:“还能有什么,就是和数打交道!”既然操作和处理的是数值,那么,必定涉及数值从哪里来,处理后送到哪里去,这就称为寻址方式. 简单地说,寻址方式就是如何找到要操作的数据,以及如何找到存放操作结果的地方.寄存器寻址指令执行时,操作的数位于寄存器中,可以从寄存器中取得mov ax cx ;l两个操作数都是寄存器寻址add ax, 0xf000 ;目的操作数是

2020-07-27 16:06:30 640

原创 构造/析构/赋值运算

摘自effective C++第2部分构造/析构/赋值运算5. 了解C++默默编写并调用哪些函数(Know what functions C++ silently writes and calls)编译器可以暗自为class创建default构造函数,copy构造函数,copy assignment操作符,以及析构函数C++中,如果自己没有声明,编译器就会为它声明(编译器版本的)一个copy构造函数,一个copy assignment操作符和一个析构函数.此外,如果你没有声明任何构造函数,编译器也会为

2020-06-03 23:25:37 155

原创 两种高效的事件处理模式

服务器程序通常处理三类事件:I/O事件,信号及定时事件。下文介绍一下两种高效的事件处理上模式:Reactor和Proactor.随着网络设计模式的兴起,Reactor和Proactor事件处理模式应用而生。同步I/O模式通常用于实现Reactor模式,异步I/O模型则用于实现Proactor模式。Reactor模式Reactor是这样一种模式。它要求主线程(I/O处理单元,下同)只负责监听文件描述符上是否有事件发生,有的话就立即将该事件通知工作线程(逻辑单元,下同)。除此之外,主线程不做任何其他实质性的

2020-05-12 14:16:29 207

原创 同步与锁

为了避免多个线程同事读写同一个数据而产生不可预料的后果,我们要将各个线程对同一数据的访问同步。所谓同步,即指在一个线程访问数据未结束的时候,其他线程不得不对同一个数据进行访问。如此,对数据的访问被原子化了。同步的最常见的方法是使用锁(Lock).锁是一种非强制机制,每一个线程在访问数据或资源之前首先试图获取锁,并在访问结束之后释放锁。在锁已经被占用的时候试图获取锁时,线程会等待,直到锁重新可用。...

2020-05-07 18:40:17 275 1

原创 时间

真实时间 : 可分为日历时间和流逝时间进程时间 : 一个进程所使用的CPU时间总量,适用于对程序,算法性能的检查或优化大多数计算机体系结构都内置有硬件时钟, 使内核得以计算真实时间和进程时间....

2020-03-24 19:03:55 108 1

原创 为什么要字节对齐?

结构体中数据成员对齐规则:结构体(struct)或联合(union) 的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员的大小或该成员的子成员大小(只要该成员有子成员)的整数倍开始 .结构体作为成员:如果一个结构体里有某些结构体成员,则结构体成员要从内部最大元素大小的整数倍地址开始存储。收尾工作:结构体的总大小,也就是sizeof的结果,必须是内...

2020-03-17 21:41:16 228

原创 8086微处理器的寄存器组织

8086CPU内部有14个16位的寄存器, 按功能可以分为8个通用寄存器, 4个段寄存器和两个控制寄存器.通用寄存器通用寄存器可以分为两类: 数据寄存器(AX, BX, CX, DX)和地址寄存器/变址寄存器(SI, DI, SP, BP)8086CPU有4个16位数据寄存器:累加器AX: 最常用的寄存器,许多操作可以在AX中完成, 而且有一些操作只能在AX中完成, 例如乘法和除法操作...

2020-03-01 02:13:20 2881

原创 8086CPU结构与功能

微处理器的外部结构微处理器的外部结构如下图所示.8086CPU片有40个管脚,微处理器通过这些引脚与外部的逻辑部件连接,完成信息的交换.CPU的这些引脚称为微处理器级的总线功能:与存储器之间交换信息(指令及数据)与I/O设备之间交换信息能输入和输出必要的信号总线是用于连接CPU与其他部件的一组连线,总线从功能上可分为三种:数据总线DB:传送信息, 16根地址总线AB:传送地址...

2020-03-01 01:33:59 5034

原创 I/O模型

对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。所以说,当一个read操作发生时,它会经历两个阶段:等待数据准备 (Waiting for the data to be ready)将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)...

2019-12-09 22:41:02 117 1

原创 Linux中的异常和中断处理以及系统调用

Linux中的异常和中断处理Linux利用陷阱门来处理异常,利用中断门来处理中断。异常和中断对应处理程序都属于内核代码段,所以,所有中断门和陷阱门的段选择符(0x60)都指向 GDT 中的“内核代码段”描述符。通过中断门进入到一个中断服务程序时,CPU 会清除 EFLAGS 寄存器中的 IF 标志,即关中断;通过陷阱门进入一个异常处理程序时,CPU 不会修改 IF 标志。也就是说,外部中断...

2019-12-01 22:22:23 829

原创 异常和中断处理

IA-32中异常和中断的处理引导程序被读到内存后,开始执行引导程序,以装入操作系统内核,并对GDT,IDT等进行初始化,系统启动后,进入保护模式。IA-32中,每条指令执行后,下条指令的逻辑地址(虚拟地址)由CS和EIP指示 实地址模式下:指令地址=cs<<4+IP每条指令执行过程中,CPU会根据执行情况判定是否发生了某种内部异常事件,并在某条指令执行结束时判定是否发生了外部中...

2019-12-01 21:14:57 974

原创 中断的基本概念

异常和中断概念: 程序执行过程中CPU会遇到一些特殊情况,是正在执行的程序被“中断”,cpu中止原来正在执行的程序,转到处理异常情况或特殊事件的程序去执行,结束后再返回到原被中止的程序处(断点)继续执行程序执行被"中断“的事件(在硬件层面)有两类内部异常:在CPU内部发生的意外事件或特殊事件外部中断:在CPU外部发生的特殊事件,通过“中断请求“信号向CPU请求处理。异常和...

2019-12-01 15:08:06 8947

原创 float 类型的存储

首先,看一段代码:int main(){ double d = 3.14; float f = d; if ((float)d == f) { printf("hello"); } if (d != f) { printf(" world!"); }}这个程序的输出结果是: hello world!然后你有没有产生了好奇???这是为啥,下面我就来具体讲一讲float...

2019-11-11 23:16:34 438

原创 汇编之一个C程序的执行过程

一个C过程的大致结构如下:1. 准备阶段形成帧底:push指令和move指令生成栈帧(如果需要的话):sub指令或and指令保存现场(如果有被调用者保存寄存器):mov指令2. 过程(函数)体:分配局部空间,并赋值具体处理逻辑,如果遇到函数调用准备参数:将实参送到栈帧入口参数处CALL指令:保存返回地址并转调用函数在EAX中准备返回参数3. 结束阶段:退栈...

2019-11-02 18:21:08 371 1

原创 进程状态

进程状态:R(Running,运行): 进程是可执行的。他或者正在执行,或者在运行队列中等待执行。int main(){ while(1) { }}S(Sleep,可中断): 进程正在睡眠(也就是说它被阻塞),等待某些条件的达成。一旦这些条件达成,内核就会把进程状态设置为运行。处于此状态的进程也会应为接收到信号而提前被唤醒并随时准备投入运行。int main(){ w...

2019-10-24 14:00:38 82

原创 内存之栈堆

首先看看进程的地址空间是如何分布的现代的应用程序都运行在一个内存空间里,在32的系统里,这个内存空间拥有4GB的寻址能力,Linux默认情况下将高地址的1GB空间分配给内核,用户使用剩下的3GB的内存空间称为“用户空间”,一般来讲,应用程序使用的内存空间有如下的“默认权限”:栈:栈用于维护函数系统调用的上下文,离开了栈函数调用就没法实现。堆:堆是用来容纳应用程序动态分配的内存区域,当程序...

2019-10-20 12:26:52 226

原创 Linux文件系统概述

Linux文件系统概述Linux 的文件系统和Windows的文件系统有很大的不同。Linux只有一个文件树,整个文件系统是以一个树根“/”为起点的,所有的文件和外部设备都以文件的形式挂结在这个文件树上,包括硬盘,软盘,光驱,调制解调器等。在Linux系统中有许多系统默认的目录,这些目录按照不同的用途而放置了特定的文件:/bin: 该目录存放最常用的命令,比如拷贝命令cp,编辑命令vi,...

2019-10-14 18:53:25 345

原创 系统软件体系架构

计算机系统软件体系结构采用一种层的结构,有人说过一句名言:"Any problem in computer science can be solved by another layer of indirection."计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。这句话几乎概括了计算机系统软件体系结构的设计要点,整个体系结构从上到下都是按照严格的层次结构设计的。不仅是计算机系...

2019-10-07 18:22:47 497

原创 桀溺聊天室

桀溺聊天室1. 需求分析IM技术作为互联网实时互动场景的底层架构,在整个互动生态圈的价值斐然。随着互联网的发展,人们对于实时互动的要求越来越高。于是,IM技术不止应用于QQ、微信这样的面向聊天的软件,它其实有着宽广的应用场景和足够有想象力的前景。甚至在不知不觉之间,IM系统已经根植于我们的互联网生活中,成为各大App必不可少的模块。2. 项目概述开发环境及使用工具开发环境: dee...

2019-10-06 14:38:46 157

原创 虚拟内存--内存不够怎么办

你听说过虚拟内存的概念吗???这是百度百科上的描述,说的很精辟,但是想必如果是一个新手,就会完全不知道所云。那虚拟内存到底是怎样一种技术呢?他的用处是什么呢?它为何而出现呢????物理内存假如我们没有虚拟内存的概念,只有物理内存。那你想象一下,我们现在使用计算机都是多核处理,多并发的,也就是说在同一时刻可能会有多个进程在同时运行,也就是说有限的物理内存需要分配给正在跑的所有进程。这会带来什么...

2019-10-06 14:09:25 338

原创 数组与指针

既然说到了这,我们就顺便说说数组与指针了其实按照我的理解,数组和指针其实真没多大关系,指针是有真实内存的int a;int *p = &a;这两行代码的意思是 在栈上分配一个int 类型的空间,即4字节;分配一个int *类型的空间,即8字节。在p的内存中写入&a,即a的地址。而大多数人迷惑的原因在这...

2019-09-22 13:39:32 130

原创 数组地址含义问题

int main(){ //1 int *p = NULL; printf("sizeof(p) = %d ", sizeof(p)); printf("sizeof(*p) = %d ", sizeof(*p)); int a[100]; //2 printf("sizeof(a) = %d ", sizeof(a...

2019-09-22 12:31:45 182

原创 为什么执行同一个程序每次输出的变量地址是不一样的

首先看一下下面的代码#include<stdio.h>int main(){ int a = 1; printf("%p\n", &a); return 0;}然后我就很疑惑,为什么每次的地址都是不一样的。为什么会有这样的疑问呢,编译完成后得到的文件叫做可重定位目标文件,链接的过程就是主要就是地址空间分配,符号决议和重定位。那么,按照这...

2019-09-20 09:45:47 3294

原创 大一生活总结

暑假留校生活结束了,在嗨皮了将近一周的时间之后,今天终于重新打开了电脑。要写第一篇生活感悟篇,思维有些乱,有点激动,感觉有好多想说的,又不知从何说起,其实是与自己的对话……那就以时间轴为坐标,理一下我的大一生活。大一开学到小组面试之前因为我有一个表哥,也是我们学校,所以高三暑假的时候我就接触到了编程方面的知识,可是那个时候我并没有抓住机会,没有好好学,不过我有了一个意识,一定要加入一个实验...

2019-08-29 21:05:01 366

原创 C语言程序执行过程之链接

c语言程序执行过程静态链接动态链接

2019-08-11 21:25:08 586

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除