如何调整Linux内核启动中的驱动初始化顺序

合集下载

Linux终端中的进程优先级调整命令

Linux终端中的进程优先级调整命令

Linux终端中的进程优先级调整命令在Linux操作系统中,进程是操作系统中最基本的执行单位。

不同的进程可能会占用不同的系统资源,并且在系统运行过程中具有不同的重要性和优先级。

在某些情况下,我们需要通过调整进程的优先级来控制系统资源的分配和进程的执行顺序。

Linux终端提供了一些命令,可以用于调整进程的优先级。

本文将介绍常用的几个命令及其使用方法。

1. nice命令nice命令用于启动一个命令,并设置其进程优先级。

通过设置进程的优先级,我们可以控制进程在系统资源竞争时的执行顺序。

命令格式:nice [OPTION] [COMMAND [ARG]...]常用参数:-值:指定进程的优先级值,范围从-20到+19,值越小,优先级越高示例:nice -n 10 ./my_program上述命令将以优先级10来启动my_program程序。

2. renice命令renice命令用于修改已经运行的进程的优先级。

通过renice命令,我们可以在进程运行过程中动态地调整其优先级。

命令格式:renice [OPTIONS] <priority> <PID>...常用参数:-值:指定新的优先级值,范围从-20到+19,值越小,优先级越高-PID:要修改优先级的进程的进程ID示例:renice -n 5 -p 1234上述命令将进程ID为1234的进程的优先级修改为5。

3. top命令top命令可以用于实时监控系统的进程状态,并且可以通过交互界面调整进程的优先级。

命令格式:top常用操作:在top命令交互界面中,使用键盘上的数字键1-5可以切换不同的进程排序方式。

通过按下键盘上的r键,我们可以进入renice模式,然后选择需要调整优先级的进程,并输入新的优先级值。

示例:1) 输入top命令后,进入top交互界面。

2) 按下r键,进入renice模式。

3) 使用上下箭头选择需要调整优先级的进程。

Linux启动顺序和修改启动后执行程序

Linux启动顺序和修改启动后执行程序

Linux启动顺序和修改启动后执行程序Linux kernel mounts the root filesystem.The kernel starts the first user process /sbin/init provided by Busybox./sbin/init reads /etc/inittab (From the SDK: linux/embedded_rootfs/etc-files/inittab)./etc/inittab starts the shell script /sbin/rc (From the SDK: linux/embedded_rootfs/etc-files/rc)./sbin/rc mounts the kernel pseudo filesystems /proc, /dev/shm, and /dev/pts./sbin/rc brings up the loopback network device with the IP address 127.0.0.1./sbin/rc starts syslogd provided by Busybox./sbin/rc starts telnetd provided by Busybox./sbin/rc exits returning control in /sbin/init./etc/inittab tells /sbin/init to spawn an interactive shell.The user interactive shell prompt appears.修改rc文件即可设定linux自启动的程序,即启动linux后便会自己执行的程序或者shell 脚步static int noinline init_post(void){free_initmem();unlock_kernel();mark_rodata_ro();system_state = SYSTEM_RUNNING;numa_default_policy();if (sys_open((const char __user *) &quot;/dev/console&quot;, O_RDWR, 0)(void) sys_dup(0);(void) sys_dup(0);if (ramdisk_execute_command) {&nbsp;&nbsp;run_init_process(ramdisk_execute_command);&nbsp;&nbsp;printk(KERN_W ARNING &quot;Failed to execute %s\n&quot;,&nbsp; &nbsp; ramdisk_execute_command);}/*&nbsp;&nbsp;* We try each of these until one succeeds.&nbsp;&nbsp;*&nbsp;&nbsp;* The Bourne shell can be used instead of init if we are&nbsp;&nbsp;* trying to recover a really broken machine.&nbsp;&nbsp;*/if (execute_command) {&nbsp;&nbsp;run_init_process(execute_command);&nbsp;&nbsp;printk(KERN_W ARNING &quot;Failed to execute %s.&nbsp;&nbsp;Attempting &quot;&nbsp; &nbsp;&nbsp;&nbsp;&quot;defaults...\n&quot;, execute_command);}run_init_process(&quot;/sbin/init&quot;);run_init_process(&quot;/etc/init&quot;);run_init_process(&quot;/bin/init&quot;);run_init_process(&quot;/bin/sh&quot;);panic(&quot;No init found.&nbsp;&nbsp;Try passing init= option to kernel.&quot;);。

linux初始化流程

linux初始化流程

linux初始化流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. BIOS 自检:计算机开机后,首先会执行 BIOS(基本输入输出系统)的自检程序。

如何调整Linux内核启动中的驱动初始化顺序(zz)

如何调整Linux内核启动中的驱动初始化顺序(zz)

如何调整Linux内核启动中的驱动初始化顺序(zz)如何调整Linux内核启动中的驱动初始化顺序【问题】此处我要实现的是将芯片的ID用于网卡MAC地址,网卡驱动是enc28j60_init。

但是,读取芯片ID的函数,在as352x_afe_init模块中,所以要先初始化as352x_afe_init。

此处,内核编译完之后,在生成的system.map中可以看到,enc28j60_init在as352x_afe_init之前,所以,无法去读芯片ID。

所以我们的目标是,将as352x_afe_init驱动初始化放到enc28j60_init之前,然后才能读取芯片ID,才能用于网卡初始化的时候的,将芯片ID 设置成网卡MAC地址。

【解决过程】【1】最简单想到的,是内核里面的arch\arm\mach-as352x\core.c中,去改devices设备列表中的顺序。

enc28j60_init对应的是ssp_device,因为网卡初始化用到的是SPI驱动去进行和通讯的。

as352x_afe_init对应的是afe_device。

原先是:把afe改到最前面:但是,实际结果是,没有任何影响,连systemp.map生成的,那么模块初始化顺序,都没有任何变化。

也就说明,想要实现驱动加载顺序的改变,改core.c里面的设备列表顺序是没有用的。

【2】在网上看到很多帖子,主要就是这几个:怎么确定驱动加载顺序/u2/72751/showart_1074704.htmlLinux内核驱动程序初始化顺序的调整内核启动时,设备及驱动初始化的实现/bbs/archiver/tid-1109340.html其说明的也很清楚了,就是:Linux内核为不同驱动的加载顺序对应不同的优先级,定义了一些宏:include\linux\init.h把自己的驱动的函数名用这些宏去定义之后,就会对应不同的加载时候的优先级。

其中,我们写驱动中所用到的module_init对应的是#define module_init(x) __initcall(x);而#define __initcall(fn) device_initcall(fn)所以,驱动对应的加载的优先级为6在上面的不同的优先级中,数字越小,优先级越高。

Linux终端命令系统初始化和启动管理

Linux终端命令系统初始化和启动管理

Linux终端命令系统初始化和启动管理Linux作为一种开源的操作系统,被广泛应用于各个领域。

作为使用Linux的用户或者系统管理员,了解如何初始化和管理Linux终端命令系统是非常重要的。

本文将介绍Linux终端命令系统的初始化和启动管理的方法和技巧。

1. 初始化系统在Linux中,系统初始化是指在计算机启动时加载和配置各种系统服务和资源的过程。

一般来说,系统初始化的步骤如下:1.1 引导加载程序引导加载程序(Boot Loader)是计算机启动时加载操作系统的程序。

常见的引导加载程序有GRUB和LILO。

用户可以通过编辑引导加载程序的配置文件来选择加载哪个操作系统,以及配置其他启动参数。

1.2 内核引导过程引导加载程序会加载操作系统内核。

内核是Linux操作系统的核心部分,负责管理所有的资源和服务。

内核加载后,会进行硬件初始化、设备驱动加载和其他系统设置。

1.3 运行Init进程在用户空间,Init进程是第一个被运行的进程。

Init进程负责启动其他的系统进程和服务,并设置基本的环境变量和配置。

常见的Init进程有Systemd、Upstart和SysVinit。

2. 管理系统启动Linux系统的启动管理主要涉及到服务管理和启动级别的配置。

2.1 服务管理在Linux系统中,有许多后台服务需要在系统启动时自动运行。

使用服务管理命令可以启动、停止或重启这些服务。

常用的服务管理命令有:- systemctl:用于Systemd初始化系统的服务管理。

- service:用于SysVinit初始化系统的服务管理。

- initctl:用于Upstart初始化系统的服务管理。

2.2 启动级别配置启动级别定义了系统在不同情况下运行哪些服务。

例如,运行级别3是多用户、无图形界面的模式,而运行级别5是多用户、图形界面的模式。

用户可以通过编辑运行级别配置文件,自定义开机启动运行的服务。

3. 命令行界面管理在Linux系统中,终端命令行界面是日常操作和管理系统的主要方式。

linux驱动启动顺序

linux驱动启动顺序

linux驱动启动顺序⾸先,我们可以查看Linux内核编译完成后的System.map⽂件,在这个⽂件中我们可以看到macb(dm9161驱动模块)链接到了dm9000驱动之前,如下所⽰:c03b6d40 t __initcall_tun_init6c03b6d44 t __initcall_macb_init6c03b6d48 t __initcall_dm9000_init6c03b6d4c t __initcall_ppp_init6c03b6d50 t __initcall_ppp_async_init6我尝试修改arch/arm/mach-at91/board-sam9260ek.c中DM9000和DM916设备添加的顺序,即先添加 dm9000,后添加dm9161。

编译后运⾏发现,结果还是⼀样。

⾃⼰想了想,这也在情理之中。

因为这个出现这个问题的主要原因是这两个驱动加载的先后顺序,⽽不是设备添加的先后顺序。

 在Linux内核中维护着两个链,⼀个设备链,⼀个驱动链,他们两个就像情侣⼀样互相依赖,互相纠缠在⼀起的。

当我们新添加⼀个设备时,他会被加⼊到设备链上,这时内核这个红娘会就会到驱动链上给他找他的另外⼀半(驱动),看是否有哪个驱动看上了他(这个驱动是否⽀持这个设备),如果找到了这个驱动,那么设备就能够使⽤(⼤家纠缠到⼀块了,该⼲嘛就⼲嘛去了)。

⽽如果没有找到,那么设备就只能默默地在那⾥等待他的另⼀半的出现。

下⾯是arch/arm/mach-at91/board-sam9260ek.c添加设备的代码:static void __init ek_board_init(void){ /* Serial */at91_add_device_serial(); /* USB Host */at91_add_device_usbh(&ek_usbh_data); /* USB Device */at91_add_device_udc(&ek_udc_data); /* SPI */at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices)); /* NAND */ek_add_device_nand(); /* Ethernet */ ek_add_device_dm9000(); /* Add dm9000 driver by guowenxue, 2012.04.11 */at91_add_device_eth(&ek_macb_data); /* MMC */at91_add_device_mmc(0, &ek_mmc_data); /* I2C */at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices)); /* SSC (to AT73C213) */#if defined(CONFIG_SND_AT73C213) || defined(CONFIG_SND_AT73C213_MODULE)at73c213_set_clk(&at73c213_data); /* Modify by guowenxue, 2012.04.11 */#endifat91_add_device_ssc(AT91SAM9260_ID_SSC, ATMEL_SSC_TX);#if 0 /* comment by guowenxue */ /* LEDs */at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds)); /* Push Buttons */ek_add_device_buttons();#endif}MACHINE_START(AT91SAM9260EK, "Atmel AT91SAM9260-EK") /* Maintainer: Atmel */.timer = &at91sam926x_timer,.map_io = at91_map_io,.init_early = ek_init_early,.init_irq = at91_init_irq_default,.init_machine = ek_board_init,MACHINE_ENDMACHINE_START主要是定义了"struct machine_desc"的类型,放在 section(".init"),是初始化数据,Kernel 起来之后将被丢弃。

你了解Linux驱动加载顺序?

你了解Linux驱动加载顺序?

你了解Linux驱动加载顺序?Linux内核为不同驱动的加载顺序对应不同的优先级,定义了一些宏:include\linux\init.h#define pure_initcall(fn) __define_initcall("0",fn,1)#define core_initcall(fn) __define_initcall("1",fn,1)#define core_initcall_sync(fn) __define_initcall("1s",fn,1s)#define postcore_initcall(fn) __define_initcall("2",fn,2)#define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s)#define arch_initcall(fn) __define_initcall("3",fn,3)#define arch_initcall_sync(fn) __define_initcall("3s",fn,3s)#define subsys_initcall(fn) __define_initcall("4",fn,4)#define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s)#define fs_initcall(fn) __define_initcall("5",fn,5)#define fs_initcall_sync(fn) __define_initcall("5s",fn,5s)#define rootfs_initcall(fn) __define_initcall("rootfs",fn,rootfs)#define device_initcall(fn) __define_initcall("6",fn,6)#define device_initcall_sync(fn) __define_initcall("6s",fn,6s)#define late_initcall(fn) __define_initcall("7",fn,7)#define late_initcall_sync(fn) __define_initcall("7s",fn,7s)#define __initcall(fn) device_initcall(fn)把自己的驱动的函数名用这些宏去定义之后,就会对应不同的加载时候的优先级。

安装linux系统后修改默认开机启动项

安装linux系统后修改默认开机启动项

安装linux系统后修改默认开机启动项在安装linux系统后,开机的时候默认启动项变成了linux,这让许多经常使⽤windows系统的同学感到抓狂:按下电源键后,打开⼿机,刷刷微博,看看朋友圈,再抬头⼀看,⾯对输⼊密码界⾯,只好再次选择重启。

那么如何修改默认的开机启动项呢?我们需要做的是修改GRUB这个东东。

步骤(以Ubuntu系统为例):1.进⼊系统,开机时注意观察你的windows系统在开机启动项中是第⼏项,当系统开启后打开终端。

(⽅法⾃⾏百度)2.在终端中输⼊“sudo gedit /etc/default/grub”,打开grub这个档案。

3.在⽂档⾥找到“GRUB_DEFAULT=0”这⼀⾏(也有可能不是0),如果开机时windows系统是第n项,则把这个0改为n-1(因为序号是从0开始的)。

然后保存退出。

什么?没法保存?看看步骤2的时候是不是没有输⼊sudo。

4.在终端中继续输⼊“sudo update-grub”,回车,等待若⼲秒。

5。

重启看看⾏不⾏。

注释:⼀.开机流程(摘⾃鸟哥)1. 加载 BIOS 的硬件信息与进⾏⾃我测试,并依据设定取得第⼀个可开机的装置;2. 读取并执⾏第⼀个开机装置内 MBR 的 boot Loader (亦即是 grub, spfdisk 等程序);(我们要修改的地⽅)3. 依据 boot loader 的设定加载 Kernel ,Kernel 会开始侦测硬件与加载驱动程序;4. 在硬件驱动成功后,Kernel 会主动呼叫 init 程序,⽽ init 会取得 run-level 信息;5. init 执⾏ /etc/rc.d/rc.sysinit 档案来准备软件执⾏的作业环境 (如⽹络、时区等);6. init 执⾏ run-level 的各个服务之启动(script ⽅式);7. init 执⾏ /etc/rc.d/rc.local 档案;8. init 执⾏终端机仿真程序 mingetty 来启动 login 程序,最后就等待⽤户登⼊啦;⼆.sudo的⽤法sudo 执⾏命令的流程是当前⽤户切换到root(或其它指定切换到的⽤户),然后以root(或其它指定的切换到的⽤户)⾝份执⾏命令,执⾏完成后,直接退回到当前⽤户;⽽这些的前提是要通过sudo的配置⽂件/etc/sudoers来进⾏授权;当我们没有权限进⾏⼀些动作时,可以尝试使⽤ sudo 命令。

linux系统启动过程的处理步骤

linux系统启动过程的处理步骤

linux系统启动过程的处理步骤1.引言1.1 概述Linux系统是一个开源的操作系统,它被广泛应用于各种计算设备,包括个人电脑、服务器、嵌入式设备等。

它的启动过程是系统从关机状态到能够正常运行的过程,包括引导程序的加载、内核的启动和初始化各种系统服务等步骤。

Linux系统的启动过程可以被分为几个主要步骤,每个步骤都有其特定的任务和功能。

首先是引导程序的加载,它是系统启动的第一步。

引导程序负责从存储设备中加载操作系统的内核,并将控制权转交给内核。

加载内核是系统启动过程的第二个重要步骤。

内核是操作系统的核心部分,它负责管理系统的各种资源和提供系统调用接口,以支持各种应用程序的正常运行。

加载内核的过程包括初始化硬件设备、建立内核空间和用户空间的切换等操作。

在内核加载完成后,系统会初始化各种系统服务和驱动程序。

这些服务和驱动程序负责管理系统的各种资源,如文件系统、网络连接、进程管理等。

系统服务的初始化过程通常是按照一定的顺序来进行的,确保每个服务按照正确的依赖关系被初始化。

总的来说,Linux系统的启动过程是一个复杂而严密的过程,涉及到多个步骤和组件的协同工作。

每个步骤都有其特定的功能,确保系统能够正确地启动和正常运行。

通过了解Linux系统的启动过程,我们可以更好地理解系统的工作原理,并能够更好地进行系统配置和故障排查等工作。

1.2文章结构1.2 文章结构本文将按照以下步骤分析Linux系统启动过程的处理步骤:1. 引言:在此部分,将对Linux系统启动过程进行简要概述,并说明本文的结构和目的。

2. 正文:2.1 启动引导程序:首先,将介绍引导程序的作用和重要性。

然后,详细说明引导程序在系统启动过程中的操作步骤,包括硬件自检、加载引导程序、选择操作系统等。

2.2 加载内核:在此部分,将详细讲解加载内核的过程和步骤。

首先,将介绍内核的作用和组成部分。

然后,依次说明加载内核的操作步骤,包括初始化内存、初始化设备驱动、加载文件系统等。

windows和linux双系统修改启动项顺序

windows和linux双系统修改启动项顺序

windows和linux双系统修改启动项顺序windows和linux双系统修改启动项顺序在windows下安装ubuntu双系统,启动时默认选择ubuntu,至少有三种方法可以修改启动顺序。

1. 修改/boot/grub/grub.cfgsudo vim /boot/grub/grub.cfg (如果对vim不太熟悉,可以试试sudo gedit /etc/default/grub)有如下内容## DO NOT EDIT THIS FILE## It is automatically generated by grub-mkconfig using templates# from /etc/grub.d and settings from /etc/default/grub### BEGIN /etc/grub.d/00_header ###if [ -s $prefix/grubenv ]; thenset have_grubenv=trueload_envfiset default="0"if [ "${prev_saved_entry}" ]; thenset saved_entry="${prev_saved_entry}"save_env saved_entryset prev_saved_entry=save_env prev_saved_entryset boot_once=truefi...menuentry 'Ubuntu,Linux 3.0.0-28-generic' --class ubuntu --class gnu-linux --class gnu --class os {recordfailset gfxpayload=$linux_gfx_modeinsmod gzioinsmod part_msdosinsmod ext2set root='(hd0,msdos8)'search --no-floppy --fs-uuid --set=root 6eaff320-f96f-4e63-91d3-9b45bb387d1dlinux /boot/vmlinuz-3.0.0-28-generic root=UUID=6eaff320-f96f-4e63-91d3-9b45bb387d1d ro quiet splash vt.handoff=7 initrd /boot/initrd.img-3.0.0-28-generic}...我们修改的是set default="0"。

linux启动顺序讲解

linux启动顺序讲解

linux启动顺序讲解⼀、简单介绍RHEL开机时的先后顺序BIOS —> MBR —> Kernel —> init1、当电脑⼀打开电源时电脑就会进⼊BIOS(BIOS的⼯作主要是检测⼀些硬件设备);2、检测完后会进⼊MBR也就是boot loader(MBR位于硬盘的第⼀个扇区总共512bytes,其中前446bytes⾥⾯的编码是在选择引导分区也就是决定要由哪个分区来引导);3、载⼊系统的Kernel(核⼼),在Kernel⾥主要是载⼊电脑设备的驱动程序,以便可以控制电脑上的设备,并且以只读⽅式来挂载根⽬录,也就是⼀开始只能读取到根⽬录所对应的那个分区,所以/etc、/bin、/sbin、/dev、/lib这五个⽬录必须同根⽬录在⼀个分区中;4、最后启动init这个程序,所以init这个程序的进程编号为1,是Linux中第⼀个执⾏的程序;init这个程序会根据Run level来执⾏以下这些程序:·/etc/rc.d/rc.sysinit;·/etc/rc.d/rc 和etc/rc.d/rc?.d/·/etc/rc.d/rc.local·如果有适当的图形界⾯管理程序⼆、BIOS初始化时主要的三个任务BIOS(B asic I nput/O utput S ystem)1、电脑周边设备的检测,加电⾃检POST (Power on self test);2、BIOS会选择要由哪⼀个设备来开机,例如:软盘启动、光盘启动、⽹络启动、最常见的从硬盘启动;3、选择好由哪个设备开机后,就开始读取这个设备的MBR 引导扇区;三、介绍Boot Loader中的主要⼯作1、Boot Loader可以安装在两个地⽅:·安装在硬盘的MBR中;·当有时候MBR中被其他开机管理程序占⽤就可以将Boot Loader 安装在硬盘中的其中⼀个分区的引导扇区上,;2、Boot Loader的程序码分为两个阶段:(1)Boot Loader第⼀阶段的程序码⾮常⼩,只有446bytes,可以存⼊在MBR或是某⼀个分区的引导扇区⾥,(2)Boot Loader第⼀阶段的程序码是从boot 分区来载⼊的,就是说Boot Loader 第⼆阶段程序码存放在/boot 这个分区中;3、下⾯来看三个Boot Loader 的开机流程范例,如在⼀块硬盘中安装了两个系统分别为:windows 2003 和Red hat linux当电脑开机后,会先载⼊MBR通过第⼀阶段程序码来载⼊第⼆阶段程序码,进⼊GRUB开机菜单这⾥选择哪个系统就会载⼊相应的核⼼;四、介绍GRUB和grub.conf 这个配置⽂件的内容其实从MBR载⼊Boot Loader开始,载⼊Kernel,载⼊init这些程序之间都是由GRUB这个多重开机管理程序所负责的。

Linux终端中的系统初始化和启动配置

Linux终端中的系统初始化和启动配置

Linux终端中的系统初始化和启动配置Linux操作系统是一种开源的操作系统,具有高度的灵活性和可定制性。

在Linux中,系统的初始化和启动配置十分重要,它们决定了系统的启动过程和初始设置。

本文将介绍Linux终端中的系统初始化和启动配置的相关内容。

一、启动过程Linux系统的启动过程可以分为以下几个阶段:1. BIOS(Basic Input/Output System)阶段:计算机的电源打开后,BIOS首先进行硬件自检和初始化,然后读取启动设备上的引导扇区。

2. 引导加载器阶段:引导加载器负责加载操作系统内核和启动RAM磁盘镜像,常见的引导加载器有GRUB(Grand Unified Bootloader)和LILO(Linux Loader)等。

3. 内核初始化阶段:内核是Linux操作系统的核心,它在这个阶段完成系统初始化的各种设置,如加载设备驱动程序、初始化系统调用等。

4. 用户空间初始化阶段:在内核初始化完成后,用户空间进行初始化,包括加载各种系统服务和用户进程。

二、系统初始化设置系统初始化设置是指在系统启动时对一些重要配置文件进行修改或添加,以定制和优化系统的各种设置。

常见的系统初始化设置包括:1. 网络配置:通过修改网络配置文件,如"/etc/network/interfaces",可以设置IP地址、网关、DNS服务器等网络相关参数。

2. 系统服务配置:通过修改系统服务配置文件,如"/etc/rc.d"目录下的各个脚本,可以配置系统启动时自动加载的服务和进程。

3. 文件系统挂载:通过修改"/etc/fstab"文件,可以设置文件系统的挂载点和挂载选项,如将某个分区挂载到指定目录下。

4. 内核参数设置:通过修改"/etc/sysctl.conf"文件,可以设置内核的各种参数,如最大文件打开数、网络缓冲区大小等。

XP Ubuntu windows Linux 双系统 启动顺序更改为默认winxp启动

XP Ubuntu windows Linux 双系统 启动顺序更改为默认winxp启动

windows Linux 双系统启动顺序更改为默认windows启动Windows XP sp3; Ubuntu LTS 12.10 64bit桌面版本;/detail/hongwulu/44916372012-11-14我的系统是Windows XP sp3,之后又安装了Ubuntu LTS 12.10 64bit 桌面版本Linux。

在开机启动时,默认是启动Ubuntu,为了改为winXP,我做了如下工作,实践证明好用!1、在开机时,查看Windows XP的顺序,从0开始计数。

我的启动菜单如下所示:UbuntuAdvanced options for UbuntuMemory test (memtest86+)Memory test (memtest86+, serial console 115200)Microsoft Windows XP Professional (on /dev/sda1)第一项是Ubuntu,第五项是Windows XP,因为是从0开始,所以Windows XP的顺序应该为4,把这个数记下来。

2、进入Ubuntu Linux系统,按ALT+F2,打开命令行,输入gksu nautilus,回车.系统会提示输入当前登录用户的密码,输入后即以root身份登录(在所有任务完成后务必要关闭本窗口)。

输入密码登录成功后的界面:3、单击File System,进入目录/boot/grub/找到文件grub.cfg,打开它,找到set default = "0",可以看出默认是第一项 (从 0 开始计数)。

只要改为set default = "4"(从 0 开始计数)就可以把 Windows XP 改为默认启动系统。

保存并关闭文件grub.cfg。

4、关闭当前的窗口退出root.至此,大功告成,下次重启动时,默认的操作系统变成了Windows XP.。

设置ubuntu、deppin(等linux系统)和window双系统启动引导顺序

设置ubuntu、deppin(等linux系统)和window双系统启动引导顺序
网络错误503请刷新页面重试持续报错请尝试更换浏览器或网络环境
设置 ubuntu、 deppin(等 linux系统)和 window双系统启动引导 顺序
windows和ubuntu双系统,默认启动的是ubuntu,希望修改为默认启动windows系统,修改方法如下: 1. 进入Ubuntu系统,打开终端,输入 sudo gedit /etc/default/grub(需要安装gedit,命令:sudo apt-get install gedit;用vi或vim等打开一样 可以修改); 2. 打开grub文件以后, GRUB_DEFAULT=0 (启动菜单中默认选择的索引号;windows处于第几项就修改为几,索引从0开始) GRUB_TIMEOUT=10 (默认等待时间为10s,我一般修改为2s,即GRUB_TIMEOUT=2 ) 3. 保存,退出。 4. 然后在终端中输入 sudo update-grub,也就是更新grub.cfg文件,使刚才的改动生效(此步骤非常重要,一定要做,不然重启无效)。 重启电脑,就修改成功了。
ห้องสมุดไป่ตู้

Linux内核驱动加载顺序

Linux内核驱动加载顺序
2 怀疑和编译顺序有关
Z:\kernel\drivers\video\Makefile:背光驱动(backlight/)的编译限于LCD驱动(xxxfb.o)的编译
obj-$(CONFIG_VT)+= console/
obj-$(CONFIG_LOGO)+= logo/
obj-y+= backlight/ display/
【结论】
同一级别的初始化是和编译顺序有关的,并不是和设备列表一致。
调整驱动加载顺序还可以通过使用不同级别的初始化,例如:
subsys_initcall()
module_init()
late_initcall()
...
907 c001f544 t __initcall_genericbl_init6
908 c001f548 t __initcall_pwm_backlight_init6
加载运行:
xxxpwm_backlight_device的probe就会在xxx_lcd_device的probe之后执行,即LCD初始化先于PWM的初始化。
obj-$(CONFIG_FB_AK88)+= ak88-fb/
obj-y+= backlight/
这样编译生成的System.map中的顺序为:
905 c001f53c t __initcall_display_class_init6
906 c001f540 t __initcall_xxxfb_init6
...
obj-$(CONFIG_FB_xxx)+= xxxfb.o ak_logo.o
obj-$(CONFIG_FB_AK88)+= ak88-fb/

Linux内核驱动程序初始化顺序的调整

Linux内核驱动程序初始化顺序的调整

Linux内核驱动程序初始化顺序的调整今天在做一个驱动的时候要用到另一个驱动(I2C)提供的API,在内核初始化时碰到了一个依赖问题。

我的驱动在I2C初始化之前就运行起来了,而这时I2C提供的API还处于不可用状态。

查了很多资料,网上有人说所有使用module_init这个宏的驱动程序的起动顺序都是不确定的(我没有查到权威的资料)。

所有的__init函数在区段.initcall.init中还保存了一份函数指针,在初始化时内核会通过这些函数指针调用这些__init函数指针,并在整个初始化完成后,释放整个init区段(包括.init.text,.initcall.init等)。

注意,这些函数在内核初始化过程中的调用顺序只和这里的函数指针的顺序有关,和1)中所述的这些函数本身在.init.text区段中的顺序无关。

在2.4内核中,这些函数指针的顺序也是和链接的顺序有关的,是不确定的。

在2.6内核中,initcall.init区段又分成7个子区段,分别是.initcall1.init.initcall2.init.initcall3.init.initcall4.init.initcall5.init.initcall6.init.initcall7.init当需要把函数fn放到.initcall1.init区段时,只要声明core_initcall(fn);即可。

其他的各个区段的定义方法分别是:core_initcall(fn) --->.initcall1.initpostcore_initcall(fn) --->.initcall2.initarch_initcall(fn) --->.initcall3.initsubsys_initcall(fn) --->.initcall4.initfs_initcall(fn) --->.initcall5.initdevice_initcall(fn) --->.initcall6.initlate_initcall(fn) --->.initcall7.init而与2.4兼容的initcall(fn)则等价于device_initcall(fn)。

linux 内核启动顺序修改

linux 内核启动顺序修改

linux 内核启动顺序修改在一次安装linux系统后,服务器启动发现有两个内核,默认启动的第一个内核进不去系统并报错,第二个内核才是我们安装需要使用的内核,这样我们便需要更改内核的启动顺序。

在手动进入linux系统后便可以查看相关文件修改内核启动顺序,并不是在启动内核选择界面直接修改。

可修改启动配置文件,更改系统默认加载的内核!查看有两个grub.conf,分别是/etc/grub.conf,还有/boot/grub/grub.conf两个文件应该是一样的/etc/grub.conf: symbolic link to `../boot/grub/grub.conf'#vi /etc/grub.conf# grub.conf generated by anaconda## Note that you do not have to rerun grub after making changes to this file# NOTICE: You have a /boot partition. This means that# all kernel and initrd paths are relative to /boot/, eg.# root (hd0,0)# kernel /vmlinuz-version ro root=/dev/sda2# initrd /initrd-version.img#boot=/dev/sdadefault=1timeout=5splashimage=(hd0,0)/grub/splash.xpm.gzhiddenmenutitle Red Hat Enterprise Linux Server (2.6.18-53.el5PAE)root (hd0,0)kernel /vmlinuz-2.6.18-53.el5PAE ro root=LABEL=/1 3 rhgb quietinitrd /initrd-2.6.18-53.el5PAE.imgtitle Red Hat Enterprise Linux Server-xen (2.6.18-53.el5xen)root (hd0,0)kernel /xen.gz-2.6.18-53.el5module /vmlinuz-2.6.18-53.el5xen ro root=LABEL=/1 3 rhgb quietmodule /initrd-2.6.18-53.el5xen.imgtitle Red Hat Enterprise Linux Server-base (2.6.18-53.el5)root (hd0,0)kernel /vmlinuz-2.6.18-53.el5 ro root=LABEL=/1 3 rhgb quietinitrd /initrd-2.6.18-53.el5.img将其中的default =1就是内核的默认启动顺序,可以改为你需要的。

Linux-修改内核启动顺序及删除无用内核

Linux-修改内核启动顺序及删除无用内核

Linux-修改内核启动顺序及删除⽆⽤内核问题现象CentOS7开机启动界⾯显⽰多个内核选项原因分析正常情况下,有两个启动项,⼀个是“正常启动”,另⼀个是“救援模式启动”(rescue)。

如果启动项多于2个,说明当前系统有旧内核未删除。

原因是CentOS更新后不会⾃动删除旧内核。

默认以新内核启动,可以在启动选项中临时选择,也可以修改配置永久指定。

⽰例:修改默认启动的内核[root@CentOS-7 ~]# uname -r # 查看当前内核版本3.10.0-693.5.2.el7.x86_64[root@CentOS-7 ~]#[root@CentOS-7 ~]# cat /boot/grub2/grub.cfg |grep "menuentry " # 查看所有可⽤内核menuentry 'CentOS Linux (3.10.0-693.5.2.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-327.el7.x86_64-advanced-88ae7d3d-ffaf-4402-9d44-56b6845789e4' { menuentry 'CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-327.el7.x86_64-advanced-88ae7d3d-ffaf-4402-9d44-56b6845789e4' { menuentry 'CentOS Linux (0-rescue-8405cda22c0b421db40478edcf9c1fb2) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-8405cda22c0b421db40478edcf9c1fb2-advanced-88 [root@CentOS-7 ~]#[root@CentOS-7 ~]# grub2-set-default 'CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)'[root@CentOS-7 ~]#[root@CentOS-7 ~]# grub2-editenv list # 查看内核修改结果saved_entry=CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)[root@CentOS-7 ~]#⽰例:删除⽆⽤内核[root@CentOS-7 ~]# uname -r # 查看当前内核版本3.10.0-693.5.2.el7.x86_64[root@CentOS-7 ~]#[root@CentOS-7 ~]# rpm -qa |grep kernel-[0-9] # 查看全部内核包kernel-3.10.0-693.5.2.el7.x86_64kernel-3.10.0-327.el7.x86_64[root@CentOS-7 ~]#[root@CentOS-7 ~]# yum remove kernel-3.10.0-327.el7.x86_64 # 删除指定的⽆⽤内核Loaded plugins: fastestmirror, langpacksResolving Dependencies--> Running transaction check---> Package kernel.x86_64 0:3.10.0-327.el7 will be erased--> Finished Dependency ResolutionDependencies Resolved=============================================================================================================================================================Package Arch Version Repository Size=============================================================================================================================================================Removing:kernel x86_64 3.10.0-327.el7 @anaconda 136 MTransaction Summary=============================================================================================================================================================Remove 1 PackageInstalled size: 136 MIs this ok [y/N]: yDownloading packages:Running transaction checkRunning transaction testTransaction test succeededRunning transactionErasing : kernel-3.10.0-327.el7.x86_64 1/1Verifying : kernel-3.10.0-327.el7.x86_64 1/1Removed:kernel.x86_64 0:3.10.0-327.el7Complete![root@CentOS-7 ~]#[root@CentOS-7 ~]# rpm -qa |grep kernel-[0-9] # 查看全部内核包kernel-3.10.0-693.5.2.el7.x86_64[root@CentOS-7 ~]#[root@CentOS-7 ~]# cat /boot/grub2/grub.cfg |grep "menuentry "menuentry 'CentOS Linux (3.10.0-693.5.2.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-327.el7.x86_64-advanced-88ae7d3d-ffaf-4402-9d44-56b6845789e4' { menuentry 'CentOS Linux (0-rescue-8405cda22c0b421db40478edcf9c1fb2) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-8405cda22c0b421db40478edcf9c1fb2-advanced-88 [root@CentOS-7 ~]#。

LINUX 更改硬盘启动顺序

LINUX 更改硬盘启动顺序

更改硬盘启动顺序目录1.问题起源 (1)2.解决方案 (1)1.问题起源问题:SuSE操作系统+Dell 1950(RAID)+Qlogic2340默认无法启动起源:SuSE操作系统中,/usr/src/kenelname/drivers/scsi/Makefile文件中内核make编译本地使用mega驱动比qla驱动优先生成。

导致在OS启动后,qla占用/dev/sda盘符,系统无法加载Kernel panic ?C not syncing : VFS :Unable to mount root fs on unknown-block (0,0)2.解决方案A.静态内核方案⏹修改/usr/src/kenelname/drivers/scsi/Makefile文件。

更改编译中硬盘加载顺序。

将qla2xxx相关行剪切至mega相关行后。

如下图:⏹按照正常模式编译生成含有Qlogic2430驱动的新静态内核。

使用新内核启动。

B.动态内核方案⏹采用动态内核支持,添加load modules支持⏹将内核中qla2340对应的选项更改为M⏹编译生成新内核make;make modules_install;make install⏹修改/lib/modues/kernelname/modules.dep文件文件。

这里的行定义modules启动加载的顺序。

调整qla2340顺序,只要将如下中的图1调整到图2之前,这样722行的模块在新的位置745行位置加载。

如果本地硬盘驱动需要模块加载,那么关于megaraid的模块都已加载完毕。

Linux内核驱动加载顺序

Linux内核驱动加载顺序

Linux 内核驱动加载顺序【问题】背光驱动初始化先于LCD驱动初始化,导致LCD驱动初始化时出现闪屏的现象。

【解决过程】1 mach-xxx.c 中platform devices 列表如下/* platform devices */static struct platform_device *athena_evt_platform_devices[] __initdata = { //&xxx_led_device,&xxx_rtc_device,&xxx_uart0_device,&xxx_uart1_device,&xxx_uart2_device,&xxx_uart3_device,&xxx_nand_device,&xxx_i2c_device.&xxx_lcd_device,&xxxpwm_backlight_device.};LCD (xxx_lcd_device )设备先于PW( xxxpwm_backlight_device )设备。

可见驱动的初始化顺序并不是和这个表定义的顺序始终保持一致的。

(记得PM操作- 的顺序是和这个表的顺序保持一致的)2怀疑和编译顺序有关Z:\kernel\drivers\video\Makefile :背光驱动(backlight/)的编译限于LCD驱动译obj-$(CONFIG_FB_xxx) += xxxfb.o ak_logo.oobj-$(CONFIG_FB_AK88) += ak88-fb/这样编译生成的System.map中的顺序为:906 c001f540 t __initcall_pwm_backlight_init6907 c001f544 t __initcall_display_class_init6908 c001f548 t __initcall_xxxfb_init6Makefile 更改为:obj-$(CONFIG_VT) obj-$(CONFIG_LOGO) obj-yresume/suspend (xxxfb.o )的编obj-$(CONFIG_VT) obj-$(CONFIG_LOGO) obj-y += console/+= logo/+= backlight/ display/+= console/+= logo/+= display/obj-$(CONFIG_FB_xxx) += xxxfb.o ak_logo.oobj-$(CONFIG_FB_AK88) += ak88-fb/obj-y += backlight/这样编译生成的System.map 中的顺序为:905 c001f53c t __initcall_display_class_init6906 c001f540 t __initcall_xxxfb_init6907 c001f544 t __initcall_genericbl_init6908 c001f548 t __initcall_pwm_backlight_init6加载运行:xxxpwm_backlight_device 的probe 就会在xxx_lcd_device 的probe 之后执行,即LCD初始化先于PWM 的初始化。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

网址/thread-1950216-1-1.html如何调整Linux内核启动中的驱动初始化顺序【问题】此处我要实现的是将芯片的ID用于网卡MAC地址,网卡驱动是enc28j60_init。

但是,读取芯片ID的函数,在as352x_afe_init模块中,所以要先初始化as352x_afe_init。

此处,内核编译完之后,在生成的system.map中可以看到,enc28j60_init在as352x_afe_init之前,所以,无法去读芯片ID。

所以我们的目标是,将as352x_afe_init驱动初始化放到enc28j60_init之前,然后才能读取芯片ID,才能用于网卡初始化的时候的,将芯片ID设置成网卡MAC地址。

【解决过程】【1】最简单想到的,是内核里面的arch\arm\mach-as352x\core.c中,去改devices设备列表中的顺序。

enc28j60_init对应的是ssp_device,因为网卡初始化用到的是SPI驱动去进行和通讯的。

as352x_afe_init对应的是afe_device。

原先是:static struct platform_device *devices[] ={&uart_device,&nand_device,&afe_device,&audio_device,&usb_device,&as352xkbd_device,&ssp_device,};复制代码把afe改到最前面:static struct platform_device *devices[] ={&afe_device,&uart_device,&nand_device,&audio_device,&usb_device,&as352xkbd_device,&ssp_device,};复制代码但是,实际结果是,没有任何影响,连systemp.map生成的,那么模块初始化顺序,都没有任何变化。

也就说明,想要实现驱动加载顺序的改变,改core.c里面的设备列表顺序是没有用的。

【2】在网上看到很多帖子,主要就是这几个:怎么确定驱动加载顺序/u2/72751/showart_1074704.htmlLinux内核驱动程序初始化顺序的调整/tech/OS/Linux/2006-12-21/74501.html内核启动时,设备及驱动初始化的实现/bbs/archiver/tid-1109340.html其说明的也很清楚了,就是:Linux内核为不同驱动的加载顺序对应不同的优先级,定义了一些宏:include\linux\init.h#define pure_initcall(fn) __define_initcall("0",fn,1)#define core_initcall(fn) __define_initcall("1",fn,1)#define core_initcall_sync(fn) __define_initcall("1s",fn,1s)#define postcore_initcall(fn) __define_initcall("2",fn,2)#define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s)#define arch_initcall(fn) __define_initcall("3",fn,3)#define arch_initcall_sync(fn) __define_initcall("3s",fn,3s)#define subsys_initcall(fn) __define_initcall("4",fn,4)#define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s)#define fs_initcall(fn) __define_initcall("5",fn,5)#define fs_initcall_sync(fn) __define_initcall("5s",fn,5s)#define rootfs_initcall(fn) __define_initcall("rootfs",fn,rootfs)#define device_initcall(fn) __define_initcall("6",fn,6)#define device_initcall_sync(fn) __define_initcall("6s",fn,6s)#define late_initcall(fn) __define_initcall("7",fn,7)#define late_initcall_sync(fn) __define_initcall("7s",fn,7s)#define __initcall(fn) device_initcall(fn)复制代码把自己的驱动的函数名用这些宏去定义之后,就会对应不同的加载时候的优先级。

其中,我们写驱动中所用到的module_init对应的是#define module_init(x) __initcall(x);而#define __initcall(fn) device_initcall(fn)所以,驱动对应的加载的优先级为6在上面的不同的优先级中,数字越小,优先级越高。

同一等级的优先级的驱动,加载顺序是链接过程决定的,结果是不确定的,我们无法去手动设置谁先谁后。

不同等级的驱动加载的顺序是先优先级高,后优先级低,这是可以确定的。

所以,像我们之前在驱动中用:module_init(i2c_dev_init);module_init(as352x_afe_init);module_init(as352x_afe_i2c_init);module_init(enc28j60_init);复制代码所以,大家都是同一个优先级去初始化,最后这些驱动加载的顺序,可以查看在根目录下,生成的system.map:。

c00197d8 t __initcall_alignment_init5。

c00197f4 t __initcall_default_rootfsrootfsc00197f8 t __initcall_timer_init_sysfs6c00197fc t __initcall_clock_dev_init6。

c00198d8 t __initcall_loop_init6c00198dc t __initcall_net_olddevs_init6c00198e0 t __initcall_loopback_init6c00198e4 t __initcall_enc28j60_init6。

c0019900 t __initcall_as352x_spi_init6c0019904 t __initcall_spidev_init6。

c0019920 t __initcall_i2c_dev_init6c0019924 t __initcall_as352x_afe_i2c_init6c0019928 t __initcall_as352x_afe_init6。

c0019970 t __initcall_random32_reseed7c0019974 t __initcall_seqgen_init7c0019978 t __initcall_rtc_hctosys7c001997c T __con_initcall_startc001997c t __initcall_con_initc001997c T __initcall_end。

复制代码此处就是由于c0019920 t __initcall_i2c_dev_init6c0019924 t __initcall_as352x_afe_i2c_init6c0019928 t __initcall_as352x_afe_init6在c00198e4 t __initcall_enc28j60_init6之前,所以我这里才要去改。

知道原理,能想到的,就是要么把as352x_afe_init改到enc28j60_init之前一级,即优先级为5。

即在驱动中,调用:fs_initcall(as352x_afe_init);要么把enc28j60_init改到as352x_afe_init之后,即优先级为7即在驱动中,调用:late_initcall(enc28j60_init);但是,此处麻烦就麻烦在,如果把as352x_afe_init改到enc28j60_init之前一级,发现后面网卡初始化enc28j60_init中,虽然读取芯片ID对了,但是后面的IP-auto configure 有问题。

所以放弃。

如果把enc28j60_init改到as352x_afe_init之后,但是,从system.map中看到的是,优先级为7的驱动中,明显有几个驱动,也是和网卡初始化相关的,所以,这样改,尝试后,还是失败了。

所以,没法简单的通过调整现有的驱动的顺序,去实现顺序的调整。

最后,被逼无奈,想到了一个可以实现我们需求的办法,那就是,单独定义一个优先级,把afe相关的初始化都放到那里面去,这样,就可以保证,其他没什么相关的冲突了。

最后证实,这样是可以实现目的的。

具体添加一个新的优先级的步骤如下:1.定义新的优先级include\linux\init.h中:#define pure_initcall(fn) __define_initcall("0",fn,1)#define core_initcall(fn) __define_initcall("1",fn,1)#define core_initcall_sync(fn) __define_initcall("1s",fn,1s)#define postcore_initcall(fn) __define_initcall("2",fn,2)#define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s)#define arch_initcall(fn) __define_initcall("3",fn,3)#define arch_initcall_sync(fn) __define_initcall("3s",fn,3s)#define subsys_initcall(fn) __define_initcall("4",fn,4)#define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s)#define fs_initcall(fn) __define_initcall("5",fn,5)#define fs_initcall_sync(fn) __define_initcall("5s",fn,5s)#define rootfs_initcall(fn) __define_initcall("rootfs",fn,rootfs)#if 1#define prev_device_initcall(fn) __define_initcall("6",fn,6)#define prev_device_initcall_sync(fn) __define_initcall("6s",fn,6s)#define device_initcall(fn) __define_initcall("7",fn,7)#define device_initcall_sync(fn) __define_initcall("7s",fn,7s)#define late_initcall(fn) __define_initcall("8",fn,8)#define late_initcall_sync(fn) __define_initcall("8s",fn,8s)#else#define device_initcall(fn) __define_initcall("6",fn,6)#define device_initcall_sync(fn) __define_initcall("6s",fn,6s)#define late_initcall(fn) __define_initcall("7",fn,7)#define late_initcall_sync(fn) __define_initcall("7s",fn,7s)#endif复制代码2.用对应新的宏,定义我们的驱动:prev_device_initcall(i2c_dev_init);prev_device_initcall(as352x_afe_i2c_init);prev_device_initcall(as352x_afe_init);复制代码做到这里,本以为可以了,但是编译后,在system.map中,发现之前优先级为7的那几个函数,被放到system.map最后了,而不是预想的,在优先级7之后,在c001997c T __con_initcall_startc001997c t __initcall_con_initc001997c T __initcall_end复制代码之前。

相关文档
最新文档