linux 启动分析 linux 开机启动

大家好,linux 启动分析相信很多的网友都不是很明白,包括linux 开机启动也是一样,不过没有关系,接下来就来为大家分享关于linux 启动分析和linux 开机启动的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

Linux系统开机时启动内核步骤是什么

实模式,并开始执行位于地址0xFFFF0处

的代码,也就是ROM-BIOS起始位置的代码。BIOS先进行一系列的系统自检,然后初始化位

于地址0的中断向量表。最后BIOS将启动盘的第一个扇区装入到0x7C00,并开始执行此处

的代码。这就是对内核初始化过程的一个最简单的描述。

最初,linux核心的最开始部分是用8086汇编语言编写的。当开始运行时,核心将自

己装入到绝对地址0x90000,再将其后的2k字节装入到地址0x90200处,最后将核心的其余

部分装入到0x10000。

当系统装入时,会显示Loading...信息。装入完成后,控制转向另一个实模式下的汇

编语言代码boot/Setup.S。Setup部分首先设置一些系统的硬件设备,然后将核心从

0x10000处移至0x1000处。这时系统转入保护模式,开始执行位于0x1000处的代码。

接下来是内核的解压缩。0x1000处的代码来自于文件Boot/head.S,它用来初始化寄

存器和调用decompress_kernel()程序。decompress_kernel()程序由Boot/inflate.c,

Boot/unzip.c和Boot../misc.c组成。解压缩后的数据被装入到了0x100000处,这也是

linux不能在内存小于2M的环境下运行的主要原因。

解压后的代码在0x1010000处开始执行,紧接着所有的32位的设置都将完成: IDT、

GDT和LDT将被装入,处理器初始化完毕,设置好内存页面,最终调用start_kernel过程。

这大概是整个内核中最为复杂的部分。

[系统开始运行]

linux kernel最早的C代码从汇编标记startup_32开始执行

startup_32:

start_kernel

lock_kernel

trap_init

init_IRQ

sched_init

softirq_init

time_init

console_init

#ifdef CONFIG_MODULES

init_modules

#endif

kmem_cache_init

sti

calibrate_delay

mem_init

kmem_cache_sizes_init

pgtable_cache_init

fork_init

proc_caches_init

vfs_caches_init

buffer_init

page_cache_init

signals_init

#ifdef CONFIG_PROC_FS

proc_root_init

#endif

#if defined(CONFIG_SYSVIPC)

ipc_init

#endif

check_bugs

smp_init

rest_init

kernel_thread

unlock_kernel

cpu_idle

・startup_32 [arch/i386/kernel/head.S]

・start_kernel [init/main.c]

・lock_kernel [include/asm/smplock.h]

・trap_init [arch/i386/kernel/traps.c]

・init_IRQ [arch/i386/kernel/i8259.c]

・sched_init [kernel/sched.c]

・softirq_init [kernel/softirq.c]

・time_init [arch/i386/kernel/time.c]

・console_init [drivers/char/tty_io.c]

・init_modules [kernel/module.c]

・kmem_cache_init [mm/slab.c]

・sti [include/asm/system.h]

・calibrate_delay [init/main.c]

・mem_init [arch/i386/mm/init.c]

・kmem_cache_sizes_init [mm/slab.c]

・pgtable_cache_init [arch/i386/mm/init.c]

・fork_init [kernel/fork.c]

・proc_caches_init

・vfs_caches_init [fs/dcache.c]

・buffer_init [fs/buffer.c]

・page_cache_init [mm/filemap.c]

・signals_init [kernel/signal.c]

・proc_root_init [fs/proc/root.c]

・ipc_init [ipc/util.c]

・check_bugs [include/asm/bugs.h]

・smp_init [init/main.c]

・rest_init

・kernel_thread [arch/i386/kernel/process.c]

・unlock_kernel [include/asm/smplock.h]

・cpu_idle [arch/i386/kernel/process.c]

start_kernel()程序用于初始化系统内核的各个部分,包括:

*设置内存边界,调用paging_init()初始化内存页面。

*初始化陷阱,中断通道和调度。

*对命令行进行语法分析。

*初始化设备驱动程序和磁盘缓冲区。

*校对延迟循环。

最后的function'rest_init'作了以下工作:

・开辟内核线程'init'

・调用unlock_kernel

・建立内核运行的cpu_idle环,如果没有调度,就一直死循环

实际上start_kernel永远不能终止.它会无穷地循环执行cpu_idle.

最后,系统核心转向move_to_user_mode(),以便创建初始化进程(init)。此后,进程0开始进入无限循环。

初始化进程开始执行/etc/init、/bin/init或/sbin/init中的一个之后,系统内核就不再对程序进行直接控制了。之后系统内核的作用主要是给进程提供系统调用,以及提供异步中断事件的处理。多任务机制已经建立起来,并开始处理多个用户的登录和fork()创建的进程。

[init]

init是第一个进程,或者说内核线程

init

lock_kernel

do_basic_setup

mtrr_init

sysctl_init

pci_init

sock_init

start_context_thread

do_init_calls

(*call())-> kswapd_init

prepare_namespace

free_initmem

unlock_kernel

execve

[目录]

--------------------------------------------------------------------------------

启动步骤

系统引导:

涉及的文件

./arch/$ARCH/boot/bootsect.s

./arch/$ARCH/boot/setup.s

bootsect.S

这个程序是linux kernel的第一个程序,包括了linux自己的bootstrap程序,

但是在说明这个程序前,必须先说明一般IBM PC开机时的动作(此处的开机是指

"打开PC的电源"):

一般PC在电源一开时,是由内存中地址FFFF:0000开始执行(这个地址一定

在ROM BIOS中,ROM BIOS一般是在FEOOOh到FFFFFh中),而此处的内容则是一个

jump指令,jump到另一个位於ROM BIOS中的位置,开始执行一系列的动作,包

括了检查RAM,keyboard,显示器,软硬磁盘等等,这些动作是由系统测试代码

(system test code)来执行的,随着制作BIOS厂商的不同而会有些许差异,但都

是大同小异,读者可自行观察自家机器开机时,萤幕上所显示的检查讯息。

紧接着系统测试码之后,控制权会转移给ROM中的启动程序

(ROM bootstrap routine),这个程序会将磁盘上的第零轨第零扇区读入

内存中(这就是一般所谓的boot sector,如果你曾接触过电脑病

毒,就大概听过它的大名),至於被读到内存的哪里呢?--绝对

位置07C0:0000(即07C00h处),这是IBM系列PC的特性。而位在linux开机

磁盘的boot sector上的正是linux的bootsect程序,也就是说,bootsect是

第一个被读入内存中并执行的程序。现在,我们可以开始来

看看到底bootsect做了什么。

第一步

首先,bootsect将它"自己"从被ROM BIOS载入的绝对地址0x7C00处搬到

0x90000处,然后利用一个jmpi(jump indirectly)的指令,跳到新位置的

jmpi的下一行去执行,

第二步

接着,将其他segment registers包括DS,ES,SS都指向0x9000这个位置,

与CS看齐。另外将SP及DX指向一任意位移地址( offset),这个地址等一下

会用来存放磁盘参数表(disk para- meter table)

第三步

接着利用BIOS中断服务int 13h的第0号功能,重置磁盘控制器,使得刚才

的设定发挥功能。

第四步

完成重置磁盘控制器之后,bootsect就从磁盘上读入紧邻着bootsect的setup

程序,也就是setup.S,此读入动作是利用BIOS中断服务int 13h的第2号功能。

setup的image将会读入至程序所指定的内存绝对地址0x90200处,也就是在内存

中紧邻着bootsect所在的位置。待setup的image读入内存后,利用BIOS中断服

务int 13h的第8号功能读取目前磁盘的参数。

第五步

再来,就要读入真正linux的kernel了,也就是你可以在linux的根目录下看

到的"vmlinuz"。在读入前,将会先呼叫BIOS中断服务int 10h的第3号功能,

读取游标位置,之后再呼叫BIOS中断服务int 10h的第13h号功能,在萤幕上输

出字串"Loading",这个字串在boot linux时都会首先被看到,相信大家应该觉

得很眼熟吧。

第六步

接下来做的事是检查root device,之后就仿照一开始的方法,利用indirect

jump跳至刚刚已读入的setup部份

第七步

setup.S完成在实模式下版本检查,并将硬盘,鼠标,内存参数写入到 INITSEG

中,并负责进入保护模式。

第八步

操作系统的初始化。

linux mint 启动进入了busybox怎么处理

在Linux内核启动过程中,第一个运行的进程是init进程。这个进程的来源是哪里呢?实际上,init进程是由Linux内核启动时调用的一个工具——busybox提供的。busybox是一个非常小巧的工具,它的主要功能是在我们创建文件系统时提供一些常用的命令,例如ls、cp、cd等。这些命令实际上是调用了busybox中的相应函数。

在busybox中,确实包含了一个init进程的函数。这个函数是从init_post开始执行的。在init_post函数中,会打开三个终端,分别是stdin、stdout和stderr,还有一个叫做stdnull的终端。通过一系列的初始化操作,busybox会进入一个死循环,从而执行相应的操作。

当我们分析busybox时,经常会看到一个叫做inittab的文件,这个文件的主要作用是定义系统运行级别以及启动的服务。另外,我们还会看到一个叫做/linuxrc的文件,它用于初始化运行环境,以及一系列的rcs脚本,这些脚本用于执行各种初始化任务,例如设置环境变量、加载模块等。

这些配置文件和应用程序在Linux系统的启动过程中扮演着重要角色。inittab文件定义了系统启动时的行为,/linuxrc文件用于设置运行环境,而rcs脚本则执行具体的初始化任务。通过这些配置文件和应用程序的协同工作,Linux系统能够顺利启动并运行。

总之,busybox作为init进程的提供者,在Linux系统的启动过程中起到了至关重要的作用。理解busybox的工作原理和相关配置文件的作用,有助于我们更好地掌握Linux系统的启动过程。

linux 好用的命令

Linux运维人员必会的120个命令

跟老男孩学Linux运维:核心系统命令实战

前言

第1章 Linux命令行简介/ 1

1.1Linux命令行概述/ 1

1.2在Linux命令行下查看命令帮助/ 4

1.3Linux shutdown reboot halt/ 9

关机:

shutdown-h now

halt

init 0

第2章文件和目录操作命令/ 13

2.1pwd:显示当前所在的位置/ 13

2.2cd:切换目录/ 16

2.3tree:以树形结构显示目录下的内容/ 18

2.4mkdir:创建目录/ 22

2.5touch:创建空文件或改变文件的时间戳属性/ 27

2.6ls:显示目录下的内容及相关属性信息/ 30

2.7cp:复制文件或目录/ 39

2.8mv:移动或重命名文件/ 42

2.9rm:删除文件或目录/ 45

2.10rmdir:删除空目录/ 48

2.11ln:硬链接与软链接/ 49

2.12readlink:查看符号链接文件的内容/ 54

2.13find:查找目录下的文件/ 55

2.14xargs:将标准输入转换成命令行参数/ 68

2.15rename:重命名文件/ 71

2.16basename:显示文件名或目录名/ 72

2.17dirname:显示文件或目录路径/ 72

2.18chattr:改变文件的扩展属性/ 73

2.19lsattr:查看文件扩展属性/ 75

2.20file:显示文件的类型/ 76

2.21md5sum:计算和校验文件的MD5值/ 77

2.22chown:改变文件或目录的用户和用户组/ 80

2.23chmod:改变文件或目录权限/ 81

2.24chgrp:更改文件用户组/ 85

2.25umask:显示或设置权限掩码/ 86

2.26老男孩从新手成为技术大牛的心法/ 90

第3章文件过滤及内容编辑处理命令/ 91

3.1cat:合并文件或查看文件内容/ 91

3.2tac:反向显示文件内容/ 103

3.3more:分页显示文件内容/ 104

3.4less:分页显示文件内容/ 107

3.5head:显示文件内容头部/ 109

3.6tail:显示文件内容尾部/ 111

3.7tailf:跟踪日志文件/ 114

3.8cut:从文本中提取一段文字并输出/ 115

3.9split:分割文件/ 117

3.10paste:合并文件/ 118

3.11sort:文本排序/ 123

3.12join:按两个文件的相同字段合并/ 127

3.13uniq:去除重复行/ 129

3.14wc:统计文件的行数、单词数或字节数/ 131

3.15iconv:转换文件的编码格式/ 133

3.16dos2unix:将DOS格式文件转换成UNIX格式/ 134

3.17diff:比较两个文件的不同/ 135

3.18vimdiff:可视化比较工具/ 138

3.19rev:反向输出文件内容/ 139

3.20tr:替换或删除字符/ 140

3.21od:按不同进制显示文件/ 143

3.22tee:多重定向/ 145

3.23vi/vim:纯文本编辑器/ 147

3.24老男孩逆袭思想:做Linux运维的多个好处/ 152

第4章文本处理三剑客/ 153

4.1grep:文本过滤工具/ 153

4.2sed:字符流编辑器/ 159

4.3awk基础入门/ 165

第5章 Linux信息显示与搜索文件命令/ 176

5.1uname:显示系统信息/ 176

5.2hostname:显示或设置系统的主机名/ 178

5.3dmesg:系统启动异常诊断/ 179

5.4stat:显示文件或文件系统状态/ 181

5.5du:统计磁盘空间使用情况/ 183

5.6date:显示与设置系统时间/ 186

5.7echo:显示一行文本/ 190

5.8watch:监视命令执行情况/ 193

5.9which:显示命令的全路径/ 195

5.10whereis:显示命令及其相关文件全路径/ 196

5.11locate:快速定位文件路径/ 197

5.12updatedb:更新mlocate数据库/ 199

5.13老男孩逆袭思想:新手在工作中如何问问题不会被鄙视/ 200

第6章文件备份与压缩命令/ 201

6.1tar:打包备份/ 201

6.2gzip:压缩或解压文件/ 208

6.3zip:打包和压缩文件/ 211

6.4unzip:解压zip文件/ 212

6.5scp:远程文件复制/ 214

6.6rsync:文件同步工具/ 216

6.7老男孩逆袭思想:新手如何高效地提问/ 220

第7章 Linux用户管理及用户信息查询命令/ 222

7.1 useradd:创建用户/ 222

7.2usermod:修改用户信息/ 227

7.3userdel:删除用户/ 229

7.4groupadd:创建新的用户组/ 230

7.5groupdel:删除用户组/ 231

7.6passwd:修改用户密码/ 232

7.7chage:修改用户密码有效期/ 237

7.8chpasswd:批量更新用户密码/ 238

7.9su:切换用户/ 240

7.10visudo:编辑sudoers文件/ 242

7.11sudo:以另一个用户身份执行命令/ 244

7.12id:显示用户与用户组的信息/ 248

7.13w:显示已登录用户信息/ 249

7.14who:显示已登录用户信息/ 250

7.15users:显示已登录用户/ 252

7.16whoami:显示当前登录的用户名/ 253

7.17last:显示用户登录列表/ 253

7.18lastb:显示用户登录失败的记录/ 254

7.19lastlog:显示所有用户的最近登录记录/ 255

第8章 Linux磁盘与文件系统管理命令/ 257

8.1fdisk:磁盘分区工具/ 257

8.2partprobe:更新内核的硬盘分区表信息/ 265

8.3tune2fs:调整ext2/ext3/ext4文件系统参数/ 266

8.4parted:磁盘分区工具/ 268

8.5mkfs:创建Linux文件系统/ 272

8.6dumpe2fs:导出ext2/ext3/ext4文件系统信息/ 274

8.7resize2fs:调整ext2/ext3/ext4文件系统大小/ 275

8.8fsck:检查并修复Linux文件系统/ 278

8.9dd:转换或复制文件/ 281

8.10mount:挂载文件系统/ 284

8.11umount:卸载文件系统/ 288

8.12df:报告文件系统磁盘空间的使用情况/ 289

8.13mkswap:创建交换分区/ 293

8.14swapon:激活交换分区/ 294

8.15swapoff:关闭交换分区/ 295

8.16sync:刷新文件系统缓冲区/ 296

第9章 Linux进程管理命令/ 298

9.1ps:查看进程/ 298

9.2pstree:显示进程状态树/ 305

9.3pgrep:查找匹配条件的进程/ 306

9.4kill:终止进程/ 307

9.5killall:通过进程名终止进程/ 310

9.6pkill:通过进程名终止进程/ 311

9.7top:实时显示系统中各个进程的资源占用状况/ 313

9.8nice:调整程序运行时的优先级/ 320

9.9renice:调整运行中的进程的优先级/ 323

9.10nohup:用户退出系统进程继续工作/ 324

9.11strace:跟踪进程的系统调用/ 325

9.12ltrace:跟踪进程调用库函数/ 332

9.13runlevel:输出当前运行级别/ 334

9.14init:初始化Linux进程/ 335

9.15service:管理系统服务/ 335

第10章 Linux网络管理命令/ 338

10.1ifconfig:配置或显示网络接口信息/ 338

10.2ifup:激活网络接口/ 343

ifup eth0

10.3ifdown:禁用网络接口/ 343

ifdown eth0

service network restart(/etc/init.d/network restart)激活整个网络,所有网卡。

10.4route:显示或管理路由表/ 344

10.5arp:管理系统的arp缓存/ 350

10.6ip:网络配置工具/ 351

10.7netstat:查看网络状态/ 358

10.8ss:查看网络状态/ 362

10.9ping:测试主机之间网络的连通性/ 363

10.10traceroute:追踪数据传输路由状况/ 366

10.11arping:发送arp请求/ 367

10.12telnet:远程登录主机/ 369

10.13nc:多功能网络工具/ 370

10.14ssh:安全地远程登录主机/ 373

10.15wget:命令行下载工具/ 376

10.16mailq:显示邮件传输队列/ 379

10.17mail:发送和接收邮件/ 381

10.18nslookup:域名查询工具/ 386

10.19dig:域名查询工具/ 389

10.20host:域名查询工具/ 393

10.21nmap:网络探测工具和安全/端口扫描器/ 394

10.22tcpdump:监听网络流量/ 398

第11章 Linux系统管理命令/ 407

11.1lsof:查看进程打开的文件/ 407

11.2uptime:显示系统的运行时间及负载/ 411

11.3free:查看系统内存信息/ 411

11.4iftop:动态显示网络接口流量信息/ 413

11.5vmstat:虚拟内存统计/ 415

11.6mpstat:CPU信息统计/ 419

11.7iostat:I/O信息统计/ 420

11.8iotop:动态显示磁盘I/O统计信息/ 423

11.9sar:收集系统信息/ 425

11.10chkconfig:管理开机服务/ 430

11.11ntsysv:管理开机服务/ 433

11.12 setup:系统管理工具/ 434

11.13ethtool:查询网卡参数/ 436

11.14mii-tool:管理网络接口的状态/ 437

11.19rpm:RPM包管理器/ 443

11.20yum:自动化RPM包管理工具/ 446

top命令

第12章 Linux系统常用内置命令/ 450

12.1Linux内置命令概述/ 450

12.2Linux内置命令简介/ 450

12.3Linux常用内置命令实例/ 452

阅读剩余
THE END