- 博客(254)
- 资源 (23)
- 收藏
- 关注
原创 OpenSBI qemu risc-v virt machine平台
QEMU RISC-V Virt Machine PlatformQEMU RISC-V Virt Machine 是为 RISC-V 软件开发和测试而创建的虚拟平台。它也被称为 QEMU RISC-V VirtIO 机器,因为它使用 VirtIO 设备进行网络、存储和其他类型的 IO。要构建特定于平台的库和固件映像,在顶层的make命令使用PLATFORM=generic参数.Platform OptionsQEMU RISC-V Virt Machine平台没有任何平台特定的选项。编
2022-03-16 21:46:42
3481
原创 OpenSBI平台固件的区别
OpenSBI平台固件 OpenSBI提供了针对特定平台的固件构建。支持不同类型的固件来处理不同平台早期启动阶段的差异。所有的固件都会根据平台特定的代码以及OpenSBI通用库代码执行平台硬件的相同的初始化过程。所支持的固件类型将因平台早期引导阶段传递的参数的处理方式以及固件之后的引导阶段的处理和执行方式而有所不同。早期的启动阶段将通过RISC-V CPU的以下寄存器传递信息: hardid通过a0寄存器传递。 通过a1寄存器在内存中的设备树blob地址。地址必须对齐到8个字节。..
2022-03-16 13:35:25
1521
1
原创 8.4 自制操作系统: risc-v Machine寄存器 mip/mie
mip全称Machine Interrupt-Pending Registermip寄存器是一个MXLEN-bit的读/写寄存器,包含了挂起中断的信息mie全称Machine Interrupt-Enable Registermie寄存器是第一个的MAXLEN-bit位的读写寄存器,包含允许中断位mie和mip的bits[15:0]是分配给标志中断的。bits[16:MAXLEN-1]是用户自定义。如下图红色框所示。如果中断i想陷入M模式,必须
2022-03-11 15:10:01
2675
原创 8.3 自制操作系统: risc-v Machine寄存器 mtvec/medeleg/mideleg
mtvec全称Machine Trap-Vector Base-Address Register机器陷阱向量基地址寄存器1.mtvec必须是被实现的2.边界必须4字节对齐,MODE域的实现,可能会增加额外的对齐条件例如当Mode=vectored时,在机器模式下发送timer中断时,pc将被设置为BASE+0x1c.medeleg和medeleg全称Machine Trap Delegation Registers机器陷阱代理寄存器medeleg: mac..
2022-03-09 11:48:17
3663
原创 8.2 自制操作系统: risc-v Machine寄存器说明mstatus和mstatush
机器模式下的CSRs 寄存器名字 全称 权限 功能 描述 misa Machine ISA Register misa WARL read-write ...
2022-03-09 11:41:19
5725
2
原创 8.1 自制操作系统: risc-v 控制和状态寄存器(CSRs)
系统主要操作码用于对RISC-V ISA中所有特权指令进行编码。主要被分为两类原子read-modify-write控制和状态寄存器(CSRs), 被定义在Z扩展中。标准CSRs对于读没有副作用,但是可能对于写可能有影响。1.CSR地址映射的约定标准RISC-V ISA为多达4,096个csr留出12位编码空间(csr[11:0])。按照约定,CSR地址的前4位(CSR[11:8])根据权限级别对CSR的读写可访问性进行编码,最上面的两位(csr[11:10])表示寄存器是读/写(00、01或1
2022-03-09 11:30:34
4814
原创 7. 自制操作系统: risc-v 通用寄存器
RISC-V基础ISA由31个用于保存整数值的通用寄存器x1-x31组成。寄存器x0固定连接到常数0。还有一个额外的用户可见程序计数器pc寄存器,它保存当前指令的地址。RISC-V没有定义一个特定的子例程返回地址链接寄存器,但它确实建议标准软件调用约定应该使用寄存器x1来存储调用的返回地址。这些寄存器的宽度由使用的RISC-V基变量定义。也就是说,对于RV32,寄存器是32位宽,对于RV64,寄存器是64位宽调用惯例在传统的RISC-V软件中,堆栈向下增长,堆栈指针总是16字节对齐。
2022-03-07 09:02:03
3183
原创 6.自制操作系统: risc-v 比较和跳转指令
比较指令 指令名称 功能 ISA type 用法 含义 BEQ 相等时分支 RV32I/RV64I B beq rs1, rs2, offset 若寄存器 x[rs1]和寄存器 x[rs2]的值相等,把 pc 的值设为当前值加上符号位扩展的偏移 offset。
2022-03-03 09:43:39
5311
原创 5.自制操作系统: risc-v 算术和移位指令
算术指令 指令名称 功能 ISA type 用法 含义 ADD 加法 RV32I/RV64I R add rd. rs1. rs2 把寄存器 x[rs2]加到寄存器 x[rs1]上,结果写入 x[rd]。忽略算术溢出。 ADDI 加立即
2022-03-03 08:53:58
1406
原创 4.自制操作系统: risc-v 加载存储指令
加载指令 指令名称 功能 ISA type 用法 含义 LA 地址加载,伪指令 RV32I/RV64I 伪指令 la rd, symbol 将 symbol 的地址加载到 x[rd]中。当编译位置无关的代码时,它会被扩展为对全局偏移量表 (Global Of.
2022-02-28 20:04:50
2877
原创 3.自制操作系统: risc-v qemu virt board debug
根据上一篇文章的步骤,可以在终端输出"hello world"现在我们使用工具gdb-multiarch单步调试程序安装sudo apt install gdb-multiarch编译$ makerm -rf build *.img kernel.mapmkdir -p buildriscv64-linux-gnu-gcc -g -Wall -nostdlib -Iinclude -MMD -c src/start.c -o build/start_c.oriscv64-
2022-02-22 17:44:11
723
原创 2.自制操作系统: risc-v virt board output “hello world“
平台查看qemu支持的riscv64的board$ qemu-system-riscv64 -machine helpSupported machines are:none empty machinesifive_e RISC-V Board compatible with SiFive E SDKsifive_u RISC-V Board compatible with SiFive U SDKspike
2022-02-22 16:59:29
1124
1
原创 1. 自制操作系统:搭建risv-c qemu开发环境
宿主机:ubuntu 20.04安装qemu-system-riscv64和qemu-system-riscv32sudo apt install qemu-system-misc查看环境$ qemu-system-riscv32 --versionQEMU emulator version 4.2.1 (Debian 1:4.2-3ubuntu6.19)Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project deve
2022-02-21 09:25:29
2302
原创 快速搭建rsync-server
在linux系统上搭建rsync server,使用群晖hyper backup软件备份资料到linux系统上。sudo docker run -d \ --restart always \ -p 1022:22 \ -p 873:873 \ -v /home/richard/work_photo_bak/:/data \ -e USERNAME=username\ -e PASSWORD=passwrod \ -e VOLUME=/data \ -e ALLOW="1
2022-02-11 14:54:00
1127
原创 快速搭建opengrok环境
1. 建立三个目录mkdir /home/richard/opengrok_src/data/mkdir /home/richard/opengrok_src/etc/mkdir /home/richard/opengrok_src/src/2. 执行opengrok_run.sh脚本#!/bin/bashsudo docker run -d \ --restart always \ --name opengrok \ -p 80:8080/tcp \
2022-02-10 09:11:39
1603
原创 spin_lock_bh使用
spin_lock_bh作用:1.保护临界区2.禁止抢占3.禁止软中断在软中执行函数_do_softirq()中已经使用__local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET)来禁止软中断了,所以CPU上执行软中断是串行执行的。软中断的执行:1.irq_exit()退出时可能会执行softirq2.softirq的内核线程spin_lock_bh()主要用于保护其他进程上下文访问软中断函数共享的变量。软中断和进程B共享
2022-01-04 10:34:07
3457
原创 ret_from_fork为什么要执行一次开中断
1. 在fork新进程的时候,新进程的内核栈是空的2. 在tick中断执行过程中,中断是关闭的。3. 当tick中断到来时,选择新进程执行的时候会执行ret_from_fork,进入中断的时候,中断被关闭的。切换到新进程的时候中断也是关闭的。所以在ret_from_fork的schedule_tail中要开中断。...
2021-12-30 14:52:44
823
原创 swappiness
swappiness的值从0到100不等(默认一般是60),这个值越高,则回收的时候越优先选择anonymous pages。当swappiness等于100的时候,anonymous pages和page cache就具有相同的优先级。至于为什么不从开销最小的角度将swappiness设为0?如果swappiness为0,在内存回收的时候就不会去扫描annoymous page的LRU链表,只适用于page cache很多的场景。...
2021-12-30 09:20:38
476
原创 armv8 store buffer,invalidate queue简介
store buffer1. store buffer位于CPU和L1 cache之间2.CPU在写数据时,先把数据写入store buffer,不用等待收到其他所有CPU的应答,可以解决CPU停滞问题3. 如果store buffer有数据,cpu优先从store buffer里面读取,而不是从L1 cache读取数据。称为store forwarding4.smp_wmb()可以冲刷store buffer,保证前面的数据被写入到cache,在执行后面的存储操作invalidat
2021-12-29 11:06:09
1418
原创 openwrt 数据帧如何从lan转到wan
前提条件1.lan pc已经获取了openwrt lan端的ip2.lan pc已经有openwrt lan的路由表3.lan pc已经学习到了openwrt lan的mac地址4.lan pc发送的数据是到互联网开始直接看__netif_receive_skb_core,前面的NAPI收包已经上一篇文章已经讲过了。static int __netif_receive_skb_core(struct sk_buff *skb, bool pfmemalloc, ...
2021-12-27 21:35:44
2166
原创 linux 网络收包NAPI理解
网络驱动:1.初始化要DMA中断函数2.驱动提供int (*poll)(struct napi_struct *, int)回调函数用于接收数据帧3.驱动分配结构A,A中包括一个struct napi_struct结构体B5.驱动调用netif_napi_add()函数,此函数关键:5.1 B->poll = poll (poll为驱动接收数据帧回调函数)5.2 B->weight = weight 接收权重,默认由驱动设置为64,表示一个poll可以最多接收64...
2021-12-24 22:36:30
1322
原创 linux网络收包函数中对vlan操作的一点理解
在软中断中会调用__netif_receive_skb_core()函数来接收数据帧static int __netif_receive_skb_core(struct sk_buff *skb, bool pfmemalloc, struct packet_type **ppt_prev){ struct packet_type *ptype, *pt_prev; rx_handler_func_t *rx_handler; struct net_device *orig..
2021-12-23 21:20:59
3118
原创 理解linux PELT算法
理解PELT算法最重要的是理解负载贡献的计算方法。1.物理时间被分为了1024us。即一个统计的周期(period)2.如果统计的周期不足1024us被补齐。3.每经历一个周期需要衰减1次,衰减系数为y。我们常常看到给出的公式:L = L0 + L1 * y + L2 * y^2 + L3 * y^3 + ... + Ln * y^n 公式1L0表示当前周期,不需要衰减。L1表示前1个周期的负载。Ln表示前n个周期的负载。linux内核...
2021-12-09 09:35:21
1901
2
原创 linux osq锁注意问题
在理解linux中osq的实现时需要注意的问题:1.在调用osq_lock()函数之前是需要调用preempt_disable()的。即禁止抢占linux5.0 osq_lock.c的注释/** An MCS like lock especially tailored for optimistic spinning for sleeping* lock implementations (mutex, rwsem, etc).** Using a single mcs node ...
2021-12-07 21:23:55
1455
原创 vmalloc arm64系统结构和32位体系结构区别
32位体系结构:vmalloc分配内存时,pgd使用的是每个进程的pgd页表(task_struct->mm->pgd),所有在其他进程访问vmalloc分配的内存时会出现访问不到的情况,所以在do_page_fault里面会同步页表64位体系结构:vmalloc分配内存时,pgd直接使用的是内核全局页表swapper_pg_dir(mm_init->pgd)。所以就不存在页表同步问题。归根结底就是32位体系结构的内核空间虚拟地址范围太小了。.........
2021-10-29 16:54:31
703
原创 armv8 cache维护
cache基本概念cache管理的操作 无效(invalidata)整个高速缓存或某个缓存行。高速缓存上的数据会被丢弃 清除(clean)整个高速缓存或者某个高速缓存行。相应的高速缓存行会被标记为脏,数据会写回到下一级高速缓存中或者主存器中。 清零(zero)操作,通常作用预取和加速,比如程序需要一大块内存,内存需要被清零,通常cache控制器会把零数据写入到对应的cacheline上,如果程序主动使用清零指令,则会大大减少内部总线的带宽。 cache管理的对象 ..
2021-09-09 16:38:55
627
原创 armv8 cache PoU和PoC区别
名词解释Point of Unification(PoU)Point of Coherency(PoC)PoU表示一个CPU中的指令Cache,数据cache还有MMU,TLB等看到的是同一份的内存拷贝。 PoU for a PE, 保证PE看到的I/Dcache和MMU是同一份拷贝。大多数情况下,PoU是站在单系统的角度来观察的。 PoU for inner share,意思是说在inner share里面的所有PE都能看到相同的一份拷贝。 以上是PoU的两个用法。..
2021-09-09 14:02:03
5180
原创 物理/虚拟高速缓存区别以及高速缓存重名/同名问题详解
概述 处理器在访问存储器时,访问的地址都是虚拟地址,经过TLB和MMU的映射后变成物理地址。TBL只用于加速虚拟地址到物理地址的转换过程。得到物理地址后,若每次都直接从物理内存中读取数据,显然会变慢。实际上,处理器都配置了多级的高速缓存来加快数据的访问速度。物理高速缓存 当处理器查询MMU和TLB并得到物理地址之后,使用物理地址查询高速缓存,这种高速缓存称为物理高速缓存。缺点:使用物理高速缓存的缺点就是处理器在查询MMU和TLB后才能访问高速缓存,增加了流水线的延迟时间。 ...
2021-09-08 16:21:35
2218
原创 armv8 mmu Memory region attributes
D5.5 Memory region attributes内存属性:内存类型,cache,shareability,内存一致性等。The memory region attribute fields control the memory type, accesses to the caches, and whether the memory region is Shareable and therefore is coherent. This section also describes some
2021-09-07 11:16:52
802
1
原创 armv8 mmu Memory access control
内存访问控制D5.4 Memory access controlThe access control fields in the translation table descriptors determine whether the PE, in its current state, ispermitted to perform the required access to the output address given in the translation table descriptor.
2021-09-07 08:56:24
486
原创 armv8 mmu The Access flag and The dirty state
D5.4.7 The Access flagpage或者section的内存第一次被访问时,会设置AF标志位,如果是armv8.0需要软件管理,如果是armv8.1则是硬件自动管理。The Access flag indicates when a page or section of memory is accessed for the first time since the Access flag in the corresponding translation table descriptor
2021-09-06 22:39:28
1544
原创 armv8 mmu 内存页表属性
armv8中的页表项D5.3 VMSAv8-64 translation table format descriptorsIn general, a descriptor is one of:页表项的4种类型• An invalid or fault entry.有效的或者无效的页表项• A table entry, that points to the next-level translation table.指向下一级的页表项• A block entry, that defi...
2021-09-06 16:39:19
7150
原创 armv8中开启或关闭mmu对内存和指令的影响
开启/关闭mmu后访问的情况D5.2.9 The effects of disabling a stage of address translationAll other accessesFor all other accesses, when stage 1 address translation is disabled, the assigned attributes dependon whether the access is a data access or an instruc
2021-09-06 14:06:54
1214
1
原创 armv8 mmu 究竟如何选择TTBR0或TTBR1呢?
TTBR的选择(armv8.6手册 2578页)Selection between TTBR0_ELx and TTBR1_ELx when two VA ranges are supportedEvery translation table walk starts by accessing the translation table addressed by the TTBR_ELx for the stage 1translation for the required translation
2021-09-06 13:54:31
3190
原创 计算机中浮点数加法运算
十进制浮点数加法首先以手工过程将科学计数法表示的两个十进制数相加:9.999*10^1 + 1.610 * 10^-1。假设有效位只有4个十进制,且指数为两个十进制数位。步骤1:为了能让两数相加,我们需对指数较小的小数点进行调整,使1.610 * 10^-1的指数项较大的指数对齐。1.610 * 10^-1 = 0.1610 * 10^0 = 0.01610 * 10^1最后边的形式是我们需要的。因为其指数和较大的数9.999*10^1的指数相同。因此,第一步要将较小数的有效位右
2021-09-03 10:52:53
4773
1
原创 计算机中浮点数表示
浮点数表示 浮点数在计算机中由符号位、指数和尾数组合而成。通常,浮点数表示为如下形式:F为小数(尾数)字段值,E为指数字段值。溢出(浮点的上溢):正的指数太大而超过了指数字段的表示范围。下溢:负的指数太大而超过了指数字段的表示范围。减少溢出方法在c语言中称为double,基于double的操作称为双精度(doubleprecision)浮点运算。 IEEE 754浮点标准 IEEE 754隐藏了规格化二进制小数点前面的1.因此,在单精度下,数据有2...
2021-09-01 15:27:41
22207
原创 0. crash和kdump 死机问题解决-x86_64-基础知识
背景知识:x86_64体系结构的通用寄存器 32位x86的通用寄存器:8个通用寄存器 eax一般用作累加器(add) ebx一般作为基地址寄存器(base) ecx一般作为计数寄存器(count) edx一般作为存放数据(data) esp一般作为栈指针寄存器(stack pointer) ebp一般作为基指针寄存器(base pointer) esi 一般作为源变地址寄存器(...
2021-08-31 10:43:44
1301
原创 arm64裸机系统,编译器添加额外的sxtw指令,导致系统分配内存返回的地址不对
首先查看我的get_free_page()函数:unsigned long get_free_page(void){ int i; for(i = 0; i < NR_PAGES; i++){ if(mem_map[i] == 0){ mem_map[i] = 1; unsigned long page = LOW_MEMORY + (i*PAGE_SIZE) + VA_START; mem
2021-08-19 14:17:49
1687
1
linux下tcp穿透NAT源代码(git提交信息)
2014-09-16
mini2440无盘启动(服务器NFS配置-支持NFS内核编译-根文件构建-u-boot烧写)
2012-12-04
mini2440无盘启动(服务器配置-内核编译-文件系统制作-u-boot烧写)
2012-11-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅