4.1. 内存探测、RTC 和递减器

现在控制台可以工作了,我们可以看到真正的问题。系统仍然无法启动。由于我们正在使用 C 代码,我们跟踪了代码,发现一个名为sdram_size()没有正确完成。该函数探测一个寄存器以获取 RAM 的大小,而我们的板子没有这个寄存器。我们让该函数返回一个给定的值 128MB,这是一个糟糕的hack,但我们的板子没有办法知道 RAM 的大小。

我们在一些名为 todc_XXXX 的函数中遇到了同样的问题,主要是todc_get_rtc_time(), todc_set_rtc_time(),以及time_init()由于我们的板子上没有 RTC(实时时钟)芯片,而这些函数正在使用它。目前,我们让todc_XXX函数仅设置和获取一个固定的日期和时间,因为我们的板子没有 bios 电池,因此在断电时无法保持时间。

完成所有这些之后,我们找到了todc_calibrate_descr(),它再次使用了 RTC 芯片。我们不得不将该函数替换为我们自己的
void calibrate_decr() {
	int freq, divisor;
	freq = bus_freq();
	divisor = 4;
	tb_ticks_per_jiffy = freq / HZ / divisor;
	tb_to_us = mulhwu_scale_factor(freq / divisor, 1000000);
}