自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 DPDK和MLX5的调试

DPDK版本:20.05(20.05之后启用meson build编译)BUG:在启动testpmd时,报错no probed ethernet devices。testpmd检测不到MLX5。解决办法:x86架构:打开"dpdkdir"/config/common_base文件,配置以下几个参数:CONFIG_RTE_BUILD_SHARED_LIB=nCONFIG_RTE_LIBRTE_IXGBE_PMD=nCONFIG_RTE_LIBRTE_MLX5_PMD=y重新编译

2021-04-26 17:15:08 4263 4

原创 sysbench测试互斥锁参数详解

测试多核同步性能开销时,使用了sysbench来进行互斥锁开销测试。下面是互斥锁开销测试的核心代码。https://github.com/akopytov/sysbench/blob/master/src/tests/mutex/sb_mutex.csb_event_t mutex_next_event(int thread_id){ sb_event_t sb_req; sb_mutex_request_t *mutex_req = &sb_req.u.mute

2021-04-12 16:41:20 442

原创 重装ubuntu系统踩坑集合

显卡驱动问题参考文章:https://blog.csdn.net/Moon2105/article/details/103516501磁盘分区的时候空间一定分大一点!!!

2021-03-25 22:02:48 165

原创 使用lmbench工具测试网卡性能

测试目标测试基于ARM架构的网卡访问L1,L2 Cache和DRAM的latency。lmbench工具查到了很多测试工具,但好像只有lmbench能测试内存延迟,所以就选择了lmbench。如何使用?通过https://nchc.dl.sourceforge.net/project/lmbench/development/lmbench-3.0-a9/lmbench-3.0-a9.tgz下载了lmbench最新版本的代码。由于网卡没有连接上公网,所以不能直接使用wget命令下载,而是使

2020-11-05 22:24:41 1478 2

原创 r2p2之DPDK学习记录(3)

rte_eal_remote_launch(lcore_function_t *f, void * arg, unsigned slave_id)启动另一个逻辑核上的函数。这个函数只会在MASTER逻辑核上执行。向处于WAIT状态(第一次调用rte_eal_init()之后就会处于这个状态)的slave逻辑核上发送消息。WAIT状态可以通过首次调用rte_eal_wait_lcore(slave_id)来检查。当远程的lcore接收到消息,它会切换至RUNNING状态,然后用参数arg调用函数f

2020-10-24 21:42:50 350

原创 r2p2之DPDK学习记录(2)

dpdk函数rte_eth_tx_burst()对于要发送的每个包,rte_eth_tx_burst()函数会执行下列操作:在传输ring中选择下一个可用的描述符。 释放先前与该描述符一起发送的网络缓冲区,如果有的话。 使用*rte_mbuf数据结构中提供的信息初始化传输描述符。static uint16_t rte_eth_tx_burst ( uint16_t port_id, uint16_t queue_id, ...

2020-10-11 12:22:04 1003

原创 r2p2之DPDK学习记录(1)

简单理解DPDK解决的问题是网络IO的性能问题。网卡、CPU等硬件在高速发展,但是软件开发却没有跟上节奏,使得网络IO碰上瓶颈。又因为网络IO实现大都需要通过内核,所以很明显,内核是瓶颈所在。因此,提高网络IO性能的方法着手点就是避开内核。...

2020-09-25 21:41:15 275

原创 Lab6 PartB: Receiving packets and the web server

Receiving Packets就像传输数据包一样,您必须配置E1000来接收数据包,并提供接受描述符队列和接收描述符。3.2节描述了包接收的工作原理,包括接收队列结构和接收描述符,第14.4节中对初始化过程进行了详细说明。Exercise 9.阅读3.2节。您可以忽略关于 interrupts and checksum offloading(中断和校验卸载)的任何内容(如果您决定稍后使用这些特性,您可以返回到这些部分),并且您不必关心details of thresholds(临界值)以.

2020-09-19 20:01:12 157

原创 Lab6: Network Driver PartA--Initialization and transmitting packets

IntroductionGetting Started网卡驱动程序还不足以使操作系统连接到Internet。在新的lab6代码中,已经提供了一个网络堆栈和一个网络服务器。探索net目录下的内容和kern/中的新文件 。除了编写驱动程序之外,还需要创建一个系统调用接口来访问驱动程序。你将实现缺失的网络服务器代码在网络堆栈和驱动程序之间传输数据包,还将通过完成web服务器将所有内容联系在一起。使用新的web服务器,你将能够从文件系统中服务文件。大部分的内核设备驱动程序代码都必须自己从头编写。

2020-09-17 11:07:52 205

原创 Lab5(2): File system, Spawn and Shell

Spawning Process我们已经给出了spawn的代码(可见lib/spawn.c)。它创建了一个新环境,从文件系统加载一个程序映像到其中,然后启动运行这个程序的子环境。父环境然后独立于子进程运行。spawn函数实际上就像一个fork,在子进程中马上执行exec.我们实现spawn而不是一个UNIX-style的exec,是因为spawn更容易从用户空间以“exokernel fashion(外内核方式?)”实现,不需要内核的特殊帮助。为什么在用户空间实现exec更难?Exercise

2020-09-06 14:19:21 238

原创 Lab 5(1): File system, Spawn and Shell

Introduction在这个lab中,将实现spawn,这是一个库调用,用于加载和运行磁盘上的可执行文件。然后,你将充实内核和库操作系统以便在控制台上运行shell。这些特性需要一个文件系统,这个lab介绍了一个简单的读/写文件系统。...

2020-08-30 18:17:35 335

原创 Lab4 PartC: Preemptive Muiltitasking and Inter-Process communication

在lab4的这一部分,将修改内核以抢占不合作的,并允许环境之间显示地传递消息。时钟中断和抢占(Clock Interrupts and Preemption)运行user/spin测试程序。这个测试程序fork出了一个子环境,它一旦接受了CPU的控制,就会在一个紧密的循环中永远旋转,父环境和内核都不会重新获得CPU。这显然不是保护系统不受bug或恶意代码影响的理想情况,因为任何用户模式环境都可能仅仅通过进入一个无限循环并且不返回CPU的操作就使得整个系统停止。为了允许内核抢占一个正在运行的环境,强制

2020-08-23 21:39:04 220

原创 Lab4 PartB: Copy-on-Write Fork

如前所述,Unix提供fork()系统调用作为其主要的进程创建原语。fork()系统调用复制调用进程(父进程)的地址空间以创建一个新进程(子进程)。xv6 Unix通过将父页面的所有数据复制到为孩子分配的新页面中来实现fork()。这基本上与dumbfork()所采用的方法相同。将父级地址空间复制到子级是fork()操作中最昂贵的部分。然而,在调用fork()之后,通常会立即调用子进程中的exec(),这将用一个新程序替换子进程的内存。例如,这就是shell所做的事。在这种情况下,花费在复制父进程地

2020-08-21 21:15:42 390

原创 Lab4 PartA Multiprocessor Support and Cooperative Multitasking

Introduction在本实验中,将在多个同时活动的用户模式环境中实施抢占式多任务处理。在PartA中,将为JOS添加多处理器支持,实现循环调度,并添加基本的环境管理系统调用(创建和破坏环境的调用,已经分配/映射内存的调用)。...

2020-08-18 21:33:31 253

原创 Homework 7: xv6 locking

在本作业中,将探索中断和锁的相互作用。确保自己理解如果xv6内核执行下列代码碎片会发生什么: struct spinlock lk; initlock(&lk, "test lock"); acquire(&lk); acquire(&lk);用一句话介绍发生了什么:会产生panic("acquire")。Interrupts in ide.cacquire确保在本地处理器上通过cli指令(通过pushcli())关闭中断。并且这个中断一直保持关

2020-08-15 10:57:55 782

原创 Homework6: Threads and Locking

在本作业中,将探索使用哈希表进行线程和锁的并行编程。下载ph.c, 使用下图命令,得到结果。每个线程分两个阶段运行。第一阶段,每个线程把NKEYS/nthread个键放到哈希表中。在第二阶段,每个线程从哈希表中获取NKEYS。打印语句告诉我们每个线程的每个阶段需要多长时间。底部的完成时间是应用程序的总运行时间。为了查看使用两个线程是否提高了性能,我们与一个线程相比较。嘿,咋用时还差不多了?反正性能是没显著提高了。仔细翻开官方提示,说要用多核处理器,我的虚拟机是单核的,于是我改成双核,

2020-08-11 17:40:59 1223

原创 Homework5: xv6 CPU alarm

在本练习中,将在xf6中添加一项功能,当进程使用CPU时间时,它会定期向进程发出警报。这对于希望限制占用多少CPU时间的受计算限制的进程,或者希望进行计算但又希望采取一些周期性操作的进程可能很有用。更一般地说,您将实现用户级中断/故障处理程序的原始形式;例如,您可以使用类似的东西来处理应用程序中的页面错误。需要添加一个新的alarm(interval, handler)系统调用。如果一个应用程序调用了alarm(n,fn), 那么在程序消耗每个n“ticks”的CPU时间之后,内核将调用应用程序函数fn

2020-08-11 11:36:05 648

原创 Lab3 PartB Page Faults, Breakpoints Exceptions, and System Calls

Exercise 5 Handing Page Faults缺页中断(中断向量14 T_PGFLT)在这个和后续的实验中都极其重要。当处理器发生缺页中断时,它将会把把造成这个错误的虚拟地址存到控制寄存器CR2中。在trap.c中已经提供了一个函数page_fault_handler(),处理缺页中断。Exercise 5: 修改trap_dispatch(),将缺页错误引导到page_fault_handler()函数上执行。运行 make grade,出现的结果应该是你修改后的 JOS 可以成功运

2020-08-10 17:32:44 226

原创 Lab3 PartA: User Environments and Exception Handing

Exercise1Allocating the Environments Array修改在kern/pmap.c文件中mem_init()函数的代码,使其能分配和映射envs数组。这个数组完全是由NENV个ENV结构组成的。支持envs所在的内存空间也应该在UENVS虚拟地址处(定义在inc/memlayout.h)被映射成用户只读。在lab2中,在mem_init()中分配了内存给page[]数组,它记录了内核中哪些页是空闲的哪些页不是。需要做的是修改mem_init函数,分配一个Env结构数

2020-08-07 16:46:48 381

原创 MIT6.828 Homework4: xv6 lazy page allocation

操作系统可以在页表硬件上玩的许多巧妙的把戏之一是堆内存的惰性分配。Xv6应用程序使用sbrk()系统调用向内核请求堆内存。在我们给你的内核中,sbrk()分配物理内存并将其映射到进程的虚拟地址空间。有些程序分配内存,但从不使用它,例如实现大型稀疏数组。复杂的内核会延迟每个内存页面的分配,直到应用程序尝试使用该页面——这是由页面错误发出的信号。在本练习中,您将把这个惰性分配特性添加到xv6中。Part One: Eliminate allocation from sbrk()实验内容修改...

2020-08-03 21:22:21 1247

原创 MIT6.828 Homework3 xv6 system calls

Part One: System call tracing任务是修改xv6内核,使得每一次系统调用打印出一行代码,格式为:系统调用名称->系统调用返回值样例:fork -> 2exec -> 0open -> 3close -> 0$write -> 1 write -> 1实验过程在github上下载xv6-public的代码并进入该目录下。vim syscall.c根据注释可知系统调用number在%eax里,也就是说sy

2020-08-03 10:55:27 1320

原创 Lab2 PART3 Kernel Address Space

阅读了官网里lab2 part3内核地址空间的部分内容,发现自己搞混了内核地址空间和内核。我的理解是,从

2020-07-31 17:37:51 189

原创 LAB2 PART2 Virtual Memory

Exercise 2阅读手册有关于虚拟内存的部分。主要是这张图。主要理解分页部分,(各大教材都有,这里就不赘述了)也就是线性地址转换成物理地址的部分。需要注意的是:这是一个二级页表。Exercise 3 通过GDB,我们只能通过虚拟地址来查看内存所存放的内容,但是如果我们能够访问物理内存的话,肯定会更有帮助的。我们可以看一下QEMU中的一些常用指令,特别是xp指令,可以允许我们去访问物理内存地址。 在当前终端执行make qemu-gdb指令,打开qemu。另开一个终...

2020-07-31 10:27:25 189

原创 Lab2 PART1 Physical Page Management

引言在本实验中,将为操作系统编写内存管理代码。内存管理有两个组件。 第一个组件是内核的物理内存分配器,这样内核就可以分配内存并在以后释放它。分配器将以4096字节为单位运行,称为页面。任务是维护数据结构,记录哪些物理页面是空闲的,哪些是已分配的,以及有多少进程共享每个已分配的页面。还将编写分配和释放内存页面的例程。内存管理的第二个组成部分是虚拟内存,它将内核和用户软件使用的虚拟地址映射到物理内存中的地址。当指令使用内存时,x86硬件的内存管理单元(MMU)会参考一组页表来执行映射。在这一part

2020-07-29 20:49:16 204

原创 Homework1: boot xv6 && Homework2: Shell

Homework1: boot xv61.获取xv6源emiko@emiko-virtual-machine:~/firstlab$ git clone http://github.com/mit-pdos/xv6-public.gitemiko@emiko-virtual-machine:~/firstlab$ cd xv6-publicemiko@emiko-virtual-machine:~/firstlab/xv6-public$ make2.寻找_start地址,就是内核的入口

2020-07-27 20:35:28 633

原创 MIT6.828 Lab1 Part3 The kernel Exercise 12

Exercise 12问题1:debuginfo_eip函数中的_STAB_*来自哪里?打开文件kern/kernel.ld,可以看到.stab段和.stabstr段。__STAB_BEGIN__,__STAB_END__,__STABSTR_BEGIN__,__STABSTR_END__符号分别代表.stab段和.stabstr段开始与结束的地址,在kernel.ld文件中均有定义。/* Include debugging information in kernel memory */ .

2020-07-22 16:38:00 383

原创 MIT6.828 LAB1 PART3 The Kernel

Exercise 7实验内容一、使用Qemu和GDB去追踪JOS内核文件,并且停止在movl %eax, %cr0指令前。此时看一下内存地址0x00100000以及0xf0100000处分别存放着什么。然后使用stepi命令执行完这条命令,再次检查这两个地址处的内容。确保你真的理解了发生了什么。二、如果这条指令movl %eax, %cr0并没有执行,而是被跳过,那么第一个会出现问题的指令是什么?我们可以通过把entry.S的这条语句加上注释来验证一下。实验过程一、在0x001.

2020-07-21 17:23:35 255

原创 MIT6.828 LAB1 PART2.2 The Boot loader

加载内核ELF文件由三大部分组成:一个带有加载信息的文件头,程序段表和程序段。每一个程序段是一块连续的代码或数据。bootloader的工作是把程序段加载到内存中。程序段表中列出了要加载到内存中的所有段。通过命令 objdump -h obj/kern/kernel 考察JOS内核中所有段的名字大小和地址,如下所示。VMA字段是链接地址,指的是这个段希望被存放到的逻辑地址。LMA字段是加载地址,表示的是这个段被加载到内存后的物理地址。Sections:Idx Name Si

2020-07-14 17:02:51 221

原创 MIT6.828 LAB1 PART2.1The Boot Loader

实验内容 PC机的软盘和硬盘被划分为固定的512字节的扇区(sector)。扇区是磁盘的最小传输粒度:每个读或写操作的大小必须是一个或多个扇区。第一个扇区称为the boot sector引导扇区,从引导扇区加载操作系统。当BIOS找到可以启动的软盘或硬盘之后,这个512个字节的启动扇区就会被加载到内存,地址为0x7c00~0x7dff区域。 bootloader程序的大小必须是小于512个字节的。bootloader由一个汇编文件boot/boot.S以及一个C语言文件bo...

2020-07-12 16:20:03 234

原创 MIT6.828 LAB1 PART1 PC Bootstrap

在用gdb的si命令追踪指令之前,积累了以下一些知识(简单记录)gdb环境下可以看到PC启动后运行BIOS的第一条指令[f000:fff0] 0xffff0: ljmp $0xf000,$0xe05bgdb执行si命令后,跟踪到了BIOS执行的几条指令(gdb) si[f000:e05b] 0xfe05b: cmpl $0x0,%cs:0x6ac80x0000e05b in ?? ()(gdb) si[f000:e062] 0xfe062: j...

2020-07-02 10:58:31 255

原创 MIT6.828实验环境配置

MIT6.828 lab1搭建实验环境1.0 Ubuntu:使用linux操作系统2.0 安装git3.0 使用命令行创建了一个目录 /6.828,在该目录下初始化一个git仓库~/6.828$ git init4.0 JOS系统源码clone到本地~/6.828$ git clone https://pdos.csail.mit.edu/6.828/2017/jos.git lab5.0 打开lab文件,编译代码~/6.828/lab$ make发现报错,因此要安装QEMU这个仿

2020-06-14 17:08:46 2141 5

空空如也

空空如也

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

TA关注的人

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