Risc-V学习日记
Day1
//循序渐进,学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春
//https://www.bilibili.com/video/BV1Q5411w7z5?p=1&vd_source=e0d9c80e34376411075dc347a4727440
代码目录://https://gitee.com/unicornx/riscv-operating-system-mooc
riscv-operating-system-mooc-main\code\asm为汇编参考目录
计算机系统漫游:[计算机的硬件组成,程序的存储与执行,程序语言的设计和进化,存储设备的层次结构,操作系统]
计算机的硬件组成
(冯诺依曼):
1.总线
2.CPU("中央处理单元")
CU:控制单元
ALU:算数逻辑单元{"计算发生的地方"}
寄存器
3.IO桥
4.内存
5.外设
键盘
屏幕
6.硬盘
(哈佛架构):1.CPU("中央处理单元")
2.指令内存
3.数据内存
程序的存储与执行:晶振频率{("GHz")"驱动整体运行"}
1.hello.c{"编译和链接"}
2.a.out{"硬盘"}
3.0001010...{"内存"}
4.{"CPU"(
CU:取指[Fetch]
译码[Decode]
执行[Execute])}
Day2
//刚刚下载好虚拟机VMware并激活
//https://www.bilibili.com/video/BV1rd4y1G71H/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=e0d9c80e34376411075dc347a4727440
//sudo apt update
//sudo apt install build-essential gcc make perl dkms git gcc-riscv64-unknown-elf gdb-multiarch qemu-system-misc
//安装完ubuntun准备用sudo指令时候发现这玩意需要输入密码居然不显示,搞了半天我以为我电脑坏了(https://blog.csdn.net/m0_47399811/article/details/113784922)
//夸克网盘下这些玩意真好用就是不给分享(2023/7/10)
程序语言的设计和进化: 实现a=b+c(b,c放入寄存器)
计算机访问内存通过地址访问
假设一条指令长度为8bit
不同表达方式:
A{([0][1]前面两位bit表达"动作,load,add,store")([2][3]寄存器的"代号")([4][5][6][7]四位"地址"能表达2^4=16个数字)}
B{([0][1]前面两位bit表达"动作")([2][3]寄存器的"代号")([4][5]寄存器的"代号")([6][7]2位"地址"能表达2^2=4个数字)}
前两位的动作中定义 [0][1]=load [1][1]=add [1][0]=store
内存:{
ADDRESS:0,Data:01000001;
ADDRESS:1,Data:01010101;
ADDRESS:2,Data:00010011;
ADDRESS:3,Data:01100010;
ADDRESS:4,Data:00000001;
ADDRESS:5,Data:00000010;
ADDRESS:6,Data:00000011;
}
运行逻辑:{
Program Counter(PC)与Memory(内存)
Program Counter (0000-0000)| Instruction Register(0100-00-01) | Register0 (0000-00-01) | Register1 (XXXX-XX-XX);
Program Counter (0000-0001)| Instruction Register(0101-01-01) | Register0 (0000-00-01) | Register1 (0000-00-10);
Program Counter (0000-0010)| Instruction Register(0001-00-11) | Register0 (0000-00-11) | Register1 (0000-00-10);
Program Counter (0000-0011)| Instruction Register(0110-00-10) | Register0 (0000-00-11) | Register1 (0000-00-10);
}
1.将b从内存搬入寄存器
load data from ADDRESS where stores the first value to REGISTER_0
[Load:01 REGISTER_0:00 ADDRESS:0100 0100-00-01 (A) ]
0100,0001 (从地址为4{0100}(对应值为"1")的内存的原地址,加载一个数{将a从内存搬入寄存器})
2.将c从内存搬入寄存器
load data from ADDRESS where stores the Second value to REGISTER_1
[Load:01 REGISTER_0:01 ADDRESS:0101 0101-01-01 (A) ]
0101,0101 (从地址为5{0101}(对应值为"2")的内存的原地址,加载一个数{将b从内存搬入寄存器})
3.算数逻辑单元访问寄存器获得b,c计算获得a
ADD REG0 and REG1,store result in REGISTER_0
[Add:11 REGISTER_0:00 REGISTER_1:01 00-01-00-11(B) ]
0001,0011 ({0011}将{00}与{11}寄存器相加存在{00}中)
4.将a从寄存器搬入内存
store value of REGISTER_0 to ADDRESS
[store:10 REGISTER_0:00 ADDRESS:0110 0110-00-10(A) ]
0110,0010 ({0010}将{00}保存在"6"{0110}地址内存中)
Day3
编程语言的进化:机器语言——>汇编语言
机器语言: ADDRESS:0,Data:01000001;
ADDRESS:1,Data:01010101;
ADDRESS:2,Data:00010011;
ADDRESS:3,Data:01100010;
ADDRESS:4,Data:00000001;
ADDRESS:5,Data:00000010;
ADDRESS:6,Data:00000011;
汇编语言: # Assemble Language
.global add # Define entry
add:
load r0,0x04 # Load r0 from address 0x04
load r1,0x05 # Load r0 from address 0x05
add r0, r1 # Add r0 and r1
# and store result in r0
store r0,0x06 # Store r0 to address 0x06
array:
.byte 0x01
.byte 0x02
.byte 0x00
.end. # End of file
高级语言: // Advanced Language
byte array[3] = {1, 2, 0};
function add ()
{
byte a = array[0];
byte b = array[1];
array[2] = a + b;
}
存储设备的层次结构:寄存器,内存,硬盘
;速度:快;容量:小;成本:高
寄存器
高速缓存
主存
本地存储(磁盘)
原创存储(网盘)
应用程序<---->操作系统:系统调用(system call)
操作系统<---->处理器:指令集架构(ISA)
作用:保护硬件被失控的软件应用程序滥用
向应用程序提供简单一致的"抽象接口"来控制复杂的多种外设硬件
Risc-V学习日记
于 2023-07-23 13:04:53 首次发布