- 博客(19)
- 收藏
- 关注
原创 动态数组
动态数组挺常用的,它和普通数组的最大区别也就是它的容量大小可变,而其中的重点也就是它的扩容机制。本篇博客就主要记录记录我对几种常用的动态数组的理解,主要包括C++ stl里的vector,java中的ArrayList,redis中的SDS(动态字符串,本质上就是动态字符数组)并且主要讨论它们的扩容机制。C++ stl —— vectorvector就是一个动态(大小可变的)数组,使用vector的程序员不需要关注它的容量大小变化,如果有扩容需求时,程序会自动处理。vector的扩容机制vect
2020-08-30 16:36:56
1516
原创 CPU虚拟化流程——源码分析
CPU虚拟化的整个流程是怎样?qemu通过ioctl与kvm通信。kvm与qemu的配合流程如下:qemu运行流程伪代码如下:vcpu创建流程vcpu整体创建流程如下: kvm_vm_ioctl()-->kvm_ioctl_create_vcpu()-->kvm_arch_vcpu_create(kvm, id)--> kvm_x86_ops->vcpu_create(kvm, id) == vmx_create_vcpu() (intel)
2020-07-13 11:09:27
1856
原创 ftrace、perf的基础使用(以及如何使用它们获取虚拟机退出原因)
ftrace简介ftrace 的作用是帮助开发人员了解 Linux 内核的运行时行为,以便进行故障调试或性能分析。最早 ftrace 是一个 function tracer,仅能够记录内核的函数调用流程。ftrace 在内核态工作,用户通过 debugfs 接口来控制和使用 ftrace ,一般挂载在/sys/kernel/debug/tracing目录下。目录结构如下:基础使用现在的ftrace支持多种tracer可以通过cat/sys/kernel/debug/tracing/avail
2020-07-12 20:35:06
2589
原创 虚拟化学习笔记四——硬件辅助CPU虚拟化技术VT-x
VT-x基础知识Intel VT中的VT-x(Intel Virtualization technology for x86)技术扩展了传统的IA32处理器架构,为IA32架构的处理器虚拟化提供了硬件支持。VMX操作模式VT-x引入了两种操作模式,统称为VMX操作模式。1. 根操作模式:VMM运行所处的模式。2. 非根操作模式:客户机运行所处的模式。这两种操作模式和IA32特权级0 ~ 特权级3是正交的,即每种操作模式下都有相应的特权级0 ~ 特权级3。所以在VT-x使用的情况下,描述程序运行
2020-07-12 20:01:24
3760
4
原创 虚拟化学习笔记三——原理概述
虚拟化的三个主要任务虚拟机监控器VMM对物理资源的虚拟可以归结为三个主要任务:处理器虚拟化、内存虚拟化、I/O虚拟化。处理器虚拟化是VMM中最核心的部分,内存虚拟化和I/O虚拟化都依赖于处理器虚拟化的正确实现。特权指令与敏感指令特权指令特权指令:系统中一些操作和管理关键资源的指令,这些指令只有在最高特权级上才能正确执行。如果在非最高特权级上运行,特权指令会引发一个异常(其实不一定,也可能被直接忽略),处理器会陷入到最高特权级,交由系统软件来处理。敏感指令敏感指令:操作特权资源的指令,包括修改虚
2020-07-12 19:52:05
712
原创 虚拟化学习笔记一——虚拟化概述
为什么需要虚拟化虚拟化的三个主要任务虚拟机监控器VMM对物理资源的虚拟可以归结为三个主要任务:处理器虚拟化、内存虚拟化、I/O虚拟化。处理器虚拟化是VMM中最核心的部分,内存虚拟化和I/O虚拟化都依赖于处理器虚拟化的正确实现。特权指令与敏感指令特权指令特权指令:系统中一些操作和管理关键资源的指令,这些指令只有在最高特权级上才能正确执行。如果在非最高特权级上运行,特权指令会引发一个异常(其实不一定,也可能被直接忽略),处理器会陷入到最高特权级,交由系统软件来处理。敏感指令敏感指令:操作特权资源
2020-07-12 15:57:47
617
原创 虚拟化学习笔记二——认识kvm、qemu、libvirt
kvm qemu libvirt的区别和联系kvm是内核模块,负责CPU、内存的虚拟化。qemu是运行在用户空间的软件,可以独立模拟出整台计算机,包括CPU,内存,IO设备。其中CPU、内存部分既可以独立实现(软件,性能较差),也可以利用KVM实现(硬件辅助,性能较高)。qemu通过ioctl调用/dev/kvm这个接口与KVM交互,这样KVM在内核空间模拟虚拟机CPU,qemu-kvm负责模拟虚拟机I/O设备。libvirt是目前使用最为广泛的对KVM虚拟机进行管理的工具和应用程序接口(API),
2020-07-06 17:23:13
2826
原创 内核问答(补充)
以下问题是知识分享时各位前辈提出的,但回答得不是很好的问题,然后我自己也对其中一些问题做了延伸。答案大多自己总结,不排除有错误,如有问题,欢迎指出。问题概览为什么需要多级页表?内核低端内存的页表是同一份?从用户态陷入到内核态,RIP是如何保存的?内核态的栈是如何指定的?内核抢占的含义?Slab和伙伴系统的关系?硬中断和软中断的优先级?软中断什么时机执行?为什么需要多级页表为了减少每个进程页表所需内存的大小。具体理由如下:无论是几级页表,为了保证能通过索引找到一个页表中的相应表项,
2020-07-03 11:12:21
336
原创 内核问答
以下问题大部分出自导师,小部分是自己思考后提出。答案大部分自己总结,由于水平有限,不排除有错漏的可能,如果发现有问题,欢迎指出。内存部分(有部分进程、系统调用)逻辑地址、虚拟地址、线性地址、物理地址的区别是什么?答:逻辑地址是编程时使用的地址,比如常用到的指针,指针内存的是某变量的地址,这个地址指的就是逻辑地址。物理地址是用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。虚拟地址和线性地址是一个东西,都是指从逻辑地址转换到虚拟地址的中间的一个地址,只有在保护模式中才使用。因为它不是
2020-07-02 21:13:18
4309
原创 LINUX学习笔记一——磁盘设备
LINUX磁盘设备linux与设备文件各个组件或设备在linux下都是文件,几乎所有硬件设备都在/dev目录下。IDE接口的硬盘的文件名即为/dev/hd[a-d]。(hd即hard disk ,a到d是区分不同硬盘的标志)SATA/USB/SCSI硬盘以及U盘是/dev/sd[a-p]打印机是/dev/lp0软盘是/dev/fd0更多设备见下图:磁盘文件名与组成常见的磁盘接口有两种,IDE与SATA。对于IDE接口来说,一个IDE扁平电缆可以连接两个IDE设备,而主机一般又提供两个I
2020-05-26 16:05:03
378
原创 Lab 1: Booting a PC
Lab 1: Booting a PC官网地址模拟x86使用qemu模拟x86架构。运行方法:在lab下输入make qemu命令或者make qemu-nox命令'Booting from Hard Disk…'之后的文字都是由jos内核输出的。“K> ”标志着kernel monitor,可以在 “K> ”后输入命令。目前只有help和kerninfo命令。PC...
2020-05-13 12:03:34
325
原创 C语言在x86上使用堆栈的方式
参数压栈顺序C语言参数压栈顺序是从右到左,这是为了支持可变长参数的函数。以cprintf()函数为例。在我做过的jos操作系统中,该函数原型是int cprintf(const char *format, ...);这就是一个可变长参数形式,参数的具体个数由format中的占位符%决定。如果压栈顺序是从左到右,看一看会是什么情况?format最先入栈,然后把其他参数入栈。那么fo...
2020-05-13 11:55:18
743
原创 MIT6.828 fall2018之环境配置
MIT6.828mit(麻省理工)的操作系统课程,课程的实验部分包括6个实验, 包含Booting a PCMemory ManagementUser EnvironmentsPreemptive MultitaskingFile system, Spawn and ShellNetwork Driver (default final project)完成6个实验后就相当于写完...
2020-05-02 16:19:29
988
原创 源与镜像与镜像源
源是什么源就是来源。就是你安装软件时,程序从哪里获取软件包(安装程序在你的机器上,但需要安装的东西却在软件源服务器上)。源,在Ubuntu下,它相当于软件库,需要什么软件,只要记得正确的软件名就可以用命令抄安装:其实你可以把他称为软件仓库。安装软件时,就是从仓库里面调取数据放在你的机器上。sudo apt-get install 软件名例如:你要安装gcc软件,那么你就可以再终端中输入...
2020-04-25 13:50:45
3870
1
原创 《Redis设计与实现》数据结构与对象——字符串对象与简单动态字符串SDS
对象typedef struct redisObject { // 类型 unsigned type:4; // 编码 unsigned encoding:4; // 对象最后一次被访问的时间 unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */ ...
2020-04-22 18:04:33
216
原创 网络编程之端口与套接字
基础概念端口概念与用途端口是TCP/IP协议簇中,应用层进程与传输层协议实体间的通信接口。应用层进程通过系统调用与某个端口进行绑定,然后就可以通过该端口接收或发送数据。应用层进程与端口有一一对应的关系,所以可以用端口标识通信的网络应用进程。端口号每个端口拥有一个端口号,用于区别不同的端口。端口与传输层的协议是密不可分的,必须区别是TCP的端口还是UDP的端口。TCP和UDP各自的...
2020-04-22 00:50:49
1576
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人