Linux insides笔记(二)

感谢上帝,今天头不怎么疼。

昨天重温了今敏老师的 红辣椒。剧中千叶对时田不顾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

转载于:https://my.oschina.net/u/175377/blog/498507

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值