- 博客(49)
- 收藏
- 关注
转载 busybox启动流程简单解析:从init到shell login
由于遇到一系列定制,从init开始加载不同服务,对服务异常等需要特殊处理。如何在恰当的时机加载恰当的服务?如何对不同异常进行特殊处理?这就有必要分析内核是如何加载init进程的?init进程是按照何种顺序启动各种服务的?init是如何管理这些服务的?系统开机后各种进程都是在哪里创立的?带着这些问题来分析一下kernel->init、init进程本身、inittab配置文件、rcS、/etc/profile等等。1. 从kernel到init在内核启动的最后阶段start_kerne
2022-01-15 11:42:43
1592
转载 linux uevent 机制中的udev 和mdev
一、Uevent机制1.前提摘要(1)Sysfs文件系统 内核设备模型主要的模块和用户之间能看到的相关部分就是sysfs文件系统了。内核在启动的时候会注册sysfs文件系统,并且在启动系统的初期。通过mount命令挂载sysfs文件系统到/sys挂载点。 Mount-tsysfssysfs/sys 那么sysfs文件系统的作用是什么呢。概括的说有三点: 1)、建立系统中总线、驱动、设备三...
2022-01-04 22:41:23
752
转载 linux设备驱动 device add详解
《Linux设备节点创建》内核kobject上报uevent过滤规则_程序改变生活-CSDN博客_netlink_kobject_uevent
2022-01-04 20:13:20
3168
转载 Linux设备树解析
1. Device Tree简介Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a fucking pain in the ass”,引发ARM Linux社区的地震,随后ARM社区进行了一系列的重大修正。在过去的ARM Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码,相当多数的代码只是在描述板级细节,而这些板级细节对于内核来讲,不过是垃圾,如板上的platfor
2021-12-20 23:30:51
2530
1
转载 Linux Command Line 解析
0处理模型Linux kernel的启动包括很多组件的初始化和相关配置,这些配置参数一般是通过command line进行配置的。在进行后续分析之前,先来理解一下command line的处理模型:要处理的对象是一个字符串,其中包含了各种配置信息,通常各个配置之间通过空格进行分离,每个配置的表达形式是如:param=value1,value2或者很简单就是一个rw。那么kernel就需要提供对这些参数进行处理的处理函数列表。根据参数的作用以及执行期的先后不同,这些处理函数被定义到不同的段中。..
2021-12-16 23:50:40
796
转载 linux内核:copy_to_user和copy_from_user
copy_to_user和copy_from_user在linux内核中,我们将用户态数据拷贝到内核或者将用户态数据拷贝到内核,使用的是copy_from_user和copy_to_user。但是在有些情况下,我们直接使用memcpy也不会出现错误,可以正常的将数据从内核态拷贝到用户态以及将数据从用户态拷贝到内核态,memcpy都不会发生错误。没发生错误是不是就不存在错误的情况呢?如果存在错误,那么什么时候使用memcpy会发生错误呢?memcpy和copy_{to/from}_user的区别又是什
2021-12-15 23:33:22
2625
转载 两个进程访问同样的逻辑地址物理地址为何不同
1.Linux 段表In uniprocessor systems there is only one GDT, while in multiprocessor systems there is one GDT for every CPU in the system.2.Linux页表each process has its own Page Global Directory and its own set of Page Tables. When a process switch o.
2021-12-15 22:06:27
510
转载 DTS 杂谈
首先推荐elinux.org上一篇关于Device Tree的文章:Device Tree Usage - eLinux.org这是一篇关于Device Tree的入门文章。对英文犯怵的童鞋也不要紧,我在csdn上找到了翻译稿:ARM Linux 3.x的设备树(Device Tree)_宋宝华-CSDN博客_device tree译文重新组织了部分语言,开头还写了一段关于DT的轶事,不过基本上还是忠于英文原文的。但还是要提个醒,这篇翻译稿比较早了,而英文版在后来又经过几次更新,所以中文翻译
2021-12-10 23:47:23
441
转载 关于initrd和initramfs
一、概念什么是initrd?initrd的解释是initialized RAM disk,就是启动的时候由uboot来初始化内存,当做disk来使用。在uboot启动的时候,uboot会将存储介质中(如Flash)的initrd文件加载到内存,内核启动时会在访问挂载的根文件系统前先访问该内存中的initrd文件系统。在uboot配置了initrd的情况下,文件系统启动被分成两个阶段,第一阶段先执行initrd文件系统中的"某个可执行文件"(linuxrc或init,下面会讲到具体会执行哪一个),完
2021-12-02 20:29:50
5642
转载 linux 内核解压缩四
###cache_on之后cache_on之后段代的代码大体可认为做了三件事:检查内核是否需要移动,如果需要移动则将其移动并重定向.got的内容。 调用decompress_kernel解压内核。 调用call_kernel跳转到Image。###vmlinux(小)的链接脚本://./arch/arm/boot/compressed/vmlinux.lds.in//这个脚本是用来链接vmlinux(小)的,故zImage代码执行时//内核各个段的分布也是在这个脚本中定义的(部分代.
2021-11-28 23:29:34
902
转载 linux 内核解压缩二
打开缓存,初始化mmumov r0, pc cmp r0, r4 ldrcc r0, LC0+32 addcc r0, r0, pc cmpcc r4, r0 orrcc r4, r4, #1 @ remember we skipped cache_on blcs cache_on这里将比较当前PC地址和内核解压地址,只有在不...
2021-11-27 23:25:13
542
转载 linux 内核解压缩一
内核的实际起始函数为 start_kernel() 函数,然后再调用其他函数来执行启动。再调用此函数之前,需要先将通过编译内核获得的 zImage 进行解压,请按成页目录构建等基本任务。 调用 start_kernel 的过程分为以下三个阶段:1.保存boot下传递给内核的参数,并且关闭中断进入svc 模式2.缓存和mmu的初始化;3.内核的搬移;4.内核的解压缩;1.1 准备阶段 解压缩准备阶段将执行中断禁用、分配动态内存、初始化BBS区域、初始化页目录、打开缓存等任务。.
2021-11-27 22:16:07
1073
1
原创 linux uboot 到内核的参数传递
1.通过tag 的方式传递参数; kernel_entry(0, machid, bd->bi_boot_params); /* does not return */跳入内核入口地址:r1=0、r1=machid、r2=启动参数指针2.uboot跳转内核的传参 uboot中增加使用theKernel(0, 362, 0x30000100);来跳转到内核。uboot将r0-r2三个参数传给了内核。 r0 一般设置为0; r1 一般设...
2021-11-18 12:54:31
2876
转载 linux 自动登录
在ubuntu9.10下实现开机自动登录 (转自http://forum.ubuntu.org.cn/viewtopic.php?p=1997543)并运行自己的图形界面程序(本人接触ubuntu时日不长,文中一些说法难免有错误和疏漏之处,还请大家不吝批评指正。)实现步骤分以下三大步:1、 实现ubuntu文本形式启动2、 实现ubuntu自动登录3、 实现程序自动运行一、文本模式启动:两种方法异曲同工:(1) 直接修改/etc/grub/grub.cfg找到类似下面的代码:53...
2021-09-03 23:52:12
987
转载 [console] earlycon实现流程
本文以samsung s5pv210(ARM)为例一、功能说明&使用方法1、功能说明printk的log输出是由console实现(会在其他文章中说明)。由于在kernel刚启动的过程中,还没有为串口等设备等注册console(在device probe阶段实现),此时无法通过正常的console来输出log。为此,linux提供了early console机制,用于实现为设备注册console之前的早期log的输出,对应console也称为boot console,简称bcon。这个co
2021-06-24 15:53:50
1616
转载 [console] early printk实现流程
本文以ARM为例一、功能说明printk的log输出是由console实现(会在其他文章中说明)。由于在kernel刚启动的过程中,还没有为串口等设备等注册console(在device probe阶段实现),此时无法通过正常的console来输出log。为此,linux提供了early console机制,用于实现为设备注册console之前的早期log的输出,对应console也称为boot console,简称bcon。这个console在kernel启动的早期阶段就会被注册,主要通过输出设备
2021-06-24 15:51:09
408
转载 [kernel 启动流程] (第六章)第一阶段之——打开MMU
1、kernel启动流程第一阶段简单说明arch/arm/kernel/head.Skernel入口地址对应stextENTRY(stext)第一阶段要做的事情,也就是stext的实现内容设置为SVC模式,关闭所有中断获取CPU ID,提取相应的proc info验证tags或者dtb创建临时内核页表的页表项配置r13寄存器,也就是设置打开MMU之后要跳转到的函数。使能MMU跳转到start_kernel,也就是跳转到第二阶段本文要介绍的是“使能MMU”的部分。2、疑问主要
2021-06-24 14:57:04
889
转载 [kernel 启动流程] (第五章)第一阶段之——临时内核页表的创建
1、kernel启动流程第一阶段简单说明arch/arm/kernel/head.Skernel入口地址对应stextENTRY(stext)第一阶段要做的事情,也就是stext的实现内容设置为SVC模式,关闭所有中断获取CPU ID,提取相应的proc info验证tags或者dtb创建临时内核页表的页表项配置r13寄存器,也就是设置打开MMU之后要跳转到的函数。使能MMU跳转到start_kernel,也就是跳转到第二阶段本文要介绍的是“创建临时内核页表的页表项”的部分。
2021-06-24 14:54:42
435
转载 [kernel 启动流程] (第四章)第一阶段之——dtb的验证
1、kernel启动流程第一阶段简单说明arch/arm/kernel/head.Skernel入口地址对应stextENTRY(stext)第一阶段要做的事情,也就是stext的实现内容设置为SVC模式,关闭所有中断获取CPU ID,提取相应的proc info验证tags或者dtb创建页表项配置r13寄存器,也就是设置打开MMU之后要跳转到的函数。使能MMU跳转到start_kernel,也就是跳转到第二阶段本文要介绍的是“验证tags或者dtb的合法性”的部分。因为现在基本
2021-06-24 14:50:16
436
转载 [kernel 启动流程] (第三章)第一阶段之——proc info的获取
1、kernel启动流程第一阶段简单说明arch/arm/kernel/head.Skernel入口地址对应stextENTRY(stext)第一阶段要做的事情,也就是stext的实现内容设置为SVC模式,关闭所有中断获取CPU ID,提取相应的proc info验证tags或者dtb创建页表项配置r13寄存器,也就是设置打开MMU之后要跳转到的函数。使能MMU跳转到start_kernel,也就是跳转到第二阶段本文要介绍的是“获取CPU ID,提取相应的proc info”的部
2021-06-24 14:41:16
428
转载 [kernel 启动流程] (第二章)第一阶段之——设置SVC、关闭中断
1、kernel启动流程第一阶段简单说明arch/arm/kernel/head.Skernel入口地址对应stextENTRY(stext)1第一阶段要做的事情,也就是stext的实现内容设置为SVC模式,关闭所有中断获取CPU ID,提取相应的proc info验证tags或者dtb创建页表项配置r13寄存器,也就是设置打开MMU之后要跳转到的函数。使能MMU跳转到start_kernel,也就是跳转到第二阶段本文要介绍的是“设置为SVC模式,关闭所有中断”的部分。分成两部
2021-06-24 14:34:33
897
转载 [kernel 启动流程] (第一章)概述
一、kernel启动之前的准备动作在kernel启动之前的准备都是由bootloader来完成。所以不管是什么bootloader,例如uboot、LK、superboot等等,都需要实现以下准备动作。这里指说明概念,不涉及代码。我们在project X项目中使用的bootloader是uboot,具体代码参考第四节“kernel准备动作在uboot中的实现”1、kernel镜像加载到ddr的相应位置kernel镜像一般会存在于存储设备上,比如FLASH\EMMC\SDCARD.因此,需要先.
2021-06-24 14:30:01
1241
转载 [kernel 启动流程] 前篇——vmlinux.lds分析
以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为例一、基础部分1、段说明text段代码段,通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定。data段数据段,通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。bss段通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。BSS段属于静态内存分配。init段linux定义的一种初始化过程中才会用到的段,一旦初始化完成,那么这些
2021-06-24 14:07:51
1131
转载 使用data breakpoint 追踪地址寄存器被修改的问题
一. 介绍data breakpoint是一种特殊的断电,在处理检查到预设地址的值发生R/W操作时,发生断点中断。二. 使用方法1kernel有示例代码,在data_breakpoint.c中,在这里,kernel检查的是symbol的值发生变化,但是实际上测试发现直接使用寄存器地址也是可以的。 看看.config里面,CONFIG_SAMPLES是否选中。位置在Kernel Hacking/Sample kernel code。samples目录好像不在缺省编译的范围内,自己手动编译就
2021-06-22 18:08:05
1144
转载 用uboot 烧写uboot linux内核 文件系统到nandflash的 过程以及bootm go命令启动与区别
文章结构结构顺序有变化-1:烧写uboot0: bootargs bootcmd 命令参数的设置1:制作yaffs2的过程2:烧写yaffs2的过程3:制作uimage 的过程4: 烧写uiamge的过程5:uimage zimage vmlinux 的区别6: uboot传递给内核的参数结构 tag7:bootm go 的 启动过程 以及区别8:加载地址 入口地址 等///通过uboot烧写uboot到nandflash///nand erase 0 50000/
2021-06-18 11:02:30
1156
转载 从0移植uboot启动流程分析
经过了上一篇的配置,我们已经执行make就可以编译出一个uboot.bin,但这还不够,首先,此时的uboot并不符合三星芯片对bootloader的格式要求,其次,此时的uboot.bin也没有结合我们的开发板进行配置,还无法使用。而要进行这样的个性化配置,前提条件就是对uboot开机流程和编译系统有所了解,本文主要讨论前者。uboot是一个两阶段bootloader,第一阶段主要做硬件直接相关的初始化,使用汇编编写;第二阶段主要为操作系统的运行准备环境,主要用C编写,这里以ARM平台为例分析其启动流程。
2021-06-17 11:19:22
238
转载 nandflash 启动
S3C2440和S5PV210是很多 嵌入式爱好者入门的arm处理器,网上的资料也很多。今天我们就来聊聊S3C2440和S5PV210的启动流程,上一篇博客我介绍了uboot在norflah上的启动流程(重要!这是基础)。今天,我们来聊聊uboot在nandflash上的启动流程。一. nandflash 与 norflash 同样,你现在肯定心里有疑问 何为norflash?何为nandflash? 他们之间有什么异同? norflash我上篇博客已经介绍了(再重复一下吧)
2021-06-17 11:11:10
1682
转载 norflash启动uboot
转载:https://blog.csdn.net/kernel_yx/article/details/53045424最近一段时间一直在做uboot移植相关的工作,需要将uboot-2016-7移植到单位设计的ARMv7的处理器上。正好元旦放假三天闲来无事,有段完整的时间来整理下最近的工作成果。之前在学习uboot时,在网上看了很多文章,很多都是基于老版本的的uboot,并且很多都是直接从代码开始分析,并没有将uboot与ARM处理器体系结构结合起来。毕竟很多时候做一件事情,你知道怎么去做这件事和你知道这
2021-06-17 11:04:52
1211
转载 Linux GPIO 驱动 (gpiolib)
前情基于 linux gpio 会在 /sys/class/gpio 目录下会生成 export, unexport 文件,当然也有 gpiochipx 文件,gpiochipx 是对引脚的管理,如某一个 chip 可能控制着一定数量的引脚,在相应目录下 ngpio 是控制的数量。 执行 echo 4 > /sys/class/gpio/export 的时候会在 /sys/class/gpio 目录下生成 gpio4 目录,在这个目录下会有 如 value, edge, direction 等相关文
2021-04-13 00:00:05
974
转载 linux下通过sysfs操作GPIO
在嵌入式设备中对GPIO的操作是最基本的操作。一般的做法是写一个单独驱动程序,网上大多数的例子都是这样的。其实linux下面有一个通用的GPIO操作接口,那就是我要介绍的 “/sys/class/gpio” 方式。首先,看看系统中有没有“/sys/class/gpio”这个文件夹。如果没有请在编译内核的时候加入 Device Drivers-> GPIO Support-> /sys/class/gpio/… (sysfs interface)。/sys/class/gpio 的使用说明:1
2021-04-12 22:31:21
496
转载 Linux MTD子系统学习(四)
5 Linux mtd设备注册5.1 mtd字符设备注册5.1.1 init_mtd源码:drivers/mtd/mtdcore.cstatic int __init init_mtd(void){int ret;ret = class_register(&mtd_class);if (ret) goto err_reg;mtd_bdi = mtd_bdi_init("mtd");if (IS_ERR(mtd_bdi)) { ret = PTR_ERR(mtd_bdi);
2021-04-08 20:55:15
205
转载 Linux MTD子系统学习(三)
4 Linux mtd分区的建立4.1 mtd分区的建立方法4.1.1 内核添加在内核中添加分区表是就内核常用的方法,主要是在平台设备中添加mtd_parttion,如下:struct mtd_partition m25p80_part[] = {{.name = “Bootloader”,.offset = 0,.size = (1 * SZ_1M),.mask_flags = MTD_CAP_NANDFLASH,},{.name = “
2021-04-08 20:53:37
525
转载 Linux MTD子系统学习(二)
Linux MTD spi-nor驱动分析3.1 spi-nor设备驱动框架3.2 spi-nor设备注册如果希望一个spi设备可以在linux系统下很好的工作,除了写驱动,还要向内核申明和注册这个spi设备。目前有两种方法向内核注册一个spi设备。在稍微老点版本的内核(2.6.xx)中通过向内核注册struct spi_board_info对象,来申明一个spi设备。在比较新的内核中(3.xx)使用device tree的方式向内核申明并注册一个spi设备的。无论使用哪种方式,其实最终的目的就是为
2021-04-08 20:51:13
625
转载 Linux MTD子系统学习(一)
1 Linux MTD基本概述1.1 专有名词描述1. MTD:Memory Technology Device,内存技术设备。2. JEDEC:Joint Electron Device Engineering Council,电子电器设备联合会。3. CFI:Common Flash Interface,通用Flash接口,Intel发起的一个Flash的接口标准。4. OOB: out of band,某些内存技术支持out-of-band数据——例如,NAND flash每512字节的块有
2021-04-08 20:44:41
924
转载 echo /sbin/mdev > /proc/sys/kernel/hotplug 作用解析
参见:https://zhidao.baidu.com/question/1606465593857998667.htmllinux系统对于热插拔事件的产生默认都是调用/sbin/hotplug,该程序通过加载驱动程序,创建设备节点,挂载分区等。如果系统中不是/sbin/hotplug来执行,而是mdev,那么用户应当在早期启动的时候将该执行档(包含绝对位置)设置进去,于是有了上面的echo /sbin/mdev> /proc/sys/kernel/hotplug。我们可以在脚本中注释掉该命令行,重
2021-04-08 19:15:40
739
转载 Linux下简单的mount命令实现--使用hexdump 查看文件系统(自动识别文件系统类型)
背景简述mount()/umount()为Linux下挂载和卸载磁盘分区的系统调用,函数原型分别如下:int mount(const char *source, const char *target,const char *filesystemtype, unsigned long mountflags, const void *data);int umount(const char *target);1234mount()的filesystemtype这个参数需要填入需要挂载的磁盘分区的
2021-04-07 12:43:33
914
转载 early_printk使用方法
这里写 (一)知识背景:[color=Red]Uncompressing Linux... done, booting the kernel.------------setup_arch------------------------setup_machine_fdt return 0------------Machine: MCUOS6410[/color]Linux version 3.0.30-g4e794c6-dirty (zswan@zswan-laptop-ubuntu) (gcc v
2021-03-30 11:05:32
526
1
转载 在linux 内核中寻找系统调用的昂发
问题:经常需要在内核中查找系统调用的定义,比如sys_waitpid,如何快速找到呢?解决:1、在老版本内核中,系统调用通常定义为sys_*,所以可以直接通过相关符号查找。2、但新版本中,系统的调用方式不同,采用了SYSCALL_DEFINE的定义方式,由于各系统调用的实现比较分散,查找起来不算方便。具体查找方法如下:1)通过sys_的方式找到相应函数的声明,如(include/linux/Syscall.h):asmlinkage long sys_waitpid(pid_t pid, int
2021-03-27 14:51:01
183
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人