文档目的
shared memory即共享内存,在不同的进程之间通过一小段内存来共享信息,实现进程间通信。本文主要介绍高通aboot(lk) 和内核(kernel)间的信息传递。
在传统的lk-》kernel信息传递使用的是cmdline,但是这种方法只适合传递简短的信息,对于很大段的信息(比如aboot中的所有uart log)却无法传递。所以此处我们使用共享内存来传递,先把aboot中uart log全部保存在某一段内存中,然后无损传递到内核中,在内核中读出来。
具体实现
aboot打印log -> log保存 -> log写入内存 -> 启动内核 -> 读取log
1.aboot打印log
aboot中的log打印函数为dprintf,其原型定义在bootable/bootloader/lk/include/debug.h中:
#define dprintf(level, x...) do { if ((level) <= DEBUGLEVEL) { _dprintf(x); } } while (0)
其又调用
_dprintf(x),定义在
bootable/bootloader/lk/
lib/debug/debug.c中:
int _dprintf(const char *fmt, ...)
{
char buf[256];
char ts_buf[13];
int err;
snprintf(ts_buf, sizeof(ts_buf), "[%u] ",(unsigned int)current_time()); //串口log前面加上时间戳
dputs(ALWAYS, ts_buf);
va_list ap;
va_start(ap, fmt);
err = vsnprintf(buf, sizeof(buf), fmt, ap); //解析格式
va_end(ap);
dputs(ALWAYS, buf);
return err;
}
调用到dputs函数,