- 博客(205)
- 收藏
- 关注
转载 Intel RDT 详解
1.RDT前言我们知道在一个虚拟化环境中,宿主机的资源(包括CPU cache和内存带宽)都是共享的。但是如果有一个消耗cache的应用快速消耗了L3缓存,或者一个应用消耗了系统大量内存带宽,那么如何保证其他虚拟机应用呢?如何限制这些“可恶”的邻居呢?针对上诉问题,以前都是通过控制虚拟机逻辑资源来实现,但是调整的粒度实在太粗,针对处理器缓存这样敏感而稀缺的资源,几乎是无能为力的。为此英特尔推出了RDT技术,希望可以解决这个问题。2.RDT技术组成RDT技术有其实有5个功能模块,分别是Cache M
2022-05-19 09:18:50
3127
转载 Linux 内核同步:互斥体(mutex)
互斥体互斥体是一种睡眠锁,他是一种简单的睡眠锁,其行为和 count 为 1 的信号量类似互斥体简洁高效,但是相比信号量,有更多的限制,因此对于互斥体的使用条件更加严格:任何时刻,只有一个指定的任务允许持有 mutex,也就是说,mutex 的计数永远是 1给 mutex 上锁这,必须负责给他解锁,也就是不允许在一个上下文中上锁,在另外一个上下文中解锁。这个限制注定了 mutex 无法承担内核和用户空间同步的复杂场景。常用的方式是在一个上下文中进行上锁/解锁。递归的调用上锁和解锁是不允许的。也就
2022-05-06 16:43:38
1456
转载 Linux 内核同步:信号量(semaphore)
信号量Linux Kernel 除了提供了自旋锁,还提供了睡眠锁,信号量就是一种睡眠锁。信号量的特点是,如果一个任务试图获取一个已经被占用的信号量,他会被推入等待队列,让其进入睡眠。此刻处理器重获自由,去执行其他的代码。当持有的信号量被释放,处于等待队列的任务将被唤醒,并获取到该信号量。从信号量的睡眠特性得出一些结论:由于竞争信号量的时候,未能拿到信号的进程会进入睡眠,所以信号量可以适用于长时间持有。而且信号量不适合短时间的持有,因为会导致睡眠的原因,维护队列,唤醒,等各种开销,在短时间的锁定某对
2022-05-06 16:33:49
1676
原创 Linux 内核同步 ---自旋锁(Spinlock)
内核抢占内核抢占的概念:如果进程正在执行内核函数时,即它在运行内核态,允许发生内核切换(被替换的进程是正在执行内核函数的进程),这个内核就是抢占的。抢占内核特点:一个内核态运行的进程,可能在执行内核函数期间被另外一个进程取代自旋锁内核当发生访问资源冲突的时候,可以有两种锁的解决方案选择:原地等待挂起当前进程,调度其他进程执行Spinlock 是内核中提供的一种比较常见的锁机制,自旋锁是“原地等待”的方式解决资源冲突的,即,一个线程获取了一个自旋锁后,另外一个线程期望获取该自旋锁,获取不到,只
2022-05-06 16:14:02
4041
原创 objdump&&ld
$(OUT)/bootblock: bootloader/bootasm.S bootloader/bootmain.c @mkdir -p $(OUT) $(CC) -fno-builtin -fno-pic -m32 -nostdinc -fno-stack-protector -Iinclude \ -Os -o $(OUT)/bootmain.o -c bootloader/bootmain.c $(CC) -fno-builtin -fno-pic -m32 -nostdinc -Iar
2022-04-22 15:04:45
513
转载 简单的页异常流程
本文是基于Linux0.11源码来叙述该功能 取之于互联网 用之于互联网页异常中断处理程序(中断 14),主要分两种情况处理。是由于缺页引起的页异常中断, 这需要通过调用 do_no_page(error_code, address)来处理;是由于页面写保护引起的页异常,此时调用页写保护处理函数 do_wp_page(error_code, address)进行处理。 函数参数中的出错码(error_code)是由CPU 自动产生并被压入堆栈的,出现异常时访问的线性地址是从控制寄存器 CR2
2022-03-25 14:08:21
830
转载 简单的execve流程
本文转载于网络 基于Linux0.11源码来叙述该功能,源码可以在oldlinux.org上自行获取_sys_execve: lea EIP(%esp),%eax #取堆栈中存放系统调用的返回地址的地址 pushl %eax #将该地址入栈 call _do_execve #调用do_execve函数 addl $4,%esp #丢弃该地址 ret这边做了一个很重要的操作就是将堆栈中存放系统调用的返回地址的地址入栈(见下图中的PTR指针),注意这里是堆栈的地址!而非系统调用的返回地址(int
2022-03-24 22:57:21
808
原创 page table 设置及其拷贝
setup_paging: movl $1024*5,%ecx /* 5 pages - pg_dir+4 page tables */ xorl %eax,%eax //eax清零 xorl %edi,%edi /* pg_dir is at 0x000 */ edi 清零 cld;rep;stosl 将标志寄存器flag的方向标志位df清零 重复清零的目的 STOSL指令相当于将EAX中的值保存到ES:EDI指向的地址中,若设置了EFLAGS中的方向位置位(即在STO
2022-03-22 16:59:55
514
原创 linux内核 move_to_user_mode/fork
#define move_to_user_mode() \__asm__ ("movl %%esp,%%eax\n\t" \ 保存堆栈指针 esp 到 eax 寄存器中 "pushl $0x17\n\t" \ 首先将堆栈段选择符(SS)入栈。 "pushl %%eax\n\t" \ 然后将保存的堆栈指针值(esp)入栈。 "pushfl\n\t" \ 将标志寄存器(eflags)内容入栈 "pushl $0x0f\n\t" \ .
2022-03-15 22:41:32
1870
原创 linux 进程页表流程
mm_alloc_pgd() 函数会调用pgd_alloc()会为该进程分配一页(4K)的页全局目录的线性地址并保存在 task_struct->mm_struct->pgd中具体的实现是通过__get_free_pages((gfp_mask), 0)实现的,该函数通过alloc_pages()在低端内存里( 小于896M的空间里)分配一个页描述符(struct page *page),并将该页的页描述符通过page_address()转换成虚拟地址。实际上就是通过__va(PFN_PHY.
2022-03-15 14:01:48
768
转载 linux 内存 缺页异常
产生缺页异常中断的几种情况当内存管理单元(MMU)中确实没有创建虚拟物理页映射关系,并且在该虚拟地址之后再没有当前进程的线性区(vma)的时候,可以肯定这是一个编码错误,这将杀掉该进程当MMU中确实没有创建虚拟页物理页映射关系,并且在该虚拟地址之后存在当前进程的线性区vma的时候,这很可能是缺页中断,并且可能是栈溢出导致的缺页中断;当使用malloc/mmap等希望访问物理空间的库函数/系统调用后,由于linux并未真正给新创建的vma映射物理页,此时若先进行写操作,将和2产生缺页中断的情况一样;若
2022-03-14 13:54:14
1544
转载 Linux进程分配内存的两种方式--brk() 和mmap()
如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看。 majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。 这两个数值表示一个进程自启动以来所发生的缺页中断的次数。发成缺页中断后,执行了那些操作?当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作:1、检查要访问的虚拟地址是否合法2、查找/分配一个物理页3、填充物理页内容(读取磁盘,或者直
2022-03-11 16:55:45
311
转载 ELF文件加载过程
加载和动态链接从编译/链接和运行的角度看,库分为动态链接和静态链接。相应的两种不同的ELF格式映像:1)一种是静态链接的,在装入/启动其运行时无需装入函数库映像、也无需进行动态连接。2)另一种是动态连接,需要在装入/启动其运行时同时装入函数库映像并进行动态链接。Linux内核既支持静态链接的ELF映像,也支持动态链接的ELF映像,GNU规定:1)把ELF映像的装入/启动入在Linux内核中;2)把动态链接的实现放在用户空间(glibc),并为此提供一个称为”解释器”(ld-linux.so.2)
2022-03-09 11:37:11
2379
转载 Multiboot规范
Multiboot规范的精确定义引导程序/OS映像接口主要包括三个方面:引导程序看到的 OS 映像的格式。当引导程序启动操作系统时机器的状态。引导程序传递给操作系统的信息的格式OS映像格式一个OS映像可以是一个普通的某种操作系统使用的标准格式的32位可执行文件,不同之处是它可能被连接到一个非默认的载入地址以避开PC的I/O区域或者其它的保留区域,当然它也不能使用共享库或其它这样可爱的东西。除了OS映像所使用的格式需要的头之外,OS映像还必须额外包括一个Multiboot头。Multiboo
2022-03-02 17:15:47
2011
转载 如何printf输出数字(例如内核64位地址)
d,lx,ld,,lu,这几个都是输出32位的hd,hx,hu,这几个都是输出16位数据的hhd,hhx,hhu,这几个都是输出8位的lld,ll,llu,llx,这几个都是输出64位的更正%llu 是64位无符号%llx才是64位16进制数...
2022-03-01 15:54:09
1371
原创 系统调用代码流程
由用户态进入内核态时,CPU会自动按照SS、ESP、EFLAGS、CS、EIP的顺序,将这几个寄存器的值压入到内核栈中父进程内核栈的样子执行int 0x80将SS、ESP、EFLAGS、CS、EIP入栈。在system_call中将DS、ES、FS、EDX、ECX、EBX入栈。system_call: cmpl $nr_system_calls-1,%eax 调用号如果超出范围的话就在 eax 中置-1 并退出 ja bad_sys_call push %ds #
2022-02-25 17:41:52
951
转载 内核页表和进程页表
初学内核时,经常被“内核页表”和“进程页表”搞晕,不知道这到底是个啥东东,跟我们平时理解的页表有和关系内核页表:即书上说的主内核页表,在内核中其实就是一段内存,存放在主内核页全局目录init_mm.pgd(swapper_pg_dir)中,硬件并不直接使用。进程页表:每个进程自己的页表,放在进程自身的页目录task_struct.pgd中。在保护模式下,从硬件角度看,其运行的基本对象为“进程”(或线程),而寻址则依赖于“进程页表”,在进程调度而进行上下文切换时,会进行页表的切换:即将新进程的pgd(页
2022-02-25 14:55:35
2906
原创 cpu scheduler
一、调度策略调度算法CPU 调度是线程为单位的,一个进程可以包含1个或者多个线程,如果是多个线程,会被分配到不同的cpu运行队列中,如果是1个线程,同一时间只会在一个cpu上允许运行 不同时间则可以被调度到不同的CPU上...
2022-02-24 16:44:28
511
转载 In-depth dive into the security features of the Intel/Windows platform secure boot process
Introduction and System ArchitectureWe must first begin with a brief introduction to the hardware platform. Skip this if you have read the awsome material available on the web about the Intel architecture, I’ll try to briefly summarize it here.The Intel
2022-01-27 10:22:29
1089
转载 Security of the Intel Graphics Stack
General ArchitectureProcessor graphics - The graphics unit that is part of the processoritself. Has had many codenames over the years, HD Graphics, UHDGraphics, Iris, Gen9, Gen11, Intel Xe and so on. Even the ‘Gen’ namehas double meaning - both genera
2022-01-27 09:42:15
402
原创 中断架构-8529A
中断相关概念♦中断源:引起中断的时间 或 发出中断的外设♦分类①外部中断▷可屏蔽中断(INTR引脚,一般是指interrupt的缩写,也就是中断)、 ✔外设 ✔受IF控制,N=8~255 (IF标志位)▷不可屏蔽中断(NMI引脚) (你妈超凶,你必须听) ✔电源,内存错误等 ✔不受IF控制,N=2 ②内部中断 ▷CPU内部 ▷软件中断(指令错误) ▷异常(指令执行时发生错误)●内部中断(异常,E...
2022-01-24 15:49:29
1673
转载 Linux设备驱动——PCI总线的初始化
初始化分析下载kernel代码编译后存在system.map:~/codebase/kernel$ cat System.map | grep pci | grep initcallffffffff89f984f0 t __initcall_pci_realloc_setup_params0ffffffff89f985e4 t __initcall_pcibus_class_init2ffffffff89f985e8 t __initcall_pci_driver_init2ffffffff89
2021-12-27 14:22:40
2124
原创 bootflow for hypervisor
#define SWITCH_TO(rsp, to) { asm volatile (“movq %0, %%rsp\n” “pushq %1\n” .
2021-12-10 11:18:32
261
转载 Linux系统调用 汇编 int 80h
1.系统调用在计算机中,系统调用(英语:system call),又称为系统呼叫,指运行在使用者空间的程序向操作系统内核请求需要更高权限运行的服务。 系统调用提供了用户程序与操作系统之间的接口。大多数系统交互式操作需求在内核态执行。如设备IO操作或者进程间通信。Linux的系统调用通过int 80h实现,用系统调用号来区分入口函数。 操作系统实现系统调用的基本过程是:应用程序调用库函数(API);API将系统调用号存入EAX,然后通过中断调用使系统进入内核态;内核中的中断处理函数根据系统调用号,调
2021-12-09 12:31:44
1837
原创 内存管理--申请空间api
kmalloc/kfree //内存分配物理上连续,只能低端内存分配get_zeroed_page/free_page //分配一个页面并清零,只能低端内存分配_get_free_page/free_pages //分配指定页数内存并清零,只能低端内存分配alloc_pages/_free_pages //分配指定页数内存并清零,可低端内存分配,也可高端内存分配vmalloc/vfree //分配的空间在内核空间连续,物理上无连续,所以性能差,一般只用于大块内存的申请。...
2021-11-30 11:04:59
355
转载 内存管理--linux进程地址管理之mm_struct
无论是内核线程还是用户进程,对于内核来说,无非都是 task_struct这个数据结构的一个实例而已,task_struct被称为进程描述符(process descriptor),因为它记录了这个进程所有的context。其中有一个被称为’内存描述符‘(memory descriptor)的数据结构 mm_struct,抽象并描述了Linux视角下管理进程地址空间的所有信息mm_struct定义在include/linux/mm_types.h中,其中的域抽象了进程的地址空间,如下图所示:每个进程都
2021-11-30 10:56:06
1276
原创 stm32f4-led
int main(void){ LED_Init(); //初始化LED端口 while(1) { GPIO_bits_OUT(GPIOG,13,3,0x0006); delay_ms(500); GPIO_bits_OUT(GPIOG,13,3,0x0005); delay_ms(500); GPIO_bits_OUT(GPIOG,13,3,0x0003); delay_ms(500); }}void LED_Init(void){
2021-09-26 22:37:53
307
原创 关于dpdk 收发包的问题
一: 关于 struct rte_mbuf 描述符的结构体原型/** * Structure associated with each descriptor of the RX ring of a RX queue. */struct igb_rx_entry { struct rte_mbuf *mbuf; /**< mbuf associated with RX descriptor. */};/** * Structure associated with each descr
2021-09-09 21:53:10
702
转载 物理地址和虚拟地址的分布
我们知道了CPU是如何访问内存的,CPU拿到内存后就可以向其它人(kernel的其它模块、内核线程、用户空间进程、等等)提供服务,主要包括:以虚拟地址(VA)的形式,为应用程序提供远大于物理内存的虚拟地址空间(Virtual Address Space)每个进程都有独立的虚拟地址空间,不会相互影响,进而可提供非常好的内存保护(memory protection)提供内存映射(Memory Mapping)机制,以便把物理内存、I/O空间、Kernel Image、文件等对象映射到相应进程的地址空间中
2021-09-09 09:48:14
471
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人