自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

太初有道

滴水穿石

  • 博客(69)
  • 资源 (3)
  • 收藏
  • 关注

原创 ringbuff 代码实现

RingBuff

2023-12-08 14:44:03 87

原创 【ringbuff & share mem】

ringbuff 和share mem 结合

2023-10-08 19:21:16 153

原创 【eventfd使用案例】

evenfd 使用

2023-02-27 20:46:16 308

原创 c++ 线程池实现生产者消费者

C++ 线程池

2022-11-08 09:18:06 449

原创 GPU渲染原理

GPU渲染

2022-06-10 11:15:17 1582

原创 命名管道实现进程同步

进程间通信

2022-06-01 15:05:37 270

原创 Nsight软件简介

NsightNsight包含以下三部分Nsight Systemcpu threads每个线程运行的情况和使用率cpu的状态OS runtime librarys的使用情况(file、io、pthread)api 的使用情况(cuda/cuDNN/cuBLAS/TensorRT)OS runtime library识别每个调度周期内那些进程被blocked,并分析原因显示api的调用栈,blocked的函数位置cuda api跟踪api 的调用栈信息locate 对应的cuda w

2022-05-07 16:10:59 4690

原创 perf工具使用

perf研究总结最近在天数搞一个性能的工具,需要抓callstack 包括用户态和内核的太调用栈,那么就顺便研究了一下perf工具。做了一个简单的总结。perf --help显示具体的命令,每个命令如何使用,再perf cmd --help会显示参考链接参考链接1参考链接2ubuntu安装perf工具Ubuntu:apt install linux-tools-commonperf 原理Perf通过系统调用sys_perf_event_open 陷入到内核中,内核根据perf 提供的信

2022-05-07 16:03:34 2024

原创 kernel调度(2)----主调度器和周期性调度器

进程切换的前提条件设置TIF_NEED_RESCHED的时机其实在任务做切换的时候,首先要判读task_struct 中的thread_info中的flag 变量是否设置了TIF_NEED_RESCHED这个标记,如果设置了,才有可能被切换,否则这个线程还会一直运行。下面是thread_info中的变量:那么在什么时候去设置这个标记呢?其实主要在以下时机进行:(1)scheduler_tick 时钟中断函数内设置这里以cfs调度为例,代码流程如下图所示,这里就不做详细的流程介绍了也就是在时钟中

2022-01-30 10:01:58 1809

原创 用芯探核读书笔记--第一章启动分析

第一章内核启动分析(1)内核启动的第一入口vmlinux(非压缩内核):arch/mips/kernel/head.S 中的 kernel_entry–>start_kernelvminuz(压缩内核):rch/mips/boot/compressed/head.S 中的 start 标号–>start_kernel(2)第一入口的作用1:具体 CPU 类型相关的初始化;2:设置主核协处理器 0 的初始 Status 寄存器;3,清零.bss 段(未初始化全局数据段,位于__bss

2021-11-22 09:29:25 1014

原创 kernel调度(1)----基本知识介绍

调度简介最近在学习linux 内核调度相关的知识,也看了好多文章,内核代码,下面就学习的内容做个梳理,有助于自己的记忆,可能有的地方自己理解不对,希望多多指教。下面就从几个基本概念开始。什么是调度有过点操作系统知识的人都知道,调度的工作主要就是完成操作系统内进程切换的过程,让多个进程多个任务可以轮流的使用cpu的资源。那么在这个过程中涉及到很多调度相关的概念。下面就从这些简单的概念开始调度的对象–线程进程和线程的概念这里就不再详细的说,大家都知道。其实在内核里面,对于调度来说是不分进程还是线程概念

2021-11-21 18:16:56 1855

原创 UEFI中的Fd文件

uefi二进制文件fduefi 在编译最后会生成一个可以烧进rom里面的.fd文件。这个文件是根据fdf文件生成的。下面详细介绍一下fd文件中的内容都是怎么存放的。fd文件格式描述一个FD(Flash Device binary image),它就是一个二进制镜像文件,其中包含多个FV文件;一个FV(Firmware Volumes),它是FD的组成模块,每一个模块有一个特定的功能,比如FVMAIN通常包含的是DXE、BDS阶段的代码,它通常是被压缩过得,FV Recovery包含SEC和PEI阶段的

2021-06-21 16:37:13 4781 1

原创 内核报reet ehci 问题分析

问题环境:a:硬件环境:3C5000L 双路服务器b:软件内核版本:linux-4.19.167-next问题现象:系统启动过程中和启动之后,bmc kvm 没有连接的情况下,内核不断的打印usb 1-3: reset high-speed USB device number 2 using ehci-pci如下图所示:连接上以后,就不再报了。问题定位:根据以上现象,查看内核代码得知,这个打印是在函数hub_port_init 内打印出来的,代码如下:追踪函数的调用关系得知,调用关系

2021-06-02 11:30:04 2463 1

原创 linux下usb 驱动

USB博大精深不是一篇文章就能够解释清楚的。想要深入研究USB的话,USB协议(外加Host和OTG协议)是必要的知识,另外,国内有本<<USB那些事>>也写的很好很详细,唯一美中不足的就是写得太详细了反而感觉思路架构不是很清晰了。今天我们来简单地把USB在Linux里的结构框架大致整理下,其中重点解析下USB Core和Hub。0. 预备理论说实话,读USB协议还是蛮痛苦的,它仅仅是一个协议,一个在USB世界里制定的游戏规则,就像法律条文一样,它并不是为了学习者而写的,可读

2021-06-02 11:20:03 6215

原创 linux下usb 抓包方法和数据分析

linux下的usb抓包方法配置内核使能usb monitor:1.make menuconfigDevice Drivers -->USB Support -->USB Monitor --> Select * not M2、build kernelsudo insmod /lib/modules/3.2.1/kernel/drivers/usb/mon/usbmon.ko也可以在系统下安装usbmon 包,比如centenos yum install usbmon3、

2021-05-15 16:14:18 2826

原创 读书笔记(11)—— kernel 全局开关中断

全局开关中断特点:通过结合使用本地开关中断和自旋锁来实现主要API全局关中断:cli()全局开中断:sti()大读者锁是对读者自旋锁的改进,它将读者所使用的数据结构分开放到不同的cache上面,避免缓存颠簸。(缓存颠簸:)主要API读者加锁操作:br_read_lock()读者解锁操作:br_read_unlock()写者加锁操作:br_write_lock()写着解锁操作:br_write_unlock()与中断开关结合使用的:br_read_lock_bh()/br_read_

2020-12-25 09:25:49 513

原创 读书笔记(10)—— kernel 完成量

完成量完成量特点自旋锁信号量在内的各种锁类机制都有一个共同的特点即加锁者和解锁者必须是同一个进程,而完成量不同,A进程加锁,B进程解锁的同步原语操作,主要用于进程间通信。数据结构struct completion { unsigned int done; wait_queue_head_t wait;}其中done字段表示完成状态,wait字段代表等待队列。工作原理就是:A进程将done设置为未完成,然后将自己挂接到wait队列上并进入睡眠(类似于信号量的加锁操作down),B进程完

2020-12-24 10:34:31 201

原创 读书笔记(9)—— kernel RCU

RCU原理RCU特点:RCU全称Read Copy Update 读复制更新,是一种完全不同于锁的并发控制机制。主要保护的对象:动态申请的内存,即指针变量。是扩展性最好的并发控制机制。RCU主要适用于读者多,写着少的场景不像锁那样将进程串行化来保护资源,是允许进程并发的。在一些必须串行化才能保护临界区的场景RCU是不适合使用的。RCU只能保证每个读者读到的数据是有效的,但是不能保证每个数据是最新的。大量的copy数据,占用了大量的内存,极端情况下可能会出现OOM(out of memory)的

2020-12-24 10:27:41 891

原创 读书笔记(8)—— kernel 互斥量

互斥量从功能上讲,互斥量等价于二值信号量。然而用信号量来做互斥量有点大材小用,并且由于信号量的内存足迹(Foot Print)比较大,不利于性能优化。因此,Linux-2.6.16 开始专门引入了互斥量 Mutex。其数据结构定义如下:struct mutex { atomic_t count;spinlock_t wait_lock;struct list_head wait_list;#ifdef CONFIG_MUTEX_SPIN_ON_OWNERstruct task_struct *

2020-12-24 10:19:08 166

原创 读书笔记(7)—— kernel 信号量

信号量Linux 内核中应用最广泛的同步原语除了自旋锁就是信号量(Semaphore)。可以说自旋锁和信号量在很大程度上是一种互补的关系,它们有各自适用的场景,两者的场景加起来基本上可以覆盖一切内核中的所有场景。信号量可以是多值的(多值信号量),当其为二值信号量(只有两个值)时,类似于锁:一个值代表未锁,另一个值代表已锁。其工作原理与自旋锁最大的不同在于:获取锁的进程(内核的一个执行路径),若不能立即得到锁,就会发生调度转入睡眠;另外的进程释放锁时,唤醒等待该锁的进程。前面已经说过自旋锁的使用的限制主

2020-12-24 10:18:03 425

原创 读书笔记(6)—— kernel 顺序锁

顺序锁读写自旋锁是对普通自旋锁的改进,它对锁的竞争者进行了区分,允许多个读者同时进入临界区。但是读写自旋锁并没有区分读者和写者的重要性(优先权),因此带来一个新的问题:大量的读者持有读锁的时候,写者可能需要等待很长时间,直到所有读者都退出临界 区以后才能得到写锁。顺序锁就是为了解决这个问题来设计的,它同样适合读者多而写者少的场景,但是赋予了写者比读者高的优先权。顺序锁的数据类型定义如下:typedef struct {struct seqcount seqcount; spinlock_t lock

2020-12-24 10:16:18 127

原创 读书笔记(5)—— kernel 自旋锁

自旋锁自旋锁 Spinlock 是 Linux 内核中使用最广泛的同步原语。具有以下基本特征:1,获取锁的过程(即上锁的过程)是自旋(自旋就是忙等的意思)的,不会引起当前进程睡眠和调度。也就是说,当前进程一直出于活动状态中。2,持有自旋锁的临界区中不允许调度和睡眠,因为一旦发生调度,临界区什么时候能够继续运行是不确定的(什么时候解锁是不确定的),这会导致其他竞争者死锁。因此,自旋锁的加锁操作会禁止抢占,解锁操作时再恢复抢占。也因此,自旋锁既可以用于进程上下 文,又可以用于中断上下文。自旋锁的主要用途

2020-12-24 10:14:25 465

原创 读书笔记(4)—— kernel 开关抢占

开关抢占开关抢占主要面向单处理器系统上的并发控制。单处理器上不存在真正的并发执行,宏观上 表现出来的并发实际上是交错执行的。单处理器系统上的并发主要是异常/中断和抢占导致的。 异常/中断具有高优先级,会打断当前上下文,转入另外一个上下文环境去执行另一个内核路径。即便没有异常/ 中断,进程也有优先级高低之分,高优先级进程抢占低优先级进程同样会导致内核执行路径的切换。不同的上下文之间如果存在共享资源,那么就必须进行并发控制。在不加控制的情况下,硬中断上下文可以抢占软中断上下文和任意进程上下文的执行,软中断上下

2020-12-24 10:13:25 226

原创 读书笔记(3)—— kernel每CPU变量

每CPU变量为了减少不必要的共享,从而减少不必要的并发控制达到增强内核的性能和稳定性。每 CPU 变量就是为了达到这种目的而设计的,每个 CPU 都拥有一个同名的本地变量副本。在概念上,每 CPU 变量类似于一个长度为 CPU 个数的普通数组,比如:current_task[NR_CPUS];每个 CPU 根据自己的编号引用数组里面属于自己的元素:CPU0 用 current_task[0],CPU1 用 current_task[1],CPU2 用 current_task[2],但是每 CPU

2020-12-24 10:12:28 984

原创 读书笔记(2)—— kernel 原子操作

原子操作如果共享资源(临界区)非常小,小到只有一个变量的话,就可以不用重量级的加锁- 解锁操作,而是直接使用原子操作。原子操作意味着整个操作的执行过程是原子的,不可中断的。原子操作分为以下几种,下面一一介绍:(1)通用原子操作Linux 内核定义了 32 位的原子变量类型 atomic_t 和 64 位的原子变量类型 atomic64_t,另外还有 atomic_long_t,在 32 位内核中等价于 atomic_t 而在 64 位内 核中等价于 atomic64_t。其代码如下:typede

2020-12-24 10:10:59 1327

原创 读书笔记(1)—— kernel 屏障问题

内核中的同步和并发其实并发和同步是操作系统设计中的一个核心问题,随着CPU的发展,多核多线程已经成为了主流,因此并发和同步是操作系统和内核开发者必须面临的问题。其实并发包括两类:一类是真正的同时发生, 在宏观尺度和微观尺度上都是并行执行的,这是多核CPU多级流水的情况;另一类是时分复用导致的交错发生,并不是真正的并发。在宏观尺度上是并行 但在微观尺度上是串行,这是单核处理器,只有一个流水线在执行。不管是哪类并发,都存在一个共享资源(临界区)保护的问题。临界区保护通常采用的手段就是串行化,其中最常见

2020-12-24 10:09:21 609

原创 UEFI实现支持多个串口同时输入输出

龙芯平台的实现方式最近配合BMC在调试sol功能,需要将bios启动的log输出到bmc的uart设备上,然后在bmc上需要将对应串口的数据远程输出到网页端,也就是实现远程管理bios的功能。当然这个串口需要同时支持输入和输出操作。由于在龙芯平台,默认debug的串口使用的串口是cpu内部的。当cpu初始化完成基本的配置后,就回去初始化这个串口当作调试串口。当然每一个调试人员都了解如果没有debug的串口,那么调试程序的时候有多么的不方便。现在由于需求,需要同时支持cpu的串口和bmc的串口均支持输入和输

2020-12-02 20:35:14 2419

原创 调试 intel 82580网卡在intel 8632 switch下扫不到的问题的收获

最近在调试intel 82580这款网卡在8632 switch下扫不到的问题。耗时了三个星期的时间,在这个过程中真的是学到了很多,所以还是决定将这些都记录下来吧。因为漫漫长河中,我们终将会将一些事遗忘。问题现象硬件环境: G1控制器(00:11:00) | 8632桥(03:00:00) ...

2019-12-06 20:23:23 806 2

原创 UEFI下如何在C语言嵌入汇编

UEFI下如何在C语言内嵌入汇编有两种方法:分别是以内嵌汇编的形式和直接就是汇编的形式存在,内嵌汇编不够灵活,而且代码的可读性和维护性都比较差,强烈推荐第二种方式。内嵌汇编的形式 __asm__ __volatile__( ".set_noa...

2019-12-06 20:21:25 859

原创 如何查看内核的调用栈

如何查看函数的调用栈也就是根据当前cpu内寄存器的值,如何反推函数的调用栈,这种调试方法在内核调试过程中是很常见的,也算是常用的技巧。这个在追查死机等问题,可以用的上。(1)通过ejtag来读取当前pc的地址以及sp,ra寄存器的信息首先,我们的机器起来以后,我们用ejtag调试工具查看一下当前的寄存器的内容如下:cpu0 -set#setzero:0x0 at:0x5400cce1 ...

2019-12-06 20:12:43 2316

原创 反汇编及连接工具

######################################################################## this is a disassembly tool,convenient to debug## input Params:# $1: filename :*.dll that you want disassembly...

2019-08-16 14:25:54 584 3

原创 读书笔记之PCI Express体系结构导读

第一章 PCI总线的基本知识PCI总线概念PCI(Peripheral Componnent Interconnect)在处理器体系结构中属于局部总线,局部总线作为系统总线的延伸,其主要的功能就是连接外部设备。随着处理器主频的不断提升,就要求速度更快带宽更高的局部总线。起初PC采用8位的XT总线作为局部总线,后来很快升级到16位的ISA(Industry Stadnard Architectu...

2019-07-20 11:12:55 2330

原创 32位和64位的那些事

32位和64位的那些事在我们日常使用和在编程中,常常涉及到32位机器64位机器以及32位操作系统和64位操作系统还有32位编译器和64位编译器等等相关的问题。这些问题经常让人迷糊,现在就这些问题,做一个简单的总结,希望对读者们有用。程序运行的平台个人理解(不知道对不对啊)程序运行的平台是由:处理器+OS(操作系统)+compiler(编译器来决定)三者组成的,下面将处理器简称位CPU,操作...

2019-07-20 11:10:46 450 1

原创 UEFI中的PCI设备扫描及分配Mem/Io空间过程

最近在调试解决PCI设备相关的问题,然后对UEFI下面的这部分实现有了初步的了解,为了防止后面慢慢的又忘记了,所以还是决定将最近的收获都记录起来,各位读者如果发现哪里记录或者总结的不对,欢迎留言指正。PciHostBridgeDxe这个驱动是为pci bus驱动执行做前期准备的驱动,在这个驱动里面主要是建立相应的软件结构来描述Host主桥,以及注册一些protocol是为pci bus 驱动使...

2019-07-03 19:04:28 10198

原创 uefi的几种文件格式(.fdf .dec .dsc .inf)

在uefi 中fdf文件和dsc文件以及dec文件还有inf文件是每一个做uefi的人最开始接触的文件,那么这些文件到底有什么作用?以及文件中每个字段的意义又是什么呢?现在就让我们一个文件一个文件的看吧!(本文的所有内容都来自于uefi de spec,如果想详细了解spec中的内容,请自己参阅spec,本文只是自己在阅读过程中将重点记录下来)首先看一下uefi中的几种名词解释:HIIH...

2019-05-09 11:27:08 6823

原创 uefi中Sec阶段和Pei阶段的启动分析

本文的启动分析是基于龙心3A2000+780E桥片的处理器的。首先:SEC(安全性)阶段:系统开始执行第一条指令,这时的Memory没有被初始化。主要工作是建立临时的Memory,它可以是处理器的Cache,或是systemStaticRAM(SRAM)。另外,SECPhase需要知道一些早期的内存被映射到的位置以及BFV(BootFirmwareVolume)的位置。P...

2019-05-09 11:24:22 9353

原创 Grub调试总结

最近在龙芯平台调研Grub的实现,在这过程中仔细研究了Grub的代码,就做个总结吧!首先Grub在uefi上也是以一个Grub.efi的方式运行的,但是这个efi是放在操作系统下面的boot/EFI/下面的,uefi在运行过程总后期加载Grub的时候会去这个目录load这个Grub模块。load到内存之后,就开始执行。这里面不做详细的介绍是如何load以及如何运行的,这部分内容都在uefi中有源...

2019-05-09 11:20:29 4924

原创 计算机系统启动过程分析

本文基于MIPS架构龙芯3号处理器为例,介绍启动过程。启动过程分析无论采用何种指令系统的处理器,复位后的第一条指令都会从一个预先定义好的特定地址去取指。处理器的执行就从这条指令开始。处理器的启动过程实际上就是一个特定程序的执行过程,这个程序被成为固件,也就是BIOS,现在主流的BIOS都是采用UEFI软件架构。龙芯也自己研制了在MIPS架构上的UEFI版本。龙芯3号处理器的上电执行的第一条指令...

2019-03-02 15:53:34 1573 1

原创 读书笔记之计算机体系结构

知识要点此文章内容摘抄自计算机体系结构基础(胡伟武著),有些地方可能介绍的不是很详细,如果读者想仔细的了解,请自己阅读原著。第二章 指令系统无论是在什么架构上,都有自己的指令系统,如x86采用的是复杂指令集,而ARM/PowerPc等架构均采用的是精简指令集,这里面提到的指令集就是所谓的指令系统。因此不同平台上的要实现同样功能的指令可能会大部相同。指令是介于软件和硬件之间的桥梁,对于一个程序...

2019-03-02 14:11:47 1044

原创 start_kernel()之setup_arch()函数详解

该函数主要是根据处理器硬件平台具体的机器型号来设置系统。解析Linux系统的命令行,设置0号jin cheng 的内存描述结构init_mm,系统内存管理初始化,统计并注册系统各种资源,以及其他杂项的初始化功能。注意这个函数在具体的硬件平台上是有所差别的,我们这里以ARM平台为例开始讲解。下面是代码:void __init setup_arch(char **cmdline_p){_...

2019-02-25 06:41:22 1719

usb-spec-20.tar

usb-spec-20.tar

2021-06-02

AST2500手册,有需要可以看看

AST2500手册,有需要可以看看

2021-01-07

UEFI原理和编程

UEFI开发人员可参考,UEFI开发人员可以参考阅读,国内现在比较流行的代替原来的bios的软件。

2017-11-25

空空如也

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

TA关注的人

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