摘要:本文介绍Linux内核内存分配函数devm_kmalloc()和devm_kzalloc()。 一、devm_kmalloc 文件:drivers/base/devres.c,定义如下: /** * devm_kmalloc - Resource-managed kmalloc * @dev: De
阅读全文
摘要:compatible 属性 compatible 属性也叫做 “兼容性” 属性,这是非常重要的一个属性!compatible 属性的值是一个字符串列表, compatible 属性用于将设备和驱动绑定起来。字符串列表用于选择设备所要使用的驱动程序。compatible 属性值的推荐格式: "manu
阅读全文
摘要:运行05-Preemptive 05-Preemptive# riscv64-linux-gnu-objdump -d -t kernel.elf > dump.txt cat dump.txt | grep 800002ac -B 10 8000028c: 87aa mv a5,a0 800002
阅读全文
摘要:中断映射的大体过程如下: irq_of_parse_and_map static int bcm2835_mbox_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; int ret = 0; struct r
阅读全文
摘要:static unsigned long long riscv_clocksource_rdtime(struct clocksource *cs) { return get_cycles64(); } clocksource clocksource 提供了对不同软硬件时钟的抽象。可以理解为时间源,
阅读全文
摘要:void timer_init() { // each CPU has a separate source of timer interrupts. int id = r_mhartid(); // ask the CLINT for a timer interrupt. // int interv
阅读全文
摘要:lesson7 qemu-system-riscv64 --version QEMU emulator version 6.1.0 Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers 执行mret 抛异常 I
阅读全文
摘要:204 void enter_supervisor_mode(void (*fn)(uintptr_t), uintptr_t arg0, uintptr_t arg1) 205 { 206 uintptr_t mstatus = read_csr(mstatus); 207 mstatus = I
阅读全文
摘要:添加nostdlib CFLAGS = -Wall -mcmodel=medany -g -I $(IDIR) -O0 -nostdlib
阅读全文
摘要:进入目录 Enter PIN for authenticator: $ ssh-add -K zhang.ssh Enter PIN for authenticator: Provider "internal" returned failure -1 Unable to load resident
阅读全文
摘要:生成ssh key ssh-keygen -t rsa -C "mag@126.com" -f github.ssh *** Please tell me who you are. root@ubuntu:/home/ubuntu/test/mini-riscv-os# git add . root
阅读全文
摘要:qemu-system-riscv64 -machine \? Supported machines are: microchip-icicle-kit Microchip PolarFire SoC Icicle Kit none empty machine shakti_c RISC-V Boa
阅读全文
摘要:./configure --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc CFLAGS=-static CXX=arm-linux-gnueabihf-g++ CXXFLAGS=-static root@ubuntu:/home/ubuntu
阅读全文
摘要:# # Risc-V Assembler program to print "Hello World!" # to stdout. # # a0-a2 - parameters to linux function services # a7 - linux function number # .gl
阅读全文
摘要:https://gitlab.eduxiji.net/Reticence/rbros/-/tree/b66a924d546be4679c84df16ac257002bb8b6a68/include git log commit 87b2f6edefe3ba0097eb9b23ac3b85698ce9
阅读全文
摘要:[root@centos7 04_interrupt]# cat src/head.s .section .text.init .align 3 .globl _start .extern start_kernel .extern stack_top .extern _strap .extern b
阅读全文
摘要:eth: eth@0{ compatible = "cdns,macb"; interrupt-parent = <&plic0>; interrupts = <65>, <66>; reg = <0x0 0x83040000 0x0 0x4000>; #local-mac-address = [0
阅读全文
摘要:特权架构 处理器在架构上一般都会有几种特权模式,比如x86架构有“ring0~ring3”4种级别,一般操作系统内核和驱动运行在ring0级别,也就是最高级别,而普通的应用程序运行在ring3级别,也就是权限最低的级别;再比如arm架构有7种处理器模式,操作系统一般运行在Supervisor模式,而
阅读全文
摘要:正常退出 如果想从qemu中退出到命令行,先按住“ctrl+a”,然后再按“x”键即可 通过kill 退出 [root@centos7 lesson10]# ps -elf | grep qemu 2 S root 92555 79657 98 80 0 - 5421 poll_s 21:53 pt
阅读全文
摘要:我们知道有些寄存器只能在m模式下设置和访问,如果s模式想要使用某个功能,只能先回到m模式然后再进行相应的设置。OpenSBI定义了s模式和m模式之间功能调用的接口,s模式通过执行“ecall”指令回到m模式使用相关功能,在本章节和下一章节我们将通过类似的方式来学习s模式下如何使用ecall和m模式下
阅读全文
摘要:1. 中断初始化 S模式下的中断初始化和M模式基本类似,只不过操作的是S模式下的CSR寄存器,如下所示。 static void supervisor_trap_init(void) { //this stack is used for supervisor_trap_entry in entry.
阅读全文
摘要:M模式切换到S模式 从m模式切换到s模式下的代码其实也不是很多,主要是设置"mstatus"和“mepc”寄存器。其实从高特权级别切换到低特权级的思路在各个架构下都差不多,从低级别到高级别只有一种方式那就是产生了中断或者异常,从而进入高级别进行中断和异常处理,然后在中断中再返回到低级别。那么第一次从
阅读全文
摘要:中断(中断返回)本质上也是一种跳转,只不过还需要附加一些读写CSR寄存器的操作。 RISC-V中断分为两种类型,一种是同步中断,即ECALL、EBREAK等指令所产生的中断,另一种是异步中断,即GPIO、UART等外设产生的中断。 中断号保存在 mcause 寄存器中,最高位是 1 说明是同步异常,
阅读全文
摘要:.global _start _start: MOV r4,#1 // r4=1 1: // Local label ADD r4,r4,#1 // Increment r4 CMP r4,#0x5 // if r4 < 5... BLT 1b // ...branch backwards to l
阅读全文
摘要:1、什么是堆栈? 在嵌入式的世界里,堆栈通常指的是栈,严格来说,堆栈分为堆(Heap)和栈(Stack)。 栈(Stack): 一种顺序数据结构,满足后进先出(Last-In / First-Out)的原则,由编译器自动分配和释放。使用一级缓存,调用完立即释放。 堆(Heap):类似于链表结构,可对
阅读全文
摘要:如何优化 memcpy 函数 Linux 内核用到了许多方式来加强性能以及稳定性,本文探讨的 memcpy 的汇编实现方式就是其中的一种,memcpy 的性能是否强大,拷贝延迟是否足够低都直接影响着整个系统性能。通过对拷贝函数的理解可以加深对整个系统设计的一个理解,同时提升自身技术实力。 罗马不是一
阅读全文
摘要:Setup If you have worked through all the previous posts in this series, you can cd to your riscv-from-scratch directory and skip this section. If you’
阅读全文
摘要:root@ubuntu:~# riscv64-linux-gnu-gcc -v Using built-in specs. COLLECT_GCC=riscv64-linux-gnu-gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/riscv64-linux-g
阅读全文
摘要:kernel:3.6硬件:一般soc会有多个sp804外部timer,假设现在timer0作全部时钟设备,timer1作为clocksource。arm smp local timer。核心数据结构对象:1. struct clock_event_device 时钟设备抽象类型,其中set_next
阅读全文
摘要:我们看一个wmb()和rmb()的使用例子。我们需要到设备驱动中寻找,就顺便选一个我也不清楚的网卡驱动吧(drivers/net/8139too.c)。 static netdev_tx_t rtl8139_start_xmit (struct sk_buff *skb, struct net_de
阅读全文
摘要:打开everything。 找到你要查找的文件夹路径,方法如下:,在我的电脑里找,如何在地址栏里点击鼠标左键,转换成路径,复制该路径到everything。 切换到everything界面,勾选“搜索”-“匹配路径”。 更换文件夹路径即可搜索其他指定的文件夹内容。 高级搜索 不需要设置everyth
阅读全文
摘要:DMA与Cache 的一致性 一致性问题 mem中有一块报文,cpu会将这块报文读到cache,cpu再读这块,cache hit。则会从cache中取值。 如果外设是一张网卡,通过DMA 数据传到内存,将红色这块涂成了绿色。内存已经绿了,但是cpu读这块数据却还是红色。造成内存 cache 不一致
阅读全文
摘要:void __init sched_clock_register(u64 (*read)(void), int bits, unsigned long rate) { u64 res, wrap, new_mask, new_epoch, cyc, ns; u32 new_mult, new_shi
阅读全文
摘要:/** * @file lkm.c * @author Dmytro Shytyi * @date 14 Octobre 2018 * @version 0.1 * @brief A "Hello World!" loadable kernel module (LKM) that sends Hel
阅读全文
摘要:snprintf(bp->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x", bp->pdev->name, bp->pdev->id);
阅读全文
摘要:这部分线性buffer 由以上四个指针控制,分割成三个部分,这四个指针都指向线性buffer 中的位置: head 到data 之间,称为headroom. data 到tail 之间,存放包的数据。 tail 到end 之间,称为tailroom. 由于 TCP/IP 协议族是一种分层的协议,传输
阅读全文
摘要:#-kernel ~/riscv_debug/linux-5.14/arch/riscv/boot/Image -append "root=/dev/vda ro console=ttyS0,115200n8 earlycon=sbi" \ qemu-system-riscv64 -nographi
阅读全文
摘要:make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- -j64 menuconfig CROSS_COMPILE=riscv64-linux-gnu- -j64 CROSS_COMPILE=riscv64-linux-gnu- -j64 install r
阅读全文
摘要:[root@centos7 rams2]# riscv64-unknown-linux-gnu-objdump -x usr/sbin/tcpdump | grep NEEDED NEEDED libcrypto.so.1.1 NEEDED libpcap.so.0.8 NEEDED libc.so
阅读全文
摘要:[root@centos7 aarch64-bare-metal-qemu]# cat libc.s /* Output "Hello world!" to standard output. For Aarch64 (ARM64) architecture with GNU assembler, u
阅读全文
摘要:System calls Sometimes it is necessary for software to request a function from a more privileged entity. This might happen when, for example, an appli
阅读全文
摘要:[root@centos7 aarch64-bare-metal-qemu]# gcc -c test64.c -o test64.o [root@centos7 aarch64-bare-metal-qemu]# as -c startup64.s -o startup64.o [root@cen
阅读全文
摘要:(1) 下面是确定内核的虚拟地址、物理地址的关键信息, 感兴趣的同学可以自己看:vmlinux虚拟地址的确定:内核源码: .config : CONFIG_PAGE_OFFSET=0xC0000000 arch/arm/include/asm/memory.h #define PAGE_OFFSET
阅读全文
摘要:时钟框图 先来看看S3C2440时钟的硬件框图: 将该图简化如下: 我们只想作为消费者怎么去使用这些时钟,并不关心“提供者”内部的层级结构,只要知道“直接提供者”,也不关系“直接提供者”的实现,我们只需要发出请求就可以了。 晶振设备树描述 我们看看在2440的设备树里怎么描述这提供者和消费者。先来看
阅读全文