JJJ:linux系统中第一个进程

单精度浮点数存储、双精度浮点数存储 阅读详情

以linux4.19内核linux系统中第一个进程。

执行shell指令 ps -ef 结果如下:

xxx@xxx-virtual-machine:~$ ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 20:55 ?        00:00:02 /sbin/init splash
root           2       0  0 20:55 ?        00:00:00 [kthreadd]
root           3       2  0 20:55 ?        00:00:00 [rcu_gp]
root           4       2  0 20:55 ?        00:00:00 [rcu_par_gp]
root           5       2  0 20:55 ?        00:00:00 [slub_flushwq]
root           6       2  0 20:55 ?        00:00:00 [netns]
root           8       2  0 20:55 ?        00:00:00 [kworker/0:0H-events_highpri]
root          10       2  0 20:55 ?        00:00:00 [mm_percpu_wq]
root          11       2  0 20:55 ?        00:00:00 [rcu_tasks_rude_]
root          12       2  0 20:55 ?        00:00:00 [rcu_tasks_trace]
root          13       2  0 20:55 ?        00:00:00 [ksoftirqd/0]
root          14       2  0 20:55 ?        00:00:00 [rcu_sched]
root          15       2  0 20:55 ?        00:00:00 [migration/0]
root          16       2  0 20:55 ?        00:00:00 [idle_inject/0]
root          17       2  0 20:55 ?        00:00:00 [kworker/0:1-events]
root          18       2  0 20:55 ?        00:00:00 [cpuhp/0]
root          19       2  0 20:55 ?        00:00:00 [cpuhp/1]
root          20       2  0 20:55 ?        00:00:00 [idle_inject/1]
root          21       2  0 20:55 ?        00:00:00 [migration/1]
...

可以看到第一个进程PID为1,拉起第一个进程的指令为/sbin/init splash

内核启动流程:
start_kernel (init/main.c)
kernel_init

kernel_init函数如下:

static int __ref kernel_init(void *unused)
{
	...
	if (ramdisk_execute_command) {
		ret = run_init_process(ramdisk_execute_command);
		if (!ret)
            return 0;
        pr_err("Failed to execute %s (error %d)\n", ramdisk_execute_command, ret);
    }

    /*
     * 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) {
        ret = run_init_process(execute_command);
        if (!ret)
            return 0;
        panic("Requested init %s failed (error %d).",
              execute_command, ret);
    }
    if (!try_to_run_init_process("/sbin/init") ||
        !try_to_run_init_process("/etc/init") ||
        !try_to_run_init_process("/bin/init") ||
        !try_to_run_init_process("/bin/sh"))
        return 0;

    panic("No working init found.  Try passing init= option to kernel. "
          "See Linux Documentation/admin-guide/init.rst for guidance.");

}

上面代码片中的两个变量:ramdisk_execute_command 和 execute_command。
其定义如下:

static int __init init_setup(char *str)
{
    unsigned int i;

    execute_command = str;
    /*
     * In case LILO is going to boot us with default command line,
     * it prepends "auto" before the whole cmdline which makes
     * the shell think it should execute a script with such name.
     * So we ignore all arguments entered _before_ init=... [MJ]
     */
    for (i = 1; i < MAX_INIT_ARGS; i++)
        argv_init[i] = NULL;
    return 1;
}
__setup("init=", init_setup);

static int __init rdinit_setup(char *str)
{
    unsigned int i;

    ramdisk_execute_command = str;
    /* See "auto" comment in init_setup */
    for (i = 1; i < MAX_INIT_ARGS; i++)
        argv_init[i] = NULL;
    return 1;
}
__setup("rdinit=", rdinit_setup);

使用__setup("init=", init_setup)宏注册了这个函数,这样当内核启动时遇到
init=<command>这样的启动参数时,就会调用init_setup函数进行处理。
  • ramdisk_execute_command
    ramdisk_execute_command 变量的值可以通过内核启动参数 rdinit 来设置。在Linux内核引导过程中,如果用户在命令行参数或GRUB等 bootloader配置中指定了类似 rdinit=/path/to/executable 的参数,内核在初始化initrd之后会尝试执行位于指定路径的可执行文件作为初始化脚本或进程。

  • execute_command
    类似上面

在这里插入图片描述

DSP开发环境及工具之CCS CCS( Code Composer Studio)是美国德州仪器(TI)公司的嵌入式处理器的开发环境,可以用于TI公司的各个系列处理器的软件开发和调试,如DSP,MCU,ARM等。CMD的专业名称叫链接器配置文件,是存放链接器的配置信息的,我们简称为命令文件。从其名称可以看出,该文件的作用是指明如何链接程序的。编辑完C语言设置,添加cmd文件之后,然后检查编译配置选项。主要的操作都是在这个窗口之间做相应的切换。 阅读详情

相关推荐

数字IC笔记-逻辑单元库和库文件

逻辑单元库的建立: 一个完整的单元库是由不同的功能电路所组成,在芯片应用中可分为三类: 标准单元:反相器、与门、寄存器、选择器、全加器。组合逻辑电路和时序逻辑电路。互补,反向,非反向,其他。锁存器、寄存器。 模块宏单元:ROM、RAM 输入输出单元 库文件: 在逻辑综合产生门级网表和物理设计做布局布线的过程中需要两个重要的库文件,就是物理库(lef)和时序库(lib) 1.物理库LEF文件 LEF是版图级的抽象文件,主要用于布局和布线。目前普遍使用的是由Candence开发的LEF文件格式,以le

sinat_41774721的博客 9140

Linux 进程详解

在这篇指南中,我们会逐步对进程做基本的了解,然后简要看看如何用特定命令管理 Linux 进程。 进程process是指正在执行的程序;是程序正在运行的一个实例。它由程序指令,和从文件、其它程序中读取的数据或系统用户的输入组成。 进程的类型 在 Linux 中主要有两种类型的进程: 前台进程(也称为交互式进程) – 这些

GNU'S Not Unix 2724

【实战指南】WinPE环境下360系统急救箱的病毒查杀全流程解析

本文详细解析了在WinPE环境下使用360系统急救箱进行病毒查杀的全流程。从制作WinPE启动盘到进入PE环境,再到360急救箱的深度使用和系统修复,提供了实用技巧和常见问题解决方案,帮助用户高效清除顽固病毒。

weixin_28568819的博客 534

操作系统 实验二:进程控制

实验二:进程控制 16281259 鲁鑫 打开一个vi进程。通过ps命令以及选择合适的参数,只显示名字为vi的进程。寻找vi进程的父进程,直到init进程为止。记录过程中所有进程的ID和父进程ID。将得到的进程树和由pstree命令的得到的进程树进行比较。 1)首先在/tmp临时文件夹下使用vi命令编辑 2)使用ps -ef|grep <进程名/进程号>可以查看进程的PID以及PPI...

weixin_43826712的博客 798

操作系统期末大题类型题解

额,OS主要这回考程序分析题,PV操作、生产者消费者啊,哲学家进餐问题,死锁问题啊,如何避免死锁,经典银行家算法,页面置换算法啥的,磁盘调度......总计还有很多,就不一一说了 PV操作 谈到PV操作,首先要了解什么是信号量,其实就是用来解决互斥与同步问题的,分为原语wait(S)和signal(S),也就是我们常说的PV操作,在这里给出王道上的概念 wait(S){ while(S>0) S=S-1; } signal(S){ S=S+1; } 记录型信号量

ZXxxiaoxuan的博客 791

【STC8G1K08A串口使用】

STC8G1K08A串口打印“Hello world”

m0_47459564的博客 1万+

Linux操作系统-06-进程与服务管理

使用ps命令查看进程。包括过滤进程信息使用systemctl命令管理和运行Linux服务进程(Process):操作系统正在运行的应用程序。任意一个进程,都会消耗CPU和内存资源,服务(Service):通过服务控制面板直接启动的应用程序,也可能是操作系统启动时自启动的后台应用程序。服务一旦运行,也是一个进程。在Windows中可以使用”services.msc"命令打开服务控制面板。

fencecat的博客 774

[运动规划算法]基于飞行走廊的轨迹优化

文章目录简介一、介绍二、原理飞行走廊生成三、项目演示参考 简介 Btraj是一个在线的四旋翼无人机的运动规划框架,主要用于未知环境中的自主导航。基于机载状态估计和环境感知,采用基于快速行进(FM *)的路径搜索方法,从基于构建的欧氏距离场(ESDF)中寻找路径,以实现更好的时间分配。通过对环境进行膨胀生成四旋翼无人机的飞行飞行走廊。使用伯恩斯坦多项式将轨迹表示为分段Bezier曲线,并将整个轨迹生成问题转换成凸问题。通过使用Bezier曲线,可以确保轨迹的安全性和高阶动力学可行性,可以将轨迹完全限制在安全

xiewf的博客 8062

2. Linux进程(记录)

Linux进程

Qq2022_0918的博客 695

FreeRTOS深入教程(任务创建的深入和任务调度机制分析)

本篇文章将带大家深入学习任务的创建和分析任务调度的机制。本篇文章深入的讲解了任务创建的内部实现和任务调度的源代码分析和实现,学习这篇文章有助于更深入的学习FreeRTOS的源码。

m0_49476241的博客 6389

Android AVB 分析(十二)嵌入式设备安全中的 dm-verity 简介

上一篇 《Android AVB 分析(十一)bootloader 是如何进行 verify boot 检查的?》 分析了 bootloader 中是如何调用 libavb 函数库验证 vbmeta 和 boot 等分区的。接下来就打算写一篇介绍 dm-verity 原理的文章,然后再写一篇徒手 dm-verity 实践的文章,结果偶然发现了本篇的英文原版。写得太好,我觉得自己完全没有必要再写原理了。由于原文是英文,有些英语不太好的朋友不一定能完全理解。我花了点时间,结合 AI 将英语原文翻译成中文。

洛奇看世界 3595

Linux init程序分析

1、init程序剖析     init进程是内核引导过程完成时创建的第一个进程。Linux使用了init进程来对组成Linux的服务和应用程序进行初始化。     当 init 进程启动时(使用传统的sysvinit版本),它会打开一个名为 /etc/inittab 的文件。这个文件是 init 的配置文件,定义了如何对系统进行初始化。这个文件还包含了有关出现电源故障时执行的操作(如果系统支持

Jack Zhou的专栏 2万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

JJJ:linux sysfs相关

sysfs是一个基于内存的虚拟的文件系统目录简介/sys/block存放块设备,提供一设备名(如sda)到/sys/devices的符号链接;/sys/bus按总线类型分类,在某个总线目录之下可以找到链接该总线的设备的符号链接,指向/sys/devices. 某个总线目录之下的drivers目录包含了该总线所需的所有驱动的符号链接。对应kernel中的struct bus_type;/sys/calss。

engineer0的博客 1479

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JJJ:linux idr

IDR(ID Radix Tree)是 Linux 内核中的一种整数管理机制,用于将整数 ID 与指针关联起来。IDR 提供了一种高效的方式来分配和管理唯一的整数 ID,并将这些 ID 映射到相应的指针。在 Linux 内核中,整数 ID 是用于唯一标识各种系统资源或对象的数字。通过将整数 ID 与指针关联,可以快速、高效地管理和访问内存中的资源或对象。这种机制简化了内核的资源管理过程,提高了系统的性能和可靠性。

engineer0的博客 268

JJJ:linux时间子系统相关术语

在传统系统中,CPU 会定期接收时钟中断(ticks),即使它处于空闲状态。这些周期性的时钟中断会导致 CPU 不必要地从低功耗状态唤醒,增加了能耗并减少了电池寿命。通过减少不必要的时钟中断,使 CPU 能够更长时间地保持在低功耗状态。

engineer0的博客 965

JJJ:linux网络子系统内核分析

linux网络子系统内核分析

engineer0的博客 395

JJJ:linux等待队列用法 init_waitqueue_entry

函数用于初始化一个等待队列条目,设置其标志、私有数据和唤醒函数。这是 Linux 内核中管理进程睡眠和唤醒机制的基础部分,确保进程能够在适当的时候被唤醒并继续执行。

engineer0的博客 806

JJJ:rcS脚本是如何被执行到的

parse_inittab 里面会调用 new_init_action(SYSINIT, INIT_SCRIPT, “”),决定了接下去初始化的脚本是INIT_SCRIPT所定义的值。在init_main()函数中会调用parse_inittab(void)函数,parse_inittab(void)函数可以使用一些默认的配置,当/etc/inittab没有配置时。kernel_init执行"/sbin/init",在此程序中,会执行到busybox的init进程入口,init_main.

engineer0的博客 490

JJJ:linux 源码 uapi 目录

一、问题描述 从3.5开始,Linux Kernel 里多了一个 uapi 文件夹,里面放了很多 Linux Kernel 各个模块的头文件。如果是第一次碰到,可能会对这个不是很了解。 二、问题分析 Linux Kernel 中新增的这些 uapi 头文件,其实都是来自于各个模块原先的头文件,最先是由 David Howells 提出来的。uapi 只是把内核用到的头文件和用户态用到的头文件分开。 三、解决方案 3.5 之前 在 3.5 之前,Linux Kernel 的头文件一般是这样的: /* Head

engineer0的博客 899

JJJ:linux内核传参、解析流程

文章目录1 module_param_cb1.1 待解析内容:1.2 涉及到的相关定义:1.3 涉及到的通用定义1.4 基于1.1的展开流程2 module_param3、推荐(详细的参数解析流程) 1 module_param_cb 1.1 待解析内容: // block/genhd.c module_param_cb(events_dfl_poll_msecs, &disk_events_dfl_poll_msecs_param_ops, &disk_events_d

engineer0的博客 779

JJJ--linux irq

由start_kernel找到init_IRQ(arch/arm/kernel/irq.c),到irqchip_init(drivers/irqchip/irqchip.c),到of_irq_init(__irqchip_of_table) drivers/of/irq.c。没有no_map和Radix_Tree_map这两种方式(irq_domain_add_nomap 和 irq_domain_add_tree)

engineer0的博客 1万+

JJJ:linux ida

ida使用起来很简单,就是先分配一个仓库一样的实例,再从这个仓库里面分配一个独一无二的整数id。

engineer0的博客 448

JJJ:linux内核设计与实现 笔记

111

engineer0的博客 571

JJJ:linux共享中断

内核接收一个中断后,它将依次调用在该中断线上注册的每一个处理程序。如果与它相关的设备并没有产生中断,那么处理程序应该立即退出。这需要硬件设备提供状态寄存器(或类似机制),以便中断处理程序进行检查。只要有任何一个设备没有按规则进行共享,那么中断线就无法共享了。多个设备共享一个中断号,共享同一中断的各个中断设备的中断处理程序形成一个链表,内核对每个中断处理程序都要执行(有产生中断的设备本该靠边站的,它的中断处理程序也被执行了)。2、该线上的所有已注册处理程序都指定了SA_SHIRQ。1、中断线当前未被注册。

engineer0的博客 324

JJJ:linux spi总结

在SPI通信中,主设备通过时钟信号来控制从设备的数据传输,数据的传输是在时钟信号的上升或下降沿进行采样的。在SPI通信中,主设备通过时钟信号来控制从设备的数据传输,时钟信号在传输开始前需要有一个确定的起始状态,时钟极性就是用来指定这个起始状态的电平状态。模式0表示时钟空闲状态为低电平,数据在时钟的下降沿采样,上升沿发送。模式2表示时钟空闲状态为高电平,数据在时钟的下降沿采样,上升沿发送。模式3表示时钟空闲状态为高电平,数据在时钟的上升沿采样,下降沿发送。/ 若采用了这个宏,时钟状态空闲时为高电平。

engineer0的博客 374

JJJ: Netlink通信机制的基础概念

Netlink套接字是: 实现 用户进程 与 内核进程通信 的一种进程间通信(IPC) ,也是 网络应用程序 与 内核 通信的最常用的接口。 linux特有的一种特殊的 socket,目前在Linux 内核中使用netlink 进行应用与内核通信的应用很多。比如: 路由 daemon(NETLINK_ROUTE) 用户态 socket 协议(NETLINK_USERSOCK) netfilter 子系统(NETLINK_NETFILTER) 内核事件向用户态通知(NETLINK_KOBJECT_UE

engineer0的博客 250

JJJ - linux reset framework

struct reset_controller_dev 类型。基于 “arch/arm/mach-imx/src.c”看reset_controller_register。关于ARRAY_SIZE这个宏,参考。在函数 imx_src_init中。

engineer0的博客 385
上一篇: JJJ:vim操作实用小技巧
下一篇: JJJ:linux共享中断
你板子冒烟了
博客等级 码龄8年 1278粉丝 582原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值