如何调整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 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 *) "/dev/console", O_RDWR, 0)(void) sys_dup(0);(void) sys_dup(0);if (ramdisk_execute_command) { run_init_process(ramdisk_execute_command); printk(KERN_W ARNING "Failed to execute %s\n", ramdisk_execute_command);}/* * We try each of these until one succeeds. * * The Bourne shell can be used instead of init if we are * trying to recover a really broken machine. */if (execute_command) { run_init_process(execute_command); printk(KERN_W ARNING "Failed to execute %s. Attempting " "defaults...\n", execute_command);}run_init_process("/sbin/init");run_init_process("/etc/init");run_init_process("/bin/init");run_init_process("/bin/sh");panic("No init found. Try passing init= option to kernel.");。
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内核启动中的驱动初始化顺序【问题】此处我要实现的是将芯片的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终端命令系统的初始化和启动管理的方法和技巧。
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内核编译完成后的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内核为不同驱动的加载顺序对应不同的优先级,定义了一些宏: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,这让许多经常使⽤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 命令。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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复制代码之前。