ahczgy
22
xv6运行。
两个问题
1、设置物理内存不能超过128M,否则kinit()会正常退出,但只有hart0在跑,hart1跑不起来。

只设置了22M,再高就会出问题,但有时设置高点也不会出问题,甚至设置两段物理内存有时也会正常。问题好像随机的。奇幻!
2、捕捉不到时钟中断处理结束时设置的软中断,就是下面这个,在kernel/kernelvec.S中。

按说时间中断发生时,硬件会自动关中断,sip中pending一个S模式软中断,时间中断处理结束后退出,如果中断是开着的,这时就会发生软中断,为什么会不发生呢?
感谢路过大佬请不惜指导!
ahczgy
24
1、具体问题是:时间中断如期发生,时间中断处理程序在M模式处理,M模式处理结束前设置sip寄存器的软中断位,然后执行mret退出。
2、如何确定software interrupt没有发生:我在scheduler开了S模式中断,其中包括软中断,打印sip内容,未发现sip软中断位置位,但始终有外部中断位置位,也有可能是优级问题。其实也捕捉到过,但是没没办法重现。
哈哈,终于重现一次
我感觉还是先用spike或者qemu把xv6跑起来吧。直接实机太难debug
1 Like
ahczgy
26
在qemu下跑总感觉不真实:-(,现在只开S模式的软中断,时间中断基本正常,看来的确是中断优先级问题没有处理好。
只开软中断:
我觉得xv6的设计在这里是有问题的。为什么不直接把timer interrupt forward给S mode呢?为什么要通过software interrupt来做呢?这样
w_sie(r_sie() | SIE_SEIE | SIE_STIE | SIE_SSIE);
还有什么意义呢?SIE_STIE
根本没有用啊
ahczgy
29
xv6设计的没错。timer interrupt必须在M模式下响应,不能直接forward给S模式,在此xv6玩了个技巧。
ahczgy
30
多谢!我看到过,水平不够,不敢献丑。多谢大佬一直以来的指点!
ahczgy
31
xv6跑到涉及文件系统的部分,要对写到SD card的fs.img进行读写了,为此零零散散找到了一些VisionFive V1下相关的一些信息:
1、

这里的意思是SD card不直接通过SDIO?
2、
3、
问题:如何把这些零碎信息组合起来对SD card进行读写呢?
从网上找了一些相关的SDIO的材料,我的理解是要把pin与GPIO联系起来,GPIO是直联SDIO的,是直接读写pin还是读写GPIO呢,还有这些都要初始化,如何初始化呢?这是个复杂的问题,如何能提供一些相关帮助,感激不尽!!
我的意思是在M mode设置MIP[STIP]
来转发timer interrupt,这样就不会和software interrupt混淆,opensbi就是这么做的:
而xv6这种用software interrupt的方式我是感到不解
其实那个图已经告诉答案了。SD_SDIO0_D2
是SDIO模块的讯号,它可以被选择输出到任意一个GPIO pin上面。这里是因为电路版的设计,需要把它选择到GPIO51。你自己设计一块板把它连到GPIO19也是完全可以的。只不过因为芯片本身不知道板是怎么画的,你需要告诉他这个。总之这些GPIO pin的功能是不固定的,可以切换到任何功能模块,比如sdio/i2c/spi,或者纯粹作为gpio来使用。Linux的pinctrl driver就是用来做这个切换的,你可以实现一个简易的pinctrl。具体需要怎么设置可以看这个dts:
ahczgy
34
感谢,明白了,sbi保持了底层发生一切的原貌,交到运行在S mode的os来自行处理,这是不忘初衷啊 
ahczgy
35
讲真的,我直到现在才知道有dts这个东东的存在,xv6面对的差不多是祼板(前面SecondBoot和DDRInit应该做了些初始化工作)没有使用dts,因此,我想知道是开发板环境下不使用dts“如何把这些零碎信息组合起来对SD card进行读写呢”?dts是先进的东东,以后有机会一定学习。
pinctrl部分:要按照那些对应的GPIOMUX的值和那些bias-disable/input-enable...
之类的写到pinctrl@11910000
的对应寄存器里面
clock部分:按照时钟树的关系设置对应的时钟,写clock-controller@11800000
对应的寄存器
reset部分:写reset-controller@11840000
对应的bit
interrupt部分:这个最简单,dts里面看是接到plic哪个irq就行了
这些信息都可以从dts里面找到,只不过你得自己来写寄存器。另外得自己写snps,dw-mshc
驱动
ahczgy
37
看起来很复杂,晚上浏览了一下linux关于7100的pinctrl代码,完全看不懂,慢慢来吧,感谢大佬指路!!
ahczgy
38
感谢,太难了,到现在也没找到这些对应寄存器说明,尤其是synopsys sd host controller,linux下可以找到对应驱动,可惜完全看不懂. 看样子光有兴趣还不行,实力决定一切,兴趣要完玩
visionfive 1的sd card 也是根据这张图设计的吗?
我将visionfive 1的JH7100_ddrinit下的有关SD卡的代码移植(完全拷贝,见笑了)到了xv6下,SD卡识别模式出错,如下图:
根据提示应该是发送41命令之前发送55命令时出错。
代码git地址:(
GitHub - ahczgy/xv6vf1: xv6 for visionfive v1),很丑陋,试了8G,32G,64G的卡都没成功,感谢路过大佬指导!
应该是发完CMD0后,再发CMD8时,读DWMCI_STATUS寄存器一直busy,超时退出,无法完成sd模式识别。dwmmc.c文件dwmci_send_cmd函数里: