Skip to content

Commit

Permalink
Merge pull request #472 from Destinykami/master
Browse files Browse the repository at this point in the history
add 三阶段小结 kami
  • Loading branch information
ZhiyuanSue authored Jul 2, 2024
2 parents 9b90fe2 + 5239f77 commit bc66a30
Showing 1 changed file with 43 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -66,14 +66,53 @@ mathjax: true
### 小结的小结
二阶段的编程小练习涵盖了操作系统设计的几个重要方面,我认为二刷甚至多刷也是有价值的-。-

# 三阶段 小结 (todo)
选择了项目三 Rust for Linux内核驱动,目前完成了前两个小练习,比较简单,但是新的练习三突然上了强度...目前是一头雾水的状态。
# 三阶段 小结
## 项目3 Rust for Linux & 跨内核驱动框架

To be continue...
### 练习一 配环境
> *工欲善其事,必先利其器。*
进入考试周,在学业压力下,对于三阶段的期望降到了混个合格就好...
万事开头难,确实如此。在配环境上折腾了好久,一开始用WSL,但是对于图形界面的支持不够以致QEMU界面始终是黑屏- -...又改用虚拟机,但是性能很差,编译一次要花费好长时间,虽然可以显示画面了,但是到练习二的时候又出现了画面卡死动不了的问题- - ...

有群友使用docker整了一个环境,也整下来试了一下,但是被mac的大小写问题给坑了一下,到最后也没配好

最后得到的最优解是在WSL启动QEMU时使用 vnc 进行连接。

算一下为了配好环境前前后后折腾了好几天,编译了不下十几次- -

### 练习二 实现Miscdev驱动基本读写
本学期学校开设的操作系统课程实验也使用了树莓派进行内核编程,其上烧写的是OpenEuler。于是对于内核模块的编写多少有一点亲切感。

完善了open/read/write的内容,使得杂项字符设备可以实现基本读写操作。

### 练习三 跨内核驱动框架下的树莓派4B GPIO点灯实现
一开始一头雾水,不知道要怎么下手,又遇上期末考试,于是就暂时搁置了。

考试周结束后又重新捡了起来,去课堂看了之前的回放才知道了如何把写的pure driver编译进内核。

在pure driver中要做的事情主要是完成树莓派的所有寄存器的抽象。**(阅读树莓派的手册很重要)**

然后在Adapter driver中把寄存器映射到内存地址,通过对于地址的操作,进而控制寄存器,达到GPIO口的电平和输出模式等等的目的。

```rust
let mapped_base = unsafe { bindings::ioremap(BCM2837_GPIO_BASE, GPIO_SIZE) };
```

在Arceos上的操作也类似,pure driver可以直接复用,但是要把osl相关的东西给换掉。在映射地址时多了个物理地址转为虚拟地址的操作。
```rust
let mut gpio_map=RpiGpioPort::new(phys_to_virt((gpio_base as usize).into()).as_mut_ptr());
```
文档给的点灯驱动参考非常的详细,照着做基本上就能够正常运行起来。(但是有的地方还是不理解为什么要这么操作)

# 总结
本次训练营的学习内容相当丰富,学到了很多新知识,以及探索了之前没有涉足过的领域。
但是由于课业等等压力,一直都算是在闲时才来跟一下训练营的进度,因此各方面感觉自己学的不够扎实,学习深度也有限,仍需要继续沉淀...
总结就是要多读源码,多看手册,不要因为嫌麻烦偷懒不看- - 问就是在这方面吃了很多的教训,有的问题想好久想不明白,这里为啥这么写?这个寄存器为啥这么操作? 最后一看手册里写的清清楚楚的...


> 我们旅行时不要像个信使一样,而应当像个探险家一样。我们不仅要考虑起点和终点,还得考虑起点和终点之间的距离
### ~~~

**繋がる空の下
さあ自分らしく進もう
Expand Down

0 comments on commit bc66a30

Please sign in to comment.