首页> 搜索结果页
"启动kernel" 检索
共 2785 条结果
《Android的设计与实现:卷I》——第3章 3.2Kernel启动过程
3.2 Kernel启动过程 Android Kernel启动过程与标准Linux Kernel的启动过程基本一致,都是对start_kernel函数的调用和执行。本节将分析Android正常启动流程的第二步:Kernel启动过程。 本节涉及的源码文件如下: kernel/arch/arm/kernel/head.Skernel /arch/arm/kernel/head-common.Skernel/init/main.cKernel启动过程分为两个阶段: 1)内核引导阶段。通常使用汇编语言编写,主要检查内核与当前硬件是否匹配。这部分也与硬件体系结构相关。内核引导阶段相关的代码主要位于 kernel /arch/arm/kernel/head.S和kernel /arch/arm/kernel/head-common.S。 2)内核启动阶段。引导阶段结束前,将调用start_kernel()进入内核启动阶段。内核启动阶段相关的代码主要位于kernel/init/main.c。 3.2.1 内核引导阶段 head.S是Linux内核启动的汇编程序入口,但head.S中并没有直接调用start_kernel()。可以先找到调用start_kernel()的函数,然后通过回溯法找到其调用的源头。 在head-common.S中可以找到start_kernel()的调用位置,代码如下:__INIT@函数 __mmap_switched__mmap_switched: @取 __mmap_switched_data的地址到r3 adr r3, __mmap_switched_data ……@省略部分代码,以下都是ARM汇编指令 ARM( ldmia r3, {r4, r5, r6, r7, sp}) THUMB( ldmia r3, {r4, r5, r6, r7}) THUMB( ldr sp, [r3, #16])……@省略部分代码 @这里真正调用了start_kernel b start_kernel @b指令是跳转指令@遇到b指令,处理器跳转到给定@的目标地址,从目标地址继续执行ENDPROC(__mmap_switched) 从head-common.S代码中可以看到,系统在__mmap_switched中通过b汇编指令调用了start_kernel。那么__mmap_switched又是在哪里被调用的呢?回到head.S这个汇编入口,代码如下: @ MMU可用后,将跳转到这个地址ldr r13, =__mmap_switched  adr lr, BSYM(1f) @ 返回地址 (PIC)@ set TTBR1 to swapper_pg_dir mov r8, r4   ARM(add pc, r10, #PROCINFO_INITFUNC ) THUMB(add r12, r10, #PROCINFO_INITFUNC ) THUMB(mov pc, r12)1:b __enable_mmu @启动MMUENDPROC(stext)这里将__mmap_switched的地址保存到r13,那pc指针又是什么时候指向r13的呢?在源码中搜索,发现是在turn_mmu_on结束之时将pc指针指向r13的。代码如下: .align 5__turn_mmu_on: ……@省略部分代码 mov r3, r13 @跳转到r13,即__mmap_switched mov pc, r3 @pc指针,指向当前要运行的指令__enable_mmu_end:ENDPROC(__turn_mmu_on)到这里,可以继续跟踪__turn_mmu_on是在哪里调用的。这很容易找到,系统通过b汇编指令跳转到__turn_mmu_on。代码如下:__enable_mmu:……@省略部分代码mov r5, #(domain_val(DOMAIN_USER, DOMAIN_MANAGER) | \ domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \ domain_val(DOMAIN_TABLE, DOMAIN_MANAGER) | \ domain_val(DOMAIN_IO, DOMAIN_CLIENT))@ load domain access register mcr p15, 0, r5, c3, c0, 0 @ load page table pointer mcr p15, 0, r4, c2, c0, 0 @系统在这里跳转到__turn_mmu_on b__turn_mmu_on ENDPROC(__enable_mmu) 到这里,可以看出start_kernel的调用流程:系统在开启MMU的时候,在函数__enable_mmu中调用__turn_mmu_on,然后__turn_mmu_on通过“mov r3, r13”和“mov pc, r3”两条指令调用__mmap_switched。而函数__mmap_switched是head-common.S中的函数,在该函数中调用start_kernel。 start_kernel函数是Linux内核通用的启动函数,也是汇编代码执行完毕后的第一个C语言函数,它的实现代码位于init/main.c中。start_kernel的代码比较复杂,其中做了很多软硬件初始化的工作,比如调用了setup_arch()、timer_init()、init_IRQ、console_init()。 3.2.2 内核启动阶段 内核初始化阶段结束时,通过调用start_kernel函数进入内核启动阶段。在内核启动阶段,首先进行一些应用级的初始化工作,最后调用rest_init函数启动init进程。init进程是Android用户空间的1号进程,担负Android运行环境启动的重要职责。本节首先分析内核启动阶段都做了哪些工作。这部分代码主要位于kernel/init/main.c,如下所示:asmlinkage void __init start_kernel(void){ ……//省略部分内容 local_irq_disable();//关闭当前CPU中断 early_boot_irqs_disabled = true; page_address_init(); //页地址初始化 printk(KERN_NOTICE "%s", linux_banner); //输出内核版本信息 setup_arch(&command_line); //体系结构相关的初始化 //command_line由bootloader传入 ……//省略部分内容 sched_init(); //初始化进程调度器  preempt_disable(); //禁止抢占 early_irq_init(); //初始化中断处理函数 init_IRQ();  init_timers(); //初始化定时器 hrtimers_init(); //高精度时钟的初始化 softirq_init(); //初始化软中断 time_init(); //初始化系统时间 profile_init(); //初始化内核性能调试工具profile early_boot_irqs_disabled = false; local_irq_enable(); //打开IRQ中断 console_init(); //初始化控制台显示printk打印的内容 //在此之前调用的printk只是缓存信息 fork_init(totalram_pages); //计算允许创建进程的数量 ……//省略部分内容 signals_init(); //初始化信号量 ftrace_init(); rest_init(); //创建init进程} start_kernel的源代码可以分成以下两部分: 1)C部分的初始化过程。2)调用rest_init创建init进程。如果读者对C部分的初始化感兴趣,可以参考专门介绍Linux内核的书。本书将重点放在init进程创建过程。定位到rest_init方法的实现部分,代码如下:static noinline void __init_refok rest_init(void){ int pid; rcu_scheduler_starting(); /*通过kernel_thread启动内核线程,执行kernel_init函数,此函数首先创建了init进程,以使其成为1号进程/ kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND); numa_default_policy(); /启动内核线程kthreadd / pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES); ……//省略部分代码 /调用schedule,释放当前线程占用的CPU,以激活其他线程/ schedule(); preempt_disable(); /调用cpu_idle,使当前线程变成idle线程,减少系统资源占用/ cpu_idle();} rest_init中的主要任务是通过kernel_thread启动了两个内核线程。kernel_thread的实现代码位于kernel/common/arch/arm/kernel/process.c,函数原型如下: pid_t kernel_thread(int (fn)(void ), void *arg, unsigned long flags)kernel_thread用来启动一个内核线程,第一个参数fn是要执行的函数的指针;第二个参数arg是传递给该函数的参数;第三个参数flags为do_fork创建线程时的标志。对于rest_init 方法中第一个kernel_thread调用,实际上调用了kernel_init函数。进入kernel_init函数体一看究竟,代码如下:static int __init kernel_init(void unused){ wait_for_completion(&kthreadd_done); set_mems_allowed(node_states[N_HIGH_MEMORY]); set_cpus_allowed_ptr(current, cpu_all_mask); cad_pid = task_pid(current); ……//省略多CPU激活部分代码 do_basic_setup();//驱动程序和内核子系统的一般初始化 ……//省略部分代码 //定义init进程 if (!ramdisk_execute_command)ramdidk_execute_command="/init"; if (sys_access( (const char __user *) ramdisk_execute_command, 0) != 0) { ramdisk_execute_command = NULL; prepare_namespace(); } //最后调用init_post,启动进程负责用户空间的初始化 init_post(); return 0;}kernel_init方法中,前面的部分做了一些初始化工作,然后定义了init进程的位置,接着就调用了init_post函数。接下来定位到init_post的函数体,代码如下:static noinline int init_post(void){ ……//省略部分代码 if (ramdisk_execute_command) { //run_init_process执行后将不再返回 run_init_process(ramdisk_execute_command); } if (execute_command) { run_init_process(execute_command); } run_init_process("/sbin/init"); run_init_process("/etc/init"); run_init_process("/bin/init"); run_init_process("/bin/sh");}execute_command 是bootloader传递给内核的参数,一般是/init(即根目录下的init程序),也就是调用文件系统里的init进程。如果找不到就会继续寻找“/sbin/init”、“/etc/init”、“/bin/init”、“/bin/sh”,找到后便执行run_init_process,且不再返回。run_init_process的函数体非常简单,仅仅是对kernel_execve函数的封装,代码如下:static void run_init_process(const char *init_filename){ argv_init[0] = init_filename; kernel_execve(init_filename, argv_init, envp_init);}kernel_execve是Linux内核中创建用户进程的方法接口,其实现位于arch/arm/kernel/sys_arm.c,这里不详述。至此,已经对Android Kernel如何引导以及用户空间1号进程(init进程)如何启动做了详细分析。如果读者并不熟悉Linux和汇编语言也不要紧,这不影响继续分析Android的启动过程。接下来,将详细分析Android init进程的执行过程。
文章
Linux · Android开发 · Shell · 调度 · C语言 · 缓存
2017-08-04
linux启动过程
1.打开电源,机器自检; 2.读取BIOS信息,并依据设置取得第一个可启动设; 3.读取并执行该启动设备的MBR中的bootLoader(如果有多个系统,还会根据选择的系统和MBR中的信息跳转到相应的分区); 4.依据bootLoader解压并加载kernel信息,kernel加载后开始检测硬件并加载驱动程序; 5.在硬件驱动成功后,kernel会主动调用init进程,而init进程会取得run-level信息; 6.init执行/etc/rc.d/rc.sysinit文件来准备软件执行的系统环境(比如网络、时区等); 7.init执行run-level各服务的启动(脚本方式); 8.init执行/etc/rc.d/rc.local文件(自己的程序如果想在开机时启动可以在这里添加); 9.init通过终端模拟程序mingetty启动login进程,进入登录界面等待用户登录。
文章
Linux
2015-04-10
/boot/grub/grub.conf文件详解
      grub.conf是grub的主配置文件,通过这个配置文件,grub才能找到kernel,系统才能正常启动。下面我们来解析一下这个文件中所有到的一下关键字的意思:      default:定义默认启动的kernel或是操作系统        timeout:定义等待进入选择kernel或操作系统菜单的时间        splashimage:指定我们选择kernel或操作系统菜单后面那张图片。如果定义,这张图片需要用linux自带的软件xmp制作,在图形界面可以打开。图片的特点为:      1,必须是xpm的格式        2,必须用gzip压缩         3,最多使用14位的颜色位数        4,分辨率640*480        hiddenmenu:表示隐藏选择kernel或操作系统菜单,只有出现等待界面后按下enter键才会出现。如果没有这个字段,则每次系统启动都会出现这个选择菜单。        password:设定密码。放在title外表示进入kernel或操作系统的编辑模式需要密码,而放在title内表示启动对应的kernel或操作系统需要密码,密码可以是明文或是用MD5进行加密过的。可以防止其他人进入编辑kernel菜单进入单用户模式启动我们的系统        title identify:指定一个kernel或是一个操作系统,linux中可以有多个title;identify是这个kernel或操作系统的识别符,可以随意写。        root:用于指定grub所能识别的根,而不是根文件系统。        kernel:用于指定系统的内核文件的位置        initrd:帮助kernel完成系统的启动,例如加载根文件系统所在分区的驱动等。如果kernel本身有相应强大的功能,则不需要initrd                  下面我们来分析一下我系统上的/boot/grub/grub.conf文件:      default=0         表示第一个title下的内容为默认启动的kernel            timeout=3      表示等待进入选择kernel或操作系统菜单的时间为3秒        splashimage=(hd0,0)/grub/splash.xpm.gz      grub是以hd来识别磁盘的,第一磁盘为hd0,第二个磁盘为hd1...,而hd0,0表示第一个磁盘的第一个分区,hd0,1表示第一个磁盘的第二个分区...,并且grub是直接读分区来找到对应的文件;而我的系统上只有一块硬盘,并且/boot是一个单独的分区,并且为系统的第一个分区,grub等文件在这个分区上。(如果你的系统上/是一个独立分区,并且boot,grub和其中的文件都在/这个分区中,则这段应该是:splashimage=(hd0,0)/boot/grub/splash.xpm.gz)所以它的意思是:grub在第一个分区中找到grub这个目录,再找到这个图片文件作为背景。        hiddenmenu      这个你懂的        password --md5 $1$UrprW0$UzN7ozenwICzcPCQgiFts1      表示要想进入kernel的编辑菜单,需要输入密码。这个密码可以通过命令grub-md5-crypt生成。        title my redhat       你懂的           root (hd0,0)            定义grub的根是第一硬盘的第一个分区             kernel /vmlinuz-2.6.18-164.el5 ro root=/dev/vol0/root rhgb quiet           内核在grub的根的根目录下,ro表示只读加载kernel,root=/dev/vol0/root定义根文件系统,即我们操作系统启动之后我们所见到的/,我系统上的/是挂载在这个逻辑卷上的;rhgb是redhat的一个程序,显示一个红色的边框。quiet表示以静默模式启动kernel,如果定义,kernel启动的时候会输出很多信息。             initrd /initrd-2.6.18-164.el5.img           initrd这个文件在grub的根的根目录下        OK!这个文件很重要哦! 本文转自 leejia1989 51CTO博客,原文链接:http://blog.51cto.com/leejia/788902,如需转载请自行联系原作者
文章
Linux · 数据安全/隐私保护 · 编解码
2017-11-14
bootloader和kernel配合启动过程/编译bootloader/编译kernel
bootloader和kernel配合启动过程 --------------------------------------------         ARM9的板子有norflash芯片,存储基本的bootlader代码,此处为cpu执行代码的0地址。cpu内部的4kRam空间充当此时的栈和数据段存储。因为是三星公司自己做的芯片,故硬件上面可以实现将nandflash前4K的代码自动拷贝到iRam中(实现方式没有公开,只要能够理解工作方式即可)。只需要将bootloader的后续代码放到内存sdram中即可。这种方式启动,可以不再使用norflash芯片。 工作过程:boot-->loader-->启动kernel参数-->kernel-->mount根文件系统。         Cortex-A8的板子,cpu内部有96k的iRam和64k的iRom。iRom中有三星公司的固化代码,可以判断启动方式是从sd卡启动还是nand启动。而硬件自动拷贝nand中的前8k代码到iRam中。其他的原理相同。 编译bootloader make distclean 清除已经生成的文件 [1]vim boards.cfg [2]make xxx_config 会在include/自动生成confg.mk 和config.h  config文件会确定编译那些文件。 [3]make ARCH=arm CROSS_COMPILE=arm-linux- 1.清除代码中已经编译出的.o文件和目标文件 make distclean 2.为tiny210开发板生成配置文件 make tiny210_config 3.编译 make 4.把bootloader烧写到sd卡 sudo fdisk -l sudo dd iflag=dsync oflag=dsync if=tiny210-uboot.bin of=/dev/sdb seek=1 编译kernel 1.清除代码中已经编译出的.o文件和目标文件 make distclean 2.打开一个配置kernel的界面,裁剪kernel,生成配置文件.config make menuconfig 3.根据.config配置文件选择要编译的目录和原码 make 4.生成的kernel在/arch/arm/boot/zImage
文章
芯片 · 存储 · 开发工具
2015-04-23
linux启动grub.conf详解
grub.conf是grub的主配置文件,通过这个配置文件,grub才能找到kernel,系统才能正常启动. 1 2 3 4 5 6 7 8 9 10 [root@hxy ~]# cat /boot/grub/grub.conf |grep -v ^# default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu password --md5 $1$NXGPQ/$pie0SRolNlsqbRbqzyw3p. title CentOS 6 (2.6.32-504.el6.x86_64)     root (hd0,0)     kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=UUID=1a5e86ca-456a-4bf6-a6e4-53253deb6bf6 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=128M  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM quiet     initrd /initramfs-2.6.32-504.el6.x86_64.img default:定义默认启动的kernel或是操作系统 timeout:定义等待进入选择kernel或操作系统菜单的时间(这里等于5,就是等待5秒) splashimage:指定我们选择kernel或操作系统菜单后面那张图片 hiddenmenu:表示隐藏选择kernel或操作系统菜单,只有出现等待界面后按下enter键才会出现.如果没有这个字段,则每次系统启动都会出现这个选择菜单. password:设定密码.放在title外表示进入kernel或操作系统的编辑模式需要密码,而放在title内表示启动对应的kernel或操作系统需要密码,密码可以是明文或是用MD5进行加密过的.可以防止其他人进入编辑(可不用) 1 2 3 4 [root@hxy ~]# /sbin/grub-md5-crypt Password: Retype password: $1$NXGPQ/$pie0SRolNlsqbRbqzyw3p. kernel菜单进入单用户模式启动我们的系统 title identify:指定一个kernel或是一个操作系统,linux中可以有多个title;identify是这个kernel或操作系统的识别符,可以随意写. root:用于指定grub所能识别的根,而不是根文件系统. kernel:用于指定系统的内核文件的位置 initrd:帮助kernel完成系统的启动,例如加载根文件系统所在分区的驱动等.如果kernel本身有相应强大的功能,则不需要initrd 1 2 3 4 title CentOS 6 (2.6.32-504.el6.x86_64)     root (hd0,0)     kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=UUID=1a5e86ca-456a-4bf6-a6e4-53253deb6bf6 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=128M  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM quiet     initrd /initramfs-2.6.32-504.el6.x86_64.img root (hd0,0)      定义grub的根是第一硬盘的第一个分区     kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=UUID=1a5e86ca-456a-4bf6-a6e4-53253deb6bf6 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=128M  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM quiet     内核在grub的根的根目录下,ro表示只读加载kernel,root=....定义根文件系统,即我们操作系统启动之后我们所见到的/,我系统上的/是挂载在这个逻辑卷上的;rhgb是redhat的一个程序,显示一个红色的边框。quiet表示以静默模式启动kernel,如果定义,kernel启动的时候会输出很多信息。 系统的主要字体在/usr/share/font里面,你可以用chkfontpath查看,也可以用它来添加看它的发行注记. rd_no_lvm:禁用LVM(可不用) rd_no_dm:禁用RAID(可不用) rhgb:redhat graphics boot,用图片来代替启动过程中显示的文本信息(可不用,不用了centos就不会出现白天了,就直接全是文本信息了) LANG=en_US.UTF-8 使用语言格式(可不用) KEYBOARDTYPE=pc KEYTABLE=us键盘类型和键盘格式(可不用) crashkernel参数格式是: crashkernel=nn[KMG]@ss[KMG] nn表示要为crashkernel预留多少内存 ss表示为crashkernel预留内存的起始位置 一些更详细的可以参照 http://www.361way.com/centos-kdump/3751.html 本文转自  Forande  51CTO博客,原文链接:http://blog.51cto.com/853056088/1951355
文章
Linux · 数据安全/隐私保护 · 机器学习/深度学习 · 图形学
2017-11-15
关于Linux启动时挂载rootfs的几种方式
一直对Linux启动时挂载根文件系统的过程存在着很多疑问,今天在水木精华区找到了有用的资料,摘录如下: 1、Linux启动时,经过一系列初始化之后,需要mount 根文件系统,为最后运行init进程等做准备,mount 根文件系统有这么几种方式: 1)文件系统已经存在于硬盘(或者类似的设备)的某个分区上了,kernel根据启动的命令行参数(root=/dev/xxx),直接进行mount。 这里有一个问题,在root文件系统本身还不存在的情况下,kernel如何根据/dev/xxx来找到对应的设备呢?注意:根文件系统和其他文件系统的mount方式是不一样的,kernel通过直接解析设备的名称来获得设备的主、从设备号,然后就可以访问对应的设备驱动了。所以在init/main.c中有很长一串的root_dev_names(如hda,hdab,sda,sdb,nfs,ram,mtdblock……),通过这个表就可以根据设备名称得到设备号。注意,bootloader或内核中设定的启动参数(root=/dev/xxx)只是一个代号,实际的根文件系统中不一定存在这个设备文件! 2)从软驱等比较慢的设备上装载根文件系统,如果kernel支持ramdisk,在装载root文件系统时,内核判断到需要从软盘(fdx)mount(root=/dev/fd0),就会自动把文件系统映象复制到ramdisk,一般对应设备ram0,然后在ram0上mount根文件系统。 从源码看,如果kernel编译时没有支持ramdisk,而启动参数又是root=/dev/fd0,系统将直接在软盘上mount,除了速度比较慢,理论上是可行的(没试过,不知道是不是这样?) 3)启动时用到initrd来mount根文件系统。注意理解ramdisk和initrd这两个概念,其实ramdisk只是在ram上实现的块设备,类似与硬盘操作,但有更快的读写速度,它可以在系统运行的任何时候使用,而不仅仅是用于启动;initrd(boot loaderinitialized RAMdisk)可以说是启动过程中用到的一种机制,具体的实现过程也使用ramdisk技术。就是在装载linux之前,bootloader可以把一个比较小的根文件系统的映象装载在内存的某个指定位置,姑且把这段内存称为initrd(这里是initrd所占的内存,不是ramdisk,注意区别),然后bootloader通过传递参数的方式告诉内核initrd的起始地址和大小(也可以把这些参数编译在内核中),在启动阶段就可以暂时的用initrd来mount根文件系统。initrd的最初的目的是为了把kernel的启动分成两个阶段:在kernel中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的方式放在initrd中,这样就在启动过程中可以从initrd所mount的根文件系统中装载需要的模块。这样的一个好处就是在保持kernel不变的情况下,通过修改initrd中的内容就可以灵活的支持不同的硬件。在启动完成的最后阶段,根文件系统可以重新mount到其他设备上,但是也可以不再 重新mount(很多嵌入式系统就是这样)。initrd的具体实现过程是这样的:bootloader把根文件系统映象装载到内存指定位置,把相关参数传递给内核,内核启动时把initrd中的内容复制到ramdisk中(ram0),把initrd占用的内存释放掉,在ram0上mount根文件系统。从这个过程可以看出,内核需要对同时对ramdisk和initrd的支持(这种需要都编入内核,不能作为模块)。 2、嵌入式系统根文件系统的一种实现方法:对于kernel和根文件系统都存储在flash中的系统,一般可以利用linux启动的initrd的机制。具体的过程前面已经比较清楚了,还有一点就是在启动参数中传递root=/dev/ram0,这样使得用initrd进行mount的根文件系统不再切换,因为这个时候实际的设备就是ram0。还有就是initrd的起始地址参数为虚拟地址,需要和bootloader中用的物理地址对应。
文章
Linux · 存储 · 内存技术
2016-07-29
忘记linux中root密码怎么办?两种方法两步教你轻松搞定修改新的密码(仅限CentOS6.X)
忘记了Linux的系统管理员密码时,可以在本地通过进入单用户模式来重置root密码。两种方法(只需两步)具体步骤如下: 方法一: 在进入grub启动菜单的时候 按“a” 键操作编辑 kernel 参数后面加“single”告诉linux内核以单用户模式运行,回车启动即可。进去后,在命令行输入passwd回车,输入新的密码,重复输入,搞定。重启后输入新的密码即可登录。(注:grub界面时间很短,大概5秒,把握机会,如果不想等的话,在linux启动的时候随便按下一个键例如“a”就会跳转到grub界面) 步骤截图: 方法二: 在 GRUB 启动菜单里使用 “e” 操作按键进入 CentOS 的启动菜单向界面 ,移动光标至“kernel”配置项一行,将光标定位到 kernel 菜单项,然后按 “e” 键编辑 “kernel” 菜单项,在行末输入 single ,以告诉 Linux 内核后续的启动过程需要进入单用户模式,然后回车回到启动菜单选择界面。然后我们根据屏幕上的提示,按“b”来用刚才编辑的菜单选项启动系统,然后进去的也是单用户模式。进入单用户名模式的时候,系统是不需要密码验证的,而且直接获得到的是root权限,接下来的就跟方法1一样了,输入passwd命令修改密码。 步骤截图如下:
文章
Linux · 数据安全/隐私保护
1970-01-01
linux 启动
启动一般为4个过程 1 不同CPU的firmware进行系统自举(bootstrap)2 bootloader3 操作系统内核的启动4 系统启动   bootstrap     CPU加电后, 总要从某个固定地址开始执行第一条指令目的:加载bootloader不同CPU有不同的处理方式 bootloader 用来加载内核并为内核的运行提供环境 内核启动 如果是压缩格式的内核,需要首先解压。内核的入口地址:ENTRY标识 进行一系列处理跳转到start_kernel() start_kernel具体为下面 页表初始化:paging_init( ) 页描述符初始化:kmem_init( ), free_area_init( ), mem_init( ) 异常和中断的初始化:trap_init( ), init_IRQ( ) 内存初始化:kmem_cache_init( ), kmem_cache_sizes_init( ) 时钟初始化:time_init( ) 启动第一个系统进程(init):kernel_thread( )     最后一步系统启动 init: 内核启动后运行的第一个进程 ;所有其他进程都是init进程的子进程   ;内核启动后将启动一系列系统级进程并对系统进行一系列初始化:;加载文件系统,加载设备驱动程序,…;启动系统日志,启动用户登录进程,…其它应用级进程…   kernel/:内核的通用代码(比较重要)sched.c module.c printk.c signal.c fork.c exit.c
文章
Linux · 前端开发
2009-07-22
云主机启动,怎么选择内核版本?
用了一个阿里云的ecs主机,安装的centos7.2,升级了内核:[root@i001 ~]# rpm -qa | grep kernel kernel-ml-4.4.5-1.el7.elrepo.x86_64 kernel-ml-4.6.0-1.el7.elrepo.x86_64可是reboot重启,仍然是4.4.5,不会默认启动4.6.0,可是又不能像本地主机一样可以看到启动菜单,所以不能选择启动版本,那么,怎么做才可以呢?
问答
弹性计算
2016-06-28
RHCE7.0答案之升级内核
REEL7.0升级内核配置: uname -a  yum-config-manager --add-repo http:// yum clean all yum list kernel yum install kernel 安装内核时,kernel包不会覆盖原来的kernel,会成生新的内核。 vim /boot/grub2/grub.cfg 此步不必只是查看默认启动就是新的内核 可以检查一下,grub2-editenv list 这个命令得到的结果就是当前优先启动的内核心 grub2-set-default "new-kernel" grub2-mkconfig -o /boot/grub2/grub.cfg  更新配置文件 本文转自 拾瓦兴阁 51CTO博客,原文链接:http://blog.51cto.com/ponyjia/1866435
文章
开发工具
2017-11-12
...
跳转至:
开发与运维
3684 人关注 | 91404 讨论 | 88083 内容
+ 订阅
  • 一篇文章带你了解css z-index(重叠顺序)
  • javascript中的模块系统
  • 【公告】移动开发平台 mPaaS 控制台系统升级通知
查看更多 >
安全
695 人关注 | 21381 讨论 | 26415 内容
+ 订阅
  • 阿里云新品发布会周刊第90期 丨 云数据库PostgreSQL版重磅升级开年发布会
  • 3月3日 | 云数据库PostgreSQL版重磅升级开年发布会
  • 阿里云 Serverless App Engine(SAE)助力升学在线从容应对流量高峰
查看更多 >
人工智能
1963 人关注 | 7205 讨论 | 33363 内容
+ 订阅
  • 【产品能力深度解读】连续入围Gartner魔力象限的Quick BI有何魔力?
  • 阿里云AIoT承建项目获评水利部优秀示范工程
  • 城市大脑 | 智慧停车综合解决方案
查看更多 >
云计算
20574 人关注 | 54726 讨论 | 17406 内容
+ 订阅
  • 阿里云新品发布会周刊第90期 丨 云数据库PostgreSQL版重磅升级开年发布会
  • 基于视频流传输 — 在线教育白板技术
  • 阿里云 Serverless App Engine(SAE)助力升学在线从容应对流量高峰
查看更多 >