感谢上帝,今天头不怎么疼。
昨天重温了今敏老师的 红辣椒。剧中千叶对时田不顾dcmini丢失后种种可怕事故,痴心于最终完成dcmini的行为勃然大怒,大意说:
你和冰室都是这样,只做你们愿意做的事而不去做应该做的事。自以为是百年一遇的天才,什么dcmini很棒啊,你这个死宅你就撸一辈子吧
嗯,就像linux这种东西,对我没用,我看看于世界也没用,确实不像是应该做的事情。
然而罗素说
The time you enjoy wasting is not wasted time.
然而世界上没什么应该做的事,全如尘芥。无苦集灭道,无智亦无得。
零零碎碎,手机敲了一个半小时╯﹏╰这是个没有情怀的世界,偏偏希望有些情怀,因为我曾感受过它。
以下正文。
Bios将硬盘第一扇区512字节载入内存地址ox7coo,bios正式把控制权交给bootloader.
Bootloader的主要任务,准备好把控制权交给操作系统内核。然而grub2功能很多,还要处理历史遗留兼容和错误处理,需要比这512字节更大的空间,设计者于是设计grub分三步载入所有程序到符合规定的内存地址上,并执行这些载入的程序。
Grub2要想启动linux内核,要遵循内核启动协议。在linux源码文档中有这个协议。准备好各项工作之后,把linux内核载入内存选定区域中,至于选定区域在哪,协议文档和源码中有建议和答案。填入内核启动信息,控制权移交内核。
内核首先还有设置自身很多东西。操作系统,因为显而易见的原因多是用c啊rust这种更人类友好的语言完成,然而呢,c语言编译的程序运行是需要各种条件的,比如bss段啊,堆栈啊啥的,然而目前并没有。
我们首先要让各个段寄存器的值一样,刚进入内核时,前面有一段给uefi用的数据,因此cs设置会不同,但之后,需要调整成和其它寄存器一样。
我们还要正确设置堆栈(这里他在说啥不知道)反正是按规定在狭小的空间设置好狭小的有堆或没有的栈。我并不知道c程序编译成的程序能没有堆运行。。。
接下来,内核检查魔术字段,确保段寄存器和栈都设置好了。
接着设置bss段,在合适的位置设置合适的大小区域为bss.将bss区域初始化为o.这在源码中有细节。
最后,就可以跳转到c的main函数了。
之所以操作系统用c写,我猜汇编写复杂点程序太难过,不信建议你自己写bootloader试试。
总之,通过程序不断载入内存和控制权移交,内存中东西越来越丰富。之后就该内核中的c代码继续内核的启动任务。
下回在写
Cheers