`
spartan1
  • 浏览: 360650 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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字节了

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics