linux内核启动时几个关键地址
Linux内核参数配置
Linux内核参数配置Linux在系统运⾏时修改内核参数(/proc/sys与/etc/sysctl.conf),⽽不需要重新引导系统,这个功能是通过/proc虚拟⽂件系统实现的。
在/proc/sys⽬录下存放着⼤多数的内核参数,并且设计成可以在系统运⾏的同时进⾏更改, 可以通过更改/proc/sys中内核参数对应的⽂件达到修改内核参数的⽬的(修改过后,保存配置⽂件就马上⾃动⽣效),不过重新启动机器后之前修改的参数值会失效,所以只能是⼀种临时参数变更⽅案。
(适合调试内核参数优化值的时候使⽤,如果设置值有问题,重启服务器还原原来的设置参数值了。
简单⽅便。
)但是如果调试内核参数优化值结束后,需要永久保存参数值,就要通过修改/etc/sysctl.conf内的内核参数来永久保存更改。
但只是修改sysctl⽂件内的参数值,确认保存修改⽂件后,设定的参数值并不会马上⽣效,如果想使参数值修改马上⽣效,并且不重启服务器,可以执⾏下⾯的命令:#sysctl –p下⾯介绍⼀下/proc/sys下内核⽂件与配置⽂件sysctl.conf中变量的对应关系:由于可以修改的内核参数都在/proc/sys⽬录下,所以sysctl.conf的变量名省略了⽬录的前⾯部分(/proc/sys)。
即将/proc/sys中的⽂件转换成sysctl中的变量依据下⾯两个简单的规则:1.去掉前⾯部分/proc/sys2.将⽂件名中的斜杠变为点这两条规则可以将/proc/sys中的任⼀⽂件名转换成sysctl中的变量名。
例如:/proc/sys/net/ipv4/ip_forward =》 net.ipv4.ip_forward/proc/sys/kernel/hostname =》 kernel.hostname可以使⽤下⾯命令查询所有可修改的变量名# sysctl –a、linux内核参数注释以下表格中红⾊字体为常⽤优化参数根据参数⽂件所处⽬录不同⽽进⾏分表整理下列⽂件所在⽬录:/proc/sys/net/ipv4/名称默认值建议值描述tcp_syn_retries51对于⼀个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。
linux,内核的物理内存分配的基本方式
Linux内核的物理内存分配基本方式在Linux内核中,物理内存分配的基本方式可以通过以下几个方面进行解释。
1. 内核启动阶段的物理内存分配在Linux内核启动阶段,内核需要为自身和各个子系统分配物理内存。
这个过程包括以下几个步骤:•内核从BIOS或者bootloader中获取系统的物理内存信息。
•内核根据系统的内存布局,将物理内存分成多个区域,如低端内存、高端内存等。
•内核为自身分配一部分物理内存,包括内核代码、数据、堆栈等。
•内核为各个子系统分配物理内存,如设备驱动、文件系统等。
2. 动态分配物理内存在运行时,Linux内核还需要动态分配物理内存来满足进程和内核的需求。
这个过程包括以下几个关键点:页框分配:内核使用页框作为最小的内存分配单位。
当一个进程或内核需要分配物理内存时,内核会使用页框分配算法来选择可用的物理页框。
页框可以通过使用位图或者链表等数据结构来管理。
伙伴系统:为了高效地管理和分配物理内存,Linux内核采用了伙伴系统。
伙伴系统将整个物理内存空间分成不同大小的块(通常是2的幂次方),每个块称为一个伙伴块。
当一个进程需要分配内存时,内核会在合适的伙伴块中找到一个合适大小的块来满足需求。
页面回收:当物理内存不足时,Linux内核会使用页面回收机制来回收部分物理内存。
页面回收可以通过将不再使用的内存页面写回硬盘,或者将内存页面移动到交换分区来实现。
回收后的物理内存可以重新分配给其他进程或内核使用。
3. 内存管理算法为了高效地管理物理内存,Linux内核采用了一些内存管理算法。
其中一些重要的算法包括:最先适应算法(First Fit):内核首先查找第一个满足分配要求的伙伴块。
这个算法简单直观,但可能导致伙伴块的碎片化。
最佳适应算法(Best Fit):内核在所有可用的伙伴块中选择最小的一个来满足分配需求。
这个算法可以减少碎片化,但需要更多的搜索开销。
循环首次适应算法(Next Fit):内核在上一次分配的位置开始搜索,直到找到第一个满足分配要求的伙伴块。
linux 系统启动相关路径
linux 系统启动相关路径
在Linux 系统中,启动相关的路径通常包括以下几个:
1. /etc/init.d/:这个目录存放了系统中的服务脚本文件,这些脚本文件可以通过chkconfig 命令设置服务的运行级别,从而控制服务的启动和停止。
2. /etc/rc.d/:这个目录也存放了系统中的服务脚本文件,与/etc/init.d/ 目录类似,这些脚本文件也可以通过chkconfig 命令设置服务的运行级别。
3. /etc/rc.local/:这个文件是一个特殊的脚本文件,它在系统启动时自动执行,可以用来执行一些在启动过程中需要执行的操作,如挂载磁盘分区、启动网络等。
4. /etc/fstab/:这个文件记录了系统中需要挂载的文件系统信息,包括磁盘分区的设备名称、挂载点、文件系统类型、挂载选项等。
5. /etc/sysconfig/network-scripts/:这个目录存放了系统中网络服务的配置文件,包括网络接口、DNS 服务器、网关等信息。
6. /usr/bin/:这个目录通常包含了一些用户和应用程序使用的工具和脚本文件,例如ssh、scp、wget 等。
7. /usr/local/bin/:这个目录通常存放了用户自定义的命令和脚本文件,例如一些自己编写的工具和脚本文件。
8. /var/run/:这个目录存放了系统中运行的进程的信息,包括进程ID、父进程ID、挂载点等。
9. /var/log/:这个目录存放了系统中的日志文件,包括系统日志、应用程序日志等。
以上是一些常见的Linux 系统启动相关的路径和文件,具体路径和文件可能会因Linux 发行版和版本而有所不同。
linux中的绝对路径和相对路径
linux中的绝对路径和相对路径绝对路径和相对路径是在Linux系统中用于指定文件或目录位置的两种不同方式。
它们在文件系统中起到了重要的作用,并且在命令行操作和脚本编写中经常使用。
首先,绝对路径是从文件系统的根目录开始的路径表示方法。
根目录在Linux系统中用“/”表示,所有的文件和目录都是从根目录开始的。
绝对路径可以完整地指定一个文件或目录的位置,不会受到当前工作目录的影响。
例如,/home/user/Documents表示用户“user”在根目录下的“Documents”目录。
相对路径是相对于当前工作目录的路径表示方法。
当前工作目录是命令行或脚本运行时所在的目录。
相对路径是相对于当前工作目录的位置来指定的,因此它们不需要完整的路径信息。
相对路径的使用方式取决于当前工作目录和所要操作的文件或目录的相对关系。
例如,假设当前工作目录是/home/user,一个文件在当前工作目录下的子目录“Documents”中,我们可以使用相对路径“Documents/file.txt”来表示该文件的位置。
绝对路径和相对路径在文件定位和执行命令时都有重要的应用。
当需要精确地引用一个文件或目录时,绝对路径是非常有用的选择。
它们提供了一种标准的、不受当前工作目录变化的方法。
比如,当我们需要访问系统文件或一些固定位置的配置文件时,绝对路径就派上用场了。
相对路径更适用于对于当前工作目录已知或已假定的情况下。
当我们处于一个特定的工作目录中,要操作或引用与该目录相关的文件时,使用相对路径更加方便。
相对路径可以让我们更快速地定位到文件或目录,无需关心绝对路径的长度和复杂性。
此外,相对路径也为脚本编写提供了一种灵活的方式。
当脚本需要引用多个文件或目录时,使用相对路径可以简化脚本的编写。
相对路径可以使脚本可移植性更强,因为它们不依赖于具体的文件系统结构。
为了更好地理解绝对路径和相对路径的使用,下面列举了一些常见的示例:1. 绝对路径示例:- /usr/bin:表示根目录下的usr目录中的bin目录。
linux内核启用参数
linux内核启用参数Linux内核启用参数是指在Linux系统启动时,可以通过设置参数来改变内核的行为和配置。
这些参数可以通过修改启动脚本或者在引导时通过命令行参数传递给内核。
我们来介绍一些常用的Linux内核启用参数。
1. root:指定根文件系统所在的设备或分区。
在启动时,内核会将根文件系统挂载到这个设备上,成为系统的根目录。
可以使用设备名称(如/dev/sda1)或者UUID(Universally Unique Identifier)来指定。
2. init:指定系统初始化进程的路径。
这个进程是系统启动后的第一个用户空间进程,负责初始化系统环境、启动其他进程等。
一般情况下,它的路径是/bin/init。
3. quiet:禁用内核启动时的冗长输出信息。
默认情况下,内核会将启动过程中的详细信息输出到控制台上,使用quiet参数可以减少这些输出,使启动过程更加简洁。
4. vga:指定启动时的图形模式。
可以通过设置不同的参数值来改变显示分辨率和颜色深度。
例如,vga=791表示使用1024x768分辨率,颜色深度为16位。
5. acpi:启用或禁用ACPI(Advanced Configuration and PowerInterface)功能。
ACPI是一种能够管理电源、温度、风扇等硬件的标准,通过设置acpi参数,可以控制是否启用ACPI功能。
6. noapic:禁用APIC(Advanced Programmable Interrupt Controller)功能。
APIC是用于处理系统中断的硬件设备,通过设置noapic参数,可以禁用APIC功能,解决一些不兼容的硬件问题。
7. nomodeset:禁用内核对图形模式的自动设置。
有些显卡驱动在启动时可能会导致系统冻结或无法启动,通过设置nomodeset参数,可以强制内核使用基本的VGA模式运行。
8. mem:指定系统可用的物理内存大小。
arm版本linux系统的启动流程
arm版本linux系统的启动流程ARM架构是一种常见的处理器架构,被广泛应用于嵌入式设备和移动设备中。
在ARM版本的Linux系统中,启动流程是非常重要的,它决定了系统如何从开机到正常运行。
本文将详细介绍ARM版本Linux系统的启动流程。
一、引导加载程序(Bootloader)引导加载程序是系统启动的第一阶段,它位于系统的固化存储器中,比如ROM或Flash。
在ARM版本的Linux系统中,常用的引导加载程序有U-Boot和GRUB等。
引导加载程序的主要功能是加载内核镜像到内存中,并将控制权转交给内核。
二、内核初始化引导加载程序将内核镜像加载到内存后,控制权被转交给内核。
内核初始化是系统启动的第二阶段,它主要完成以下几个步骤:1. 设置异常向量表:ARM架构中,异常是指硬件产生的中断或故障,比如系统调用、中断请求等。
内核需要设置异常向量表,以便正确处理异常。
2. 初始化处理器:内核对处理器进行初始化,包括设置页表、启用缓存、初始化中断控制器等。
3. 启动第一个进程:内核创建第一个用户进程(一般是init进程),并将控制权转交给它。
init进程是系统中所有其他进程的父进程,负责系统的初始化工作。
三、设备树(Device Tree)设备树是ARM版本Linux系统中的一种机制,用于描述硬件设备的相关信息。
在内核初始化过程中,内核会解析设备树,并建立设备树对象,以便后续的设备驱动程序使用。
设备树描述了硬件设备的类型、地址、中断等信息,以及设备之间的连接关系。
它使得内核能够在运行时自动识别和配置硬件设备,大大提高了系统的可移植性和灵活性。
四、启动初始化(Init)启动初始化是系统启动的第三阶段,它是用户空间的第一个进程(init进程)接管系统控制权后的操作。
启动初始化主要完成以下几个任务:1. 挂载根文件系统:启动初始化会挂载根文件系统,使得用户可以访问文件系统中的文件和目录。
2. 加载系统服务:启动初始化会加载并启动系统服务,比如网络服务、日志服务、时间同步服务等。
Linux启动过程详解_MBR和GRUB概述
MBR和GRUB概述Linux 的启动流程目前比较流行的方式主要是以下步骤:1、引导器(例如 GRUB)启动;2、内核启动;3、系统进程启动与配置。
本文以 GRUB 为研究对象,对 GRUB 启动与内核启动两个部分进行描述,关于系统进程的进一步启动与配置将用另一篇文章来说明。
常见的目录结构(以 CentOS 5.3 为例):/boot|-- System.map-2.6.18-128.el5|-- System.map-2.6.18-128.el5xen|-- config-2.6.18-128.el5|-- config-2.6.18-128.el5xen|-- initrd-2.6.18-128.el5.img|-- initrd-2.6.18-128.el5xen.img|-- lost+found|-- memtest86+-1.65|-- message|-- symvers-2.6.18-128.el5.gz|-- symvers-2.6.18-128.el5xen.gz|-- vmlinuz-2.6.18-128.el5|-- vmlinuz-2.6.18-128.el5xen|-- xen-syms-2.6.18-128.el5|-- xen.gz-2.6.18-128.el5`-- grub|-- device.map|-- e2fs_stage1_5|-- fat_stage1_5|-- ffs_stage1_5|-- grub.conf|-- iso9660_stage1_5|-- jfs_stage1_5|-- menu.lst -> ./grub.conf|-- minix_stage1_5|-- reiserfs_stage1_5|-- splash.xpm.gz|-- stage1|-- stage2|-- ufs2_stage1_5|-- vstafs_stage1_5`-- xfs_stage1_5图一: CentOS 5.3 的 /boot 目录目录分作两大部分,一个是 /boot 目录下除 grub 目录以外的所有文件,这些是 Linux 的内核以及内核启动相关的一些文件;另一个就是 grub 下的所有文件, GRUB 引导器启动所需要的所有文件都在 grub 目录下。
1)reboot 重启(2)init 6 重启(3)logo
1)reboot 重启(2)init 6 重启(3)logo1.1一般在linux中,我们重启会用到这三个命令:1.2 reboot命令重启动系统时是删除所有的进程,而不是平稳地终止它们。
因此,使用reboot命令可以快速地关闭系统,但如果还有其它用户在该系统上工作时,就会引起数据的丢失。
所以使用reboot命令的场合主要是在单用户模式。
'reboot'并不执行这些过程,reboot更是一个kernel级别的命令,不对应用使用shutdown脚本。
1.3 init是所有进程的祖先他是Linux系统操作中不可缺少的程序之一。
它的进程号始终为1所以发送TERM信号给init 会终止所有的用户进程守护进程等。
shutdown 就是使用这种机制。
init定义了7个运行级别(runlevel)init 0为关机init 6为重启。
’init 6‘基于一系列/etc/inittab文件,并且每个应用都会有一个相应shutdown脚本。
'init 6' 调用一系列shutdown脚本(/etc/rc0.d/K*)来使系统正常关机;1.4 shutdown命令可以安全地关闭或重启Linux系统,它在系统关闭之前给系统上的所有登录用户提示一条警告信息。
该命令还允许用户指定一个时间参数,可以是一个精确的时间,也可以是从现在开始的一个时间段。
精确时间的格式是hh:mm,表示小时和分钟,时间段由+ 和分钟数表示。
系统执行该命令后会自动进行数据同步的工作。
该命令的一般格式: shutdown [选项] [时间] [警告信息]命令中各选项的含义为:- k 并不真正关机而只是发出警告信息给所有用户- r 关机后立即重新启动- h 关机后不重新启动- f 快速关机重启动时跳过fsck- n 快速关机不经过init 程序- c 取消一个已经运行的shutdown请注意,该命令只能由超级用户使用。
linux_mips启动流程_存储相关
Linux-mips启动流程-存储相关linux内核启动的第一个阶段是从/arch/mips/kernel/head.s文件开始的。
而此处正是内核入口函数kernel_entry(),该函数定义在/arch/mips/kernel/head.s文件里。
kernel_entry()函数是体系结构相关的汇编语言,它首先初始化内核堆栈段,来为创建系统中的第一个进程进行准备,接着用一段循环将内核映像的未初始化数据段(bss段在_edata和_end之间)清零,最后跳转到/arch/mips/kernel/setup.c 中的start_kernel()初始化硬件平台相关的代码。
下面讲述start_kernel() 函数。
在这个函数中跟内存初始化的函数是setup_arch()。
第一部分:以函数调用关系为线索下面是函数之间调用关系的框图:第一章:start_kenel()->setup_arch()setup_arch(&command_line);每种体系结构都有自己的setup_arch() 函数,这些是体系结构相关的。
【如何确定编译那个体系结构的setup_arch() 函数呢?主要由linux 源码树顶层Makefile 中ARCH 变量来决定的。
例如:MIPS 体系结构的。
SUBARCH := mipsARCH ?= $(SUBARCH)】。
void __init setup_arch(char **cmdline_p){cpu_probe();调用函数cpu_probe(),该函数通过MIPS CPU的PRID寄存器来确定CPU类型,从而确定使用的指令集和其他一些CPU参数,如TLB等prom_init();prom_init() 函数是和硬件相关的,做一些低层的初始化,接受引导装载程序传给内核的参数,确定mips_machgroup,mips_machtype 这两个变量,这两个变量分别对应着相应的芯片组合开发板;cpu_report();打印cpu_probe() 函数检测到的CPU 的Processor ID。
Linux系统结构(由里到外)
Linux系统结构(由里到外)硬件->Kernel(驱动程序)->Shell(终端、接口)->外层应用程序Linux中的目录结构存放命令的目录:/bin系统工具;/sbin系统管理员应用工具;/usr/bin和/usr/sbin存放用户应用程序;/usr/local/bin/boot内核及其他系统启动所需文件/opt安装大的应用程序/tmp临时文件/lost+found系统修复过程中恢复的文件/root超级用户的主目录/etc配置文件所在目录启动引导程序/etc/lilo.conf /etc/grub.conf 多系统引导时,可设置默认启动的系统等等控制启动模式/etc/fstab/etc/profile增加环境变量等(修改PA TH等)如配置JA V A/J2EE开发环境/etc/ftp*――ftp的配置文件/etc/httpd――web服务器的配置文件/etc/ssh*――ssh的配置文件(安全登陆)一、虚拟机上网配置1.PC机的设置在“网络邻居”的属性里,点“本地连接”属性,点“高级”选项,Internet连接共享全选,“家庭网络连接”选“Vmware Network Adapter Vmnet1”,此时的“Vmware Network Adapter Vmnet1”的IP地址变成192.168.0.1。
2.虚拟机设置安装虚拟机时,硬件设置“网络连接”为:仅主机。
“开始”“系统设置”“网络”,激活设备eth0,静态设置的IP地址:192.168.0.2;255.255.255.0;192.168.0.1,DNS:202.206.1.31;202.206.1.32。
打开浏览器就可以上网了。
(注意:必须关闭防火墙)二、通讯(挂载)配置1.配置NFS“开始”->“安全级别配置”,安全级别:无防火墙(不然无法用NFS mount它)。
“开始”->“系统设置”->“服务器设置”->“服务”,将iptables服务的勾去掉,选中nfs。
linux中ip地址的配置文件
linux中ip地址的配置文件Linux是多用户和多任务操作系统,是网络操作系统的核心。
IP地址是网络中计算机或客户端的唯一标识,它可以帮助用户在网络中定位,让用户可以管理网络。
Linux操作系统定义了一个特殊的配置文件来实现IP地址的配置,称为Linux的IP地址配置文件。
Linux的IP地址配置文件位于/etc/sysconfig/network-scripts/ifcfg-eth0中,以文本文件的形式存储,文件名为ifcfg-eth0,eth0为物理网卡的设备名称。
该文件有六个基本设置,分别是BOOTPROTO, IPADDR, NETMASK, GATEWAY, DNS1和DNS2。
BOOTPROTO是网卡的启动协议,一般情况下,可以设置为dhcp 即可。
dhcp协议可以为设备自动分配IP地址,而不需要用户手动输入。
当设置为static时,需要用户手动输入IP地址。
IPADDR为IP地址,它由四个十进制数字组成,用点分割,称为IP地址的整数表示。
NETMASK是IP地址的子网掩码,可以根据网络状况进行设置。
GATEWAY是网关地址,它可以帮助将本机连接到其他网络,以便于访问其他网络上的计算机。
DNS1和DNS2分别是主DNS和备份DNS,用于解析域名。
在Linux中,用户可以使用命令行工具来配置IP地址。
命令su -者 sudo -i以获得root权限,然后使用命令 ifconfig eth0 [IPADDR] netmask [NETMASK]设置IP地址。
使用ifconfig命令可以显示出Linux服务器上的所有网络接口的信息,包括网络接口的MAC地址,IP地址,子网掩码等等。
如果需要更改Linux服务器上的IP地址,可以使用命令 ifconfig eth0 [IPADDR] netmask [NETMASK]实现,这将覆盖原来的IP地址信息。
在Linux系统中,用户可以使用ifconfig命令设置IP地址,但是在长期使用过程中,修改IP地址可能会导致一些问题,例如IP地址信息丢失,网络连接不稳定等。
linux启动级别的含义(init0-6)
linux启动级别的含义( init0-6)
0:停机 1:单用户形式,只root进行维护 2:多用户,不能使用net file system 3:完全多用户 5:图形化 4:安全模式 6:重启
其实,可以通过查看/etc/rc.d/中的rc*.d的文件来对比理解,不同的目录中包含的命令是不同的
init 0,对应的系统会运行,/etc/rc.d/rc0.d里指定的程序
S00killall、 S01halt
这两个都表示为终止进程
计算机及Linux操作系统开机启动过程详解
计算机及Linux操作系统开机启动过程详解从按下开机键开始的计算机启动过程:(主要包括从主板加载BIOS并执⾏、从磁盘加载启动区并执⾏、从磁盘加载操作系统并执⾏三步,是依次递进的,详情参阅)加载BIOS:按下开机键,主板ROM的BIOS被(被谁?)加载到到内存0xffff0处,CPU 将 PC 寄存器的值强制初始化为 0xffff0(⼀跳)。
执⾏BIOS代码:阶段1(0xffff0 处的内容):该⼊⼝地址处存的是⼀个跳转指令,跳转的⽬的地是内存0xfe05b位置,该位置存了BIOS的真正内容。
执⾏该跳转(⼆跳)。
阶段2(0xfe05b 处的内容):执⾏硬件检测、硬件初始化、建⽴中断向量表等⼯作后,找到磁盘上的启动区(或称引导区)加载到内存0x7c00位置,并跳转到该位置(三跳)。
执⾏启动区代码(0x7c00 处的内容):从磁盘加载OS内核到内存,与上⾯不同这⾥内存位置不是固定的了,并跳转到OS内核代码处(四跳)。
执⾏OS内核代码:包括开启分段机制、进⼊保护模式、开启中断机制等,执⾏完后系统由OS接⼿管理。
具体过程见下⽂“操作系统启动过程”部分。
整体过程概要:补充:BIOS位于主板ROM,启动时被加载到内存;启动区、OS位于磁盘,被先后加载到内存。
BIOS、启动区在内存的位置是固定的(为啥是这三个值?早期定死的);⽽OS在内存位置不是固定的。
启动区:若⼀个磁盘上0盘0道1扇区的内容(512B)的末两个字节为0x55、0xaa,则这该扇区会被BIOS识别为启动区,该磁盘会被当做可启动盘。
往⼀个磁盘烧录OS后之所以可以当做启动盘就是因为往该位置写⼊了这些特殊数据。
若装了多系统,则启动时会列出并让⽤户选择要启动的系统,这些系统就是根据上述条件被识别得到。
可见,⼀个程序只要其虚拟内存以0x7c00作为段地址,且按上述条件烧录到磁盘,则就可以被BIOS识别为启动区加载到内存执⾏。
因此,如果该程序逻辑中不是去加载OS⽽是直接输出数据,则该程序⾃⾝就是⼀个简洁的"操作系统"。
ARMlinux启动分析-Nathan.Yu的专栏-CSDN博客
ARMlinux启动分析-Nathan.Yu的专栏-CSDN博客linux启动分析(1)---bootloader启动内核过程我分析的是2.4.19的内核版本,是xscale的平台,参考了网上很多有价值的帖子,也加入了自己的一些看法,陆续总结成文字,今天是第一篇:内核一般是由bootloader来引导的,通过bootloader启动内核一般要传递三个参数,第一个参数放在寄存器0中,一般都为0,r0 = 0;第二个参数放在寄存器1中,是机器类型id,r1 = Machine Type Number;第三个参数放在寄存器2中,是启动参数标记列表在ram中的起始基地址;bootloader首先要将ramdisk(如果有)和内核拷贝到ram当中,然后可以通过c语言的模式启动内核:void (*startkernel)(int zero, int arch, unsigned int params_addr) = (void(*)(int, int, unsigned int))KERNEL_RAM_BASE;startkernel(0, ARCH_NUMBER, (unsigned int)kernel_params_start);其中KERNEL_RAM_BASE为内核在ram中启动的地址,ARCH_NUMBER是Machine Type Number,kernel_params_start 是参数在ram的偏移地址。
这时候就将全力交给了内核。
linux启动分析(2)---内核启动地址的确定内核编译链接过程是依靠vmlinux.lds文件,以arm为例vmlinux.lds文件位于kernel/arch/arm/vmlinux.lds,但是该文件是由vmlinux-armv.lds.in生成的,根据编译选项的不同源文件还可以是vmlinux-armo.lds.in,vmlinux-armv-xip.lds.in。
Linux环境下启动、停止、重启nginx
Linux环境下启动、停⽌、重启nginx 启动
启动代码格式:nginx安装⽬录地址 -c nginx配置⽂件地址
例如:
[root@LinuxServer sbin]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
停⽌
nginx的停⽌有三种⽅式:
从容停⽌
1、查看进程号
[root@LinuxServer ~]# ps -ef|grep nginx
2、杀死进程
[root@LinuxServer ~]# kill -QUIT 2072
快速停⽌
1、查看进程号
[root@LinuxServer ~]# ps -ef|grep nginx
2、杀死进程
[root@LinuxServer ~]# kill -TERM 2132
[root@LinuxServer ~]# kill -INT 2132
强制停⽌
[root@LinuxServer ~]# pkill -9 nginx
重启
1、验证nginx配置⽂件是否正确
⽅法⼀:进⼊nginx安装⽬录sbin下,输⼊命令./nginx -t
看到如下显⽰nginx.conf syntax is ok
nginx.conf test is successful
说明配置⽂件正确!
⽅法⼆:在启动命令-c前加-t
2、重启Nginx服务
⽅法⼀:进⼊nginx可执⾏⽬录sbin下,输⼊命令./nginx -s reload 即可
⽅法⼆:查找当前nginx进程号,然后输⼊命令:kill -HUP 进程号实现重启nginx服务。
Linux考试必考试题及答案整理1
Linux考试必考试题及答案整理Li nux 考试试题及答案整理一.填空题:1 . 在 Li nux 系统中,以文件方式访问设备。
2. Li nux 内核引导时,从文件 /etc/fstab 中读取要加载的文件系统。
3. Li nux 文件系统中每个文件用 i 节点来标识。
4. 全部磁盘块由四个部分组成,分别为引导块、专用块、i 节点表块和数据存储块。
5. 链接分为:硬链接和符号链接。
6. 超级块包含了 i 节点表和空闲块表等重要的文件系统信息。
7. 某文件的权限为:d-rw-_r--_r--,用数值形式表示该权限,则该八进制数为: 644 ,该文件属性是目录。
8. 前台起动的进程使用 Ctrl +c 终止。
9. 静态路由设定后,若网络拓扑结构发生变化,需由系统管理员修改路由的设置。
1 0. 网络管理的重要任务是:控制和监控。
1 1 . 安装 Li nux 系统对硬盘分区时,必须有两种分区类1/ 3型:文件系统分区和交换分区。
1 3. 编写的 Shel l 程序运行前必须赋予该脚本文件执行权限。
1 4. 系统管理的任务之一是能够在分布式环境中实现对程序和数据的安全保护、备份、恢复和更新。
1 5. 系统交换分区是作为系统虚拟存储器的一块区域。
1 6. 内核分为进程管理系统、内存管理系统、 I /O 管理系统和文件管理系统等四个子系统。
1 7. 内核配置是系统管理员在改变系统配置硬件时要进行的重要操作。
1 8. 在安装 Li nux 系统中,使用 netconfi g 程序对网络进行配置,该安装程序会一步步提示用户输入主机名、域名、域名服务器、 I P 地址、网关地址和子网掩码等必要信息。
1 9. 唯一标识每一个用户的是用户 I D 和用户名。
20 . RI P 协议是最为普遍的一种内部协议,一般称为动态路由信息协议。
21 . 在 Li nux 系统中所有内容都被表示为文件,组织文件的各种方法称为文件系统。
UBOOT引导Linux内核及向内核传递参数的方式
UBOOT引导Linux内核及向内核传递参数的⽅式 ⼀直以来没有想过有什么好的办法通过寄存器向内核传递参数,直到今天读UBOOT的实现⽅式。
在UBOOT中,引导内核最常⽤的⽅法是bootm命令,bootm命令可以引导“UBOOT格式”的内核。
先花点时间了解⼀下什么是“UBOOT格式”的内核吧:⽤UBOOT⾃带的mkimage命令⽣成的内核称为"UBOOT"格式的内核。
以下⾯这条命令为例: mkimage -n "Kernel 2.4.18" -A arm -O linux -T kernel -C none -a30007fc0 -e 30008000 -d 4020.bin vmlinux-2.4.18.img 其中与内核引导最密切的是-e 30008000,也就是内核的⼊⼝地址。
其它参数可以参考帮助信息。
其它UBOOT格式的内核与原来相⽐,只是进⾏(可选)了压缩,并在前⾯加了⼀个0x40⼤⼩的头。
这个头⾥放了内核的位置(0x30007fc0)和⼊⼝地址(0x30008000)和其它信息。
bootm命令执⾏时,先对头部信息等进⾏校验,然后把头信息放到⼀个结构⾥⾯。
最后根据内核类型调⽤相应的启动函数。
对于Linux⽽⾔就是do_bootm_linux,在启动函数⾥⾯,有这么⼀个操作:theKernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep);,这是最关键的⼀个操作,将内核的⼊⼝地址0x30008000赋给了theKernel,在启动函数的最后,使⽤theKernel (0, bd->bi_arch_number, bd->bi_boot_params);启动内核。
根据传参规范,三个变量分别⽤r0,r1,r2传给内核,这样就巧妙地利⽤了函数指针进⾏了参数传递,实在是精妙!上⾯讲完了内核的引导及传参,需要引起注意的就是在使⽤mkimage命令⽣成内核时,-e后⾯的地址要⽐-a后⾯的地址偏移0x40,原因很简单,就不在细说了。
Linux0号进程,1号进程,2号进程
Linux0号进程,1号进程,2号进程 本节我们将从linux启动的第⼀个进程说起,以及后⾯第⼀个进程是如何启动1号进程,然后启动2号进程。
然后系统中所有的进程关系图做个简单的介绍⼀、0号进程 0号进程,通常也被称为idle进程,或者也称为swapper进程。
0号进程是linux启动的第⼀个进程,它的task_struct的comm字段为"swapper",所以也称为swpper进程。
1#define INIT_TASK_COMM "swapper" 当系统中所有的进程起来后,0号进程也就蜕化为idle进程,当⼀个core上没有任务可运⾏时就会去运⾏idle进程。
⼀旦运⾏idle进程则此core就可以进⼊低功耗模式了,在ARM上就是WFI。
我们本节重点关注是0号进程是如何启动的。
在linux内核中为0号进程专门定义了⼀个静态的task_struct的结构,称为init_task。
1/*2 * Set up the first task table, touch at your own risk!. Base=0,3 * limit=0x1fffff (=2MB)4*/5struct task_struct init_task6 = {7 #ifdef CONFIG_THREAD_INFO_IN_TASK8 .thread_info = INIT_THREAD_INFO(init_task),9 .stack_refcount = ATOMIC_INIT(1),10#endif11 .state = 0,12 .stack = init_stack,13 .usage = ATOMIC_INIT(2),14 .flags = PF_KTHREAD,15 .prio = MAX_PRIO - 20,16 .static_prio = MAX_PRIO - 20,17 .normal_prio = MAX_PRIO - 20,18 .policy = SCHED_NORMAL,19 .cpus_allowed = CPU_MASK_ALL,20 .nr_cpus_allowed= NR_CPUS,21 .mm = NULL,22 .active_mm = &init_mm,23 .tasks = LIST_HEAD_INIT(init_task.tasks),24 .ptraced = LIST_HEAD_INIT(init_task.ptraced),25 .ptrace_entry = LIST_HEAD_INIT(init_task.ptrace_entry),26 .real_parent = &init_task,27 .parent = &init_task,28 .children = LIST_HEAD_INIT(init_task.children),29 .sibling = LIST_HEAD_INIT(init_task.sibling),30 .group_leader = &init_task,31 RCU_POINTER_INITIALIZER(real_cred, &init_cred),32 RCU_POINTER_INITIALIZER(cred, &init_cred),33 .comm = INIT_TASK_COMM,34 .thread = INIT_THREAD,35 .fs = &init_fs,36 .files = &init_files,37 .signal = &init_signals,38 .sighand = &init_sighand,39 .blocked = {{0}},40 .alloc_lock = __SPIN_LOCK_UNLOCKED(init_task.alloc_lock),41 .journal_info = NULL,42 INIT_CPU_TIMERS(init_task)43 .pi_lock = __RAW_SPIN_LOCK_UNLOCKED(init_task.pi_lock),44 .timer_slack_ns = 50000, /* 50 usec default slack */45 .thread_pid = &init_struct_pid,46 .thread_group = LIST_HEAD_INIT(init_task.thread_group),47 .thread_node = LIST_HEAD_INIT(init_signals.thread_head),48 };49 EXPORT_SYMBOL(init_task); 这个结构体中的成员都是静态定义了,为了简单说明,对这个结构做了简单的删减。
Linuxinit详解(0,1,2,3,4,5,6)
Linuxinit详解(0,1,2,3,4,5,6)⼀、什么是 init init是Linux系统操作中不可缺少的程序之⼀。
所谓的init进程,它是⼀个由内核启动的⽤户级进程。
内核⾃⾏启动(已经被载⼊内存,开始运⾏,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动⼀个⽤户级程序init的⽅式,完成引导进程。
所以,init始终是第⼀个进程(其进程编号始终为1)。
内核会在过去曾使⽤过init的⼏个地⽅查找它,它的正确位置(对Linux系统来说)是/sbin/init。
如果内核找不到init,它就会试着运⾏/bin/sh,如果运⾏失败,系统的启动也会失败。
⼆、运⾏级别 那么,到底什么是运⾏级呢? 简单的说,运⾏级就是操作系统当前正在运⾏的功能级别。
这个级别从0到6 ,具有不同的功能。
不同的运⾏级定义如下:(可以参考Red Hat Linux ⾥⾯的/etc/inittab) 0 - 停机或者关机(千万不能把 initdefault 设置为0 ) 1 - 单⽤户模式(只有 root ⽤户进⾏维护) 2 - 多⽤户。
没有 NFS(Net File System) 3 - 完全多⽤户模式(标准的运⾏级) 4 - 没有⽤到 5 - X11,也称图形化(xwindow,即图形界⾯) 6 - 重新启动(千万不要把 initdefault 设置为 6 ) 这些级别在 /etc/inittab ⽂件⾥指定。
这个⽂件是 init 程序寻找的主要⽂件,最先运⾏的服务是放在 /etc/rc.d ⽬录下的⽂件。
在⼤多数的Linux 发⾏版本中,启动脚本都是位于 /etc/rc.d/init.d中的。
这些脚本被⽤ ln 命令连接到 /etc/rc.d/rcn.d ⽬录。
(这⾥的 n 就是运⾏级0-6) [root@test rc.d]# pwd/etc/rc.d[root@test rc.d]# lltotal 108drwxr-xr-x 2 root root 4096 Jan 32018 init.d-rwxr-xr-x 1 root root 2255 Dec 202011 rcdrwxr-xr-x 2 root root 4096 Nov 232017 rc0.ddrwxr-xr-x 2 root root 4096 Nov 232017 rc1.ddrwxr-xr-x 2 root root 4096 Nov 232017 rc2.ddrwxr-xr-x 2 root root 4096 Nov 232017 rc3.ddrwxr-xr-x 2 root root 4096 Nov 232017 rc4.ddrwxr-xr-x 2 root root 4096 Nov 232017 rc5.ddrwxr-xr-x 2 root root 4096 Nov 232017 rc6.d-rwxr-xr-x 1 root root 1434 Jan 102019 rc.local-rwxr-xr-x 1 root root 27052 Feb 222012 rc.sysinit查看当前系统的运⾏级别:[root@test ~]# runlevelN 3前⾯的参数N是系统之前运⾏级别,后边的3是系统当前的运⾏级别。
linux-mips启动分析
linux-mips启动分析(1)系统加电起动后,MIPS 处理器默认的程序入口是0xBFC00000,此地址在无缓存的KSEG1的地址区域内,对应的物理地址是0x1FC00000,即CPU从0x1FC00000开始取第一条指令,这个地址在硬件上已经确定为FLASH的位置,Bootloader将Linux 内核映像拷贝到RAM 中某个空闲地址处,然后一般有个内存移动操作,目的地址在arch/mips/Makefile 内指定:load-$(CONFIG_MIPS_PB1550) += 0xFFFFFFFF80100000,则最终bootloader定会将内核移到物理地址0x00100000 处。
上面Makefile 里指定的的load 地址,最后会被编译系统写入到arch/mips/kernel/vmlinux.lds 中:OUTPUT_ARCH(mips)ENTRY(kernel_entry)jiffies = jiffies_64;SECTIONS{. = 0xFFFFFFFF80100000;/* read-only */_text = .; /* Text and read-only data */.text : {*(.text)...这个文件最终会以参数-Xlinker --script -Xlinker vmlinux.lds 的形式传给gcc,并最终传给链接器ld 来控制其行为。
ld 会将 .text 节的地址链接到0xFFFFFFFF80100000 处。
关于内核ELF 文件的入口地址(Entry point),即bootloader 移动完内核后,直接跳转到的地址,由ld 写入ELF的头中,其会依次用下面的方法尝试设置入口点,当遇到成功时则停止:a. 命令行选项-e entryb. 脚本中的ENTRY(symbol)c. 如果有定义start 符号,则使用start符号(symbol)d. 如果存在 .text 节,则使用第一个字节的地址。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
linux内核启动时几个关键地址
1、名词解释
ZTEXTADDR
解压代码运行的开始地址。
没有物理地址和虚拟地址之分,因为此时MMU处于关闭状态。
这个地址不一定时RAM的地址,可以是支持读写寻址的flash等存储中介。
ZRELADDR
内核启动在RAM中的物理地址。
压缩的内核映像被解压到这个地址,然后执行。
This is the address where the decompressed kernel will be written, and eventually executed. The following constraint must be valid:
__virt_to_phys(TEXTADDR) == ZRELADDR
The initial part of the kernel is carefully coded to be position independent.
TEXTADDR
内核启动的虚拟地址,与ZRELADDR相对应。
一般内核启动的虚拟地址为RAM的第一个bank地址加上0x8000。
TEXTADDR = PAGE_OFFSET + TEXTOFFST
Virtual start address of kernel, normally PAGE_OFFSET + 0x8000.This is where the kernel image ends up. With the latest kernels, it must be located at 32768 bytes into a 128MB region. Previous kernels placed a restriction of 256MB here.
TEXT_OFFSET
内核偏移地址,即内核起始位置相对于内存起始位置的偏移,对于相对于物理内存还是相对于虚拟内存都是一样的结果。
在arch/arm/makefile中设定。
PHYS_OFFSET
RAM第一个bank的物理起始地址,即物理内存的起始地址。
Physical start address of the first bank of RAM.
PAGE_OFFSET
RAM第一个bank的虚拟起始地址,即内核虚拟地址空间的起始地址。
2、小结
从上面分析可知道,linux内核被bootloader拷贝到RAM后,解压代码从ZTEXTADDR开始运行(这段代码是与位置无关的PIC)。
内核被解压缩到ZREALADDR处,也就是内核启动的物理地址处。
相应地,内核启动的虚拟地址被设定为TEXTADDR,满足如下条件:
TEXTADDR = PAGE_OFFSET + TEXT_OFFSET
内核启动的物理地址和虚拟地址满足入下条件:
ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)= virt_to_phys(TEXTADDR)
假定开发板为smdk2410,则有:
内核启动的虚拟地址
TEXTADDR = 0xC0008000
内核启动的物理地址
ZRELADDR = 0x30008000
如果直接从flash中启动还需要设置ZTEXTADDR地址。