ucore-project3: loadkernel

昨天开始project3,本project是真正做一个有驱动、提供printf、strlen等功能的、可简单初始化的elf内核,然后通过MBR中的简单bootloader解析elf文件头,将elf内核以program header table中指定的位置载入内存。

今天完成文件的载入,在载入过程中,bootloader因为解析elf文件头,并完成elf内核的加载,导致虽然使用了gcc的文件大小优化(-Os),bootloader大小仍超过512字节(524字节),无法装载到MBR。看ucore完成相同功能的bootloader,才376字节,对比了一下两者的objdump反编译代码,发现我的inline函数没有起作用,我的函数头是这么写的:

inline unsigned short inb(unsigned short port)
{
....
}

而ucore的定义如下:

static uint8_t inb(uint16_t port) __attribute__ ((always_inline));
static uint8_t inb(uint16_t port)
{
....
}

 通过__attribute__,并且定义为static,则永远都是inline。

注意,使用__attribute__((always_inline))时,不能同时定义函数体。

这样修改后,代码大小由524字节变为484字节,仍然比ucore的代码多,不过可用了,不试验了,后续再优化。

 (23::37)刚改了一处冗余代码,现在是408字节了

猜你喜欢

转载自spartan1.iteye.com/blog/1278674