深入分析LinuxMIPS的启动过程 (linux-mips启动分析)

深入分析Linux MIPS的启动过程

Linux是一种流行的开源操作系统,被广泛用于各种设备上。其中,MIPS是一种常见的处理器架构,因此,有很多设备使用Linux MIPS作为操作系统。本文将深入分析Linux MIPS的启动过程,以帮助读者了解Linux MIPS在启动时做了什么。

Boot Loader

在开机时,处理器会从ROM中读取之一个指令,这通常是一个Boot Loader。Boot Loader是一种小型程序,通常用于引导操作系统。在Linux MIPS中,Boot Loader通常是u-boot,它是由Denx开发的一款通用Boot Loader。

在运行Boot Loader时,它会首先进行硬件初始化,例如初始化DRAM和一些I/O设备。然后,它会检查存储设备,包括闪存,硬盘和SD卡等,找到Linux内核的二进制文件。Boot Loader将这个文件加载到内存中的一个地址,然后跳转到该地址,以使内核开始运行。

Linux内核

一旦Boot Loader完成了它的任务,它就会跳转到内核的入口点。在Linux MIPS中,内核的入口点通常为0x80010000。在跳转到内核时,Boot Loader会传递一些参数,例如内核和文件系统的地址。特别是,它会传递一个参数initrd,指向一个称为initramfs的文件系统。这个文件系统是一个临时文件系统,用于在加载根文件系统之前提供必要的驱动程序和文件。

一旦内核开始运行,它将初始化各种硬件设备并加载驱动程序。它还会解压缩initrd,并将其挂载到内核中。这个临时文件系统包含了许多驱动程序和其他配置文件,以便内核可以在加载根文件系统之前对硬件进行正确地初始化。内核还会检查并启动各种基础服务,例如系统日志和网络服务。

根文件系统

经过上述步骤后,内核将加载根文件系统。根文件系统是一个至关重要的部分,它包含了操作系统的所有用户空间程序和配置文件。在Linux MIPS中,根文件系统通常是一个ramdisk,即一个保存在内存中的文件系统。当然,也可以使用硬盘或网络文件系统等其他类型的根文件系统。

一旦根文件系统加载完毕,内核将启动init进程。init是Linux中的之一个用户进程,它是所有其他用户进程的祖先。init为启动和管理其他进程提供了必要的服务。例如,它会启动shell程序,并在必要时加载其他服务和守护进程。

在Linux MIPS的启动过程中,Boot Loader从存储设备中找到内核并将其加载到内存中。内核初始化硬件设备并加载驱动程序,然后解压缩initrd并挂载它。之后,内核加载根文件系统,并启动init进程。init进程为其他用户进程提供了服务,实现了系统的正常运行。

深入分析Linux MIPS的启动过程可以帮助我们更好地了解操作系统在启动时做了什么。只有深入了解操作系统的启动过程,我们才能更好地调试和优化它们。

相关问题拓展阅读:

怎样在 1 秒内启动 Linux

Linux内核的最初部分代码是用汇编语言写的(文件是boot/bootsect.s)。(我的汇编水平有限,暂且不看),它首先把自身这部分代码移到绝对地址0x90000,把下面的2K代码从引导设备加载到地址0x90200上,内核的其余部分加载到地址0x10000处。在加载系统时显示“loading”.然后,程序控制权交给另一个实模式汇编程序(boot/Setup.S)。接下来,此程序把整个系统从地址0x10000移到地址0x1000,进入保护模式。程序控制转给系统的其余部分即地址0x1000。下一个步骤是系统内核的解压过程,这部分代码在地址0x1000(文件/Boot/head.S),该段程序初始化寄存器,然后执行decompress_kernel(),这个函数源于zBoot/inflate.c、zBoot/unzip.c和zBoot/misc.c三个文件Loading .uncompress ..main.c —> start_kernel() 开始.开始 printk(banner);Linux version 2.2.6 (root@lance) (gcc version 2.7.2.3) (检查一下GCC 的版本号, 在/init/main.c 中如果gcc 的版本号不够,时不允许编译内核的)#40 Sun Apr 18 17:44:20 CST 1999调用init_time()打印出以下内容:DetectedHz processor.然后运行 console_init() –> drivers/char/tty_io.c */Console: colour VGA+ 80×25运行一个循环,测量一下 MIPS – 据说是要用一个确定的机器指令周期来实现实时的延迟.Calibrating delay loop 199.48 BogoMIPS初始化内存/* init_mem */Memory: 63396k/65536k available (848k kernel code, 408k reserved, 856k data, 28k/** dquote_init() **/VFS: Diskquotas version dquot_6.4.0 initialized察看cpu 的类型(在2.2.14 以后听说增加了对多种cpu 的支持, 以后我可得用心看看,if I can find a bug of intel then ……)CPU: Intel Pentium Pro stepping 09初始或处理器与协处理器,对于比较老的处理器, linux 会用软件模拟协处理器?Checking 386/387 coupling OK, FPU using exception 16 error reporting.检查治理的合法性Checking ‘hlt’ instruction OK.POSIX conformance testing by UNIFIX此后调用 linux_thread(init ,..,..,)(arch/i386/kernel/process.c)创建一个运行 init 的进程.进入了第二阶段用户模式 ( user_mode )End of start_kerne最后进入cpu_idle ( arch/i386/kernel/process.c )第二部分 设备的初始化对设备的初始化调用. init()—>do_basic_init()–+pci_init() 对pci 设备的初始化( 在main.c文件中有这样一段 ifdef PCI …..需要看一下)下面打印出结果:PCI: PCI BIOS revision 2.10 entry at 0xfd8d1PCI: Using configuration type 1PCI: Probing PCI hardware对Socket的初始化,socket_init() (这里也许就是linux 的网络秘密所在吧,以后我的注意) -Linux NET4.0 for Linux 2.2Based upon Swansea University Computer Society NET3.039NET4: Unix domain sockets 1.0 for Linux NET4.0.NET4: Linux TCP/IP 1.0 for NET4.0IP Protocols: ICMP, UDP, TCPStarting kswapd v 1.5 kswapd_setup()调用 device_setup()Detected PS/2 Mouse Port.初始化 声卡Sound initialization startedSound initialization complete初始化 软驱Floppy drive(s): fd0 is 1.44MFDC 0 is a National Semiconductor PC87306SCSI 设备的初始化(scsi0) found at PCI 13/0(scsi0) Wide Channel, SCSI ID=7, 16/255 SCBs(scsi0) Downloading sequencer code 419 instructions downloadedscsi0 : Adaptec AHA274x/284x/294x (EISA/VLB/PCI-Fast SCSI) 5.1.10/3.2.4scsi : 1 host.Vendor: SEAGATE Model: ST32155W Rev: 0596ype: Direct-Access ANSI SCSI revision: 02Detected scsi disk sda at scsi0, channel 0, id 0, lun 0Vendor: SEAGATE Model: ST32155W Rev: 0596Type: Direct-Access ANSI SCSI revision: 02Detected scsi disk sdb at scsi0, channel 0, id 1, lun 0scsi : detected 2 SCSI disks total.(scsi0:0:0:0) Synchronous at 40.0 Mbyte/sec, offset 8.SCSI device sda: hdwr sector= 512 bytes. Sectors= (scsi0:0:1:0) Synchronous at 40.0 Mbyte/sec, offset 8.SCSI device sdb: hdwr sector= 512 bytes. Sectors= Partition check: sda: sda1 |sdb: sdb1 sdb2 |安装 文件系统 filesystem_setup()安装设备驱动程序 mount_root()VFS: Mounted root (ext2 filesystem) readonly.Freeing unused kernel memory: 28k freedAdding Swap: 66540k swap-space (priority -1)Soundblaster audio driver Copyright (C) by Hannu SavolainenSB 3.01 detected OK (220)at 0x220 irq 5 dma 1YM3812 and OPL-3 driver Copyright (C) by Hannu Savolainen, Rob Hooftat 0x388NET4: AppleTalk 0.18 for Linux NET4.0eth0: Intel EtherExpress Pro 10/100 at 0xf800, 00:A0:C9:49:2F:FF, IRQ 9.Board assembly, Physical connectors present: RJ45Primary interface chip DP83840 PHY #1.DP83840 specific setup, setting register 23 to 8462.General self-test: passed.Serial sub-system self-test: passed.Internal registers self-test: passed.ROM checksum self-test: passed (0x49caa8d6).Receiver lock-up workaround activated.NET4: AppleTalk 0.18 for Linux NET4.0结束 do_basic_setup()open(“/dev/console”, O_RDWR, 0)开始执行 /in/init ( execv() )内核就此启动完毕

数据中心级别的硬件可以,主要是需要一个超强的pcie接口的固态硬盘,和一个足够强大的cpu,还要一个够大的内存。这样就可以瞬间启动linux,不过受限于linux启动流程,再快也不可能一秒完成,除非自定制Linux系统。

另外一个比较取巧的方法是不彻底关机,只让linux休眠,使用的时候按一下电源键,甚至动一下鼠标键盘,linux就可以被瞬间唤醒,并显示登陆界面或桌面

linux-mips启动分析的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux-mips启动分析,深入分析LinuxMIPS的启动过程,怎样在 1 秒内启动 Linux的信息别忘了在本站进行查找喔。


数据运维技术 » 深入分析LinuxMIPS的启动过程 (linux-mips启动分析)