收录日期:2018/10/22 22:45:05 时间:2016/05/20 18:28:25 标签:应用程序开发区
我指的是最具体的步骤

BIOS 以后
然后 lilo 把内核调入内存

我想知道 后面的启动过程 是否是由内核固定了启动位置

(比如先 init 然后 rc.d ) 我们只是在不同的位置添置自己的script 而已?
a.首先,x86 CPU加电,初始化自己进入16位实模式,然后跳转到0xFFFF0,BIOS地址,调用显卡Bios初始化显卡,进行自检,然后装载可引导设备的第一个扇区到0x7c00,然后跳转到那儿。这部分代码其实是arch\i386\boot\bootsect.S。新的内核已经不支持从bootsect启动,bootsect.S其实只是提示用户按任何键重启。因为现在的可引导设备的第一个扇区是lilo或grub,然后由他们装载lilo或grub引导代码进入0x90000,然后装载内核setup代码进入0x90200,然后装载内核剩余部分进入0x10000。

b.内核setup代码就是arch\i386\boot\setup.S,它读取硬盘参数, 检查签名0xAA55.0x5A5A, 检查是否大内核(检查标志),使用不同的方法获取内存大小,初始化设置键盘硬件。检查显卡及其参数,然后调用。video.S中的video函数。

c.video 检查内核参数,vga= 让用户选择视频模式,然后返回Setup.S。

d.然后将内核从0x10000移动到0x1000这部分代码的开始就是arch\i386
\boot\compressed\head.S。然后进入32位保护模式。然后跳转到head.S 中startup_32=0x1000。注意:以上全是汇编代码。

e.然后head.S调用arch\i386\boot\compressed\misc.c中的decompress_kernel函数(C语言代码),然后调用lib\inflate.c中的gunzip函数,将内核解压缩到0x100000(32位指针)。然后显示”Uncompressing Linux...”。最后返回head.S

f.然后进入arch\i386\kernel\head.S。(汇编语言)在这里初始化内存页表(PT),初始化(IDT)中断描述表。检查CPU类型,配置对称多处理器。接着调用start_kernel在init\main.c中这个函数永不返回。致此,开始启动内核,之后的代码都变成了C语言代码。start_kernel中才是真正的linux内核初始化,启动过程。

g.然后内核调用init函数,这个函数查找并调用
/sbin/init
/etc/init
/bin/init
直到一个成功,init命令会根据/etc/inittab中设定的运行等级决定调用的rc(/etc/inittab中列出)。
如果都不成功启动
/bin/sh

thank u so good!
不过好复杂! 我想问 利用linux 源代码
我如何修改和制作一个属于我自己的启动os呢
Ropyn(剑心) ( ) 说的已经够详细了,如果你想看更详细的描述,一个方法是看源代码,另一个方法是参考下面两本书的相关内容:
1。Understanding The Linux Kernel, 2nd Edition:Appendix A - System Startup,条理解释的很清楚,不愧是老外写的Bible级的读物
2。《Linux内核2.4版源代码分析大全》第五章-Linux系统初始化,里边给的代码比较多,参考着看一下吧,不过这本书比较难懂。
>>后面的启动过程 是否是由内核固定了启动位置
顺序是固定的,不会改变,不过rc.d里边的东西都是有优先级的,比如说K50netdump,50就是优先级。
晕,你所谓的“属于我自己的启动os”是何概念?
至少启动这个os 显示出来的信息和redhat 这类os 的启动不一样
不是loading..... 
我想出现属于自己的信息
只是显示信息不一样,就是你的意义上的“你的”操作系统?崩溃……
我感觉你对OS没有一个正确的认识! OS总是与需求相对的,有什么样的需求,就有什么样的操作系统。比如说DOS是一个单任务,实模式下的操作系统,而Unix,Linux是多任务,保护模式下的支持虚拟机制的操作系统。如果只满足“启动”这一条件,那岂不是很简单?在硬盘的引导扇区的代码上加上显示“MyOS”的机器码不就是了?但是真正的意义上的现代操作系统,要有以下一些条件:Process management,Memory management,Filesystems,Device control,Networking,所以说OS是一个很复杂的概念,不是你说的能启动起来的就是操作系统。要是真的那么简单,谁都可以做操作系统了……
没有对操作系统理论的了解和对Linux内核整体的把握,想修改Linux为你所用是不太可能的。
建议楼主最好看看有关操作系统的教材还有Linux源代码分析的一些教材。
我的意思 是对linux 的启动和内核做一部分的修改
让他成为我的os。



一个极简单的javascript问题 问个sql语句 .net开发框架的问题。高手做答 关于查询的一个问题 怎么知道访客是通过哪个网站的连接跳转到我的网站的? js动态改变table tomcat启动不起来是怎么回事啊? 所谓的DONE_IN_PROC 信息是指什么? GDI的小问题(高分等候) 所谓的DONE_IN_PROC 信息是指什么? 配置asp.net服务器 求一个在C#中合计动态列行的值给新创建的列行中显示 设置了对话框背景图片的情况下如何让radio控件透明 急求VS2005装SP1的办法。急急! HttpWebRequest访问返回404错误 xml作数据库的两个小问题? 求助可以显示图标的Tab control封装类? *******************vb传递数组到dll的问题*************************** 问题大了!!!pictureBox显示图片出gdi+中发生一般性错误。 生成的静态页面是乱码?? serverx.exe 怎样彻底清除 Convert.IsDBNull 一个简单的shell编程,帮忙看看 关于struts使用html:select标签的问题 *******************vb传递数组到dll的问题*************************** 请问如何用命令行或者脚本的方式(非GUI方式)给IIS网站上安装证明书? 关于流量统计系统的地区统计问题!请教了~~ 最最简单的存储过程,不会搞,-----带两个参数的删除语句 wsad为什么不能调试 求合并字符串为控件名的函数