快讯
HOME
快讯
正文内容
nand驱动测试 Linux Linux 的启动流程
发布时间 : 2024-10-05
作者 : 小编
访问数量 : 23
扫码分享至微信

Linux 的启动流程

本篇的重点是讲解设备和驱动的启动流程,设备和驱动的流程是整个内核启动的核心,也是工作中最常面对的问题。出于知识点的系统性考虑,在进入主题之前我们先看下整个 Linux 在 ARM 中的启动流程如何。

Uboot 的启动流程

ARM Linux 的启动流程大致为:Uboot → Kernel → Root filesystem。Uboot 在上电的时候就拿到 CPU 的控制权,实现了硬件的初始化。具体是怎么实现的呢?一起来看一下,CPU 的内部集成了小容量的 Sram,而 PC 指针一上电就指向 Sram 的起始地址 0x00000000,所以一上电 Uboot 代码就得到了运行。

Uboot 拿到 CPU 使用权就开始做初始化工作,比如关闭看门狗、设置 CPU 运行模式、设置堆栈、初始化内存、网卡、nand flash 等,最后把 Linux 内核加载到内存中。

初始化 RAM

因为内核要在 RAM 中运行,所以在调用内核之前必须初始化和设置 RAM,为调用内核做好准备。

初始化串口

内核在启动过程中可以将信息通过串口输出,这样就可以清楚的知道内核启动信息。虽然串口不是 Uboot 必须要完成的工作,但是通过串口可以方便调试 Uboot 和内核的各种信息。

检测处理器类型

Uboot 在调用内核前需要检测系统的处理器类型,并将其保存在某个变量中提供给内核,内核在启动过程中会根据该处理器的类型调用相应的初始化程序。

设置内核启动参数

内核在启动过程中会根据该启动参数进行相应的初始化工作。

调用内核镜像

值得注意的是存储 Uboot 的存储器不同,Uboot 的执行过程也并不相同,一般来讲 Flash 分为 nor Flash 和 nand Flash 两种:nor Flash 支持芯片内执行(XIP,eXecute In Place),这样代码可以在 Flash 上直接执行而不必复制到 RAM 中去执行。

但是 nand Flash 并不支持 XIP,所以要想执行 nand Flash 上的代码,必须先将其复制到 RAM 中去,然后跳到 RAM 中去执行。如果内核存放在 nor Flash 中,那么可直接跳转到内核中去执行。但通常由于在 nor Flash 中执行代码会有种种限制,而且速度也远不及 RAM 快,所以一般的嵌入式系统都是将内核复制到 RAM 中,然后跳转到 RAM 中去执行。不论哪种情况,在跳到内核执行之前 CPU 的寄存器必须满足以下条件:r0 = 0,r1 = 处理器类型,r2 = 标记列表在 RAM 中的地址。

Linux 内核的启动流程(设备和驱动的加载)

关于 Uboot 的启动本课程不做详细介绍,因为本课程的主要内容是内核。在讲述内核启动之前让我们先了解下内核的组成结构:

其中,

(1)vmlinusx 是 ELF 格式的 Object 文件,这种文件只是各个源代码经过连接以后得到的文件,并不能在 ARM 平台上运行。

(2)经过 objcopy 这个工具转换以后,得到了二进制格式文件 Image,Image 文件相比于 vmlinusx 文件,除了格式不同以外,还被去除了许多注释和调试的信息。

(3)Image 文件经过压缩以后得到了 piggy.gz,这个文件仅仅是 Image 的压缩版,并无其他不同。

(4)接着编译生成另外几个模块文件 misc.o、big_endian.o、head.o、head-xscale.o,这几个文件组成一个叫 Bootstrap Loader 的组件,又叫引导程序,编译生成 piggy.o 文件。

(5)最后 piggy.o 文件和 Bootstrap Loader 组成一个 Bootable Kernel Image 文件(可启动文件)。

经过上面的分析不难知道 piggy.o 就是内核镜像,而剩下的几个文件就组成了引导程序。知道了内核的组成结构,Uboot 就是按照内核的组成结构一层一层剥开然后引导内核的:

可以说 start_kernel之前的所有工作都是为了将环境准备好,满足start_kernel的要求,然后由start_kernel开始进行内核的加载:

关于 start_kernl函数的内容太多,可以通过红色回调函数看出,start_kernel函数基本是在回调很多对应的注册函数。为了本系列课程的结构性这里就不展开所有知识点讲解,本篇内容接着前一篇设备树的内容重点讲解下设备和驱动的匹配过程。

还记得上一篇讲到的设备树三大作用吗?

平台标识;

运行时配置;

设备信息集合。

接下来我们就看看内核在启动的时候是如何寻找设备,驱动又如何和设备绑定的。

首先在平台目录下可以看到有很多平台描述的文件,如图:

有那么多的平台,我们到底要执行哪个平台是首先要考虑的事情。这也是设备三大功能的第一个功能——平台标识。

设备树里有对设备根节点的 Compatible 描述,平台文件里有对 __initconst的描述,如果两个字段一致则找到了对应的板级文件,这样就通过设备树把要用的设备平台与其他平台区分开来了,如图:

找到平台后就可以根据回调函数的指针调用该平台的注册函数。这里以飞思卡尔 imx.6dl 平台为例,回调的时候会调用 imx6q_init_machine函数,如下:

这里补充一个知识点,细心的读者也许发现了在 Compatible 字段里用逗号分隔了两个字符串。板级匹配的时候用的是哪个字符串,另外一个字符串又是做什么用?首先后面的字段 "fsl,imx6dl" 是抽象共用平台描述符,前面的字段 "fsl,imx6dl-sabresd" 是通用平台下的具体平台描述符,可以理解为母板和子板的区别。在具体的子板文件中我们可以通过前面的字段进行设备信息的获取,如图:

接着是运行时配置,让内核在启动的时候根据参数设置进行不同的处理。有经验的读者清楚在 Uboot 里也有对 Bootargs 的配置,这里为什么多此一举呢,是为了在 Uboot 中更灵活的对内核启动进行配置。

最后的作用就是设备信息集合,这是设备和驱动匹配的核心,也是工作中面对最多的情况。出于这一作用的内容是工作中经常遇到的重点也是难点,我们专门用一篇内容来详细讲解各级设备是如何展开的,并且手把手教你如何定制一套自己的开发板全新案例。

程序员笔记:LINUX安装NVIDIA驱动程序

众所周知,Linux发行版繁多,不同版本之间差异奇大,对Nvidia驱动的支持也是良莠不齐。

作为一个Linux发行版,如何集成一个可用的显卡驱动是一个不得不面对的问题。N卡的Linux驱动分为开源驱动和闭源驱动。开源驱动就是大名鼎鼎的nouveau。

在法文中,Nouveau的意思相当于"new",就是新的意思,是一个由爱好者组织的针对Nvidia显卡开发的第三方开源3D驱动的共同项目,并且nouveau是在完全没有得到NVIDIA任何支持的情况下进行开发的,Nouveau算是X.Org基金会的一个项目(注:X.Org基金会是负责X Window System开发的社团,2004年1月22日在Open Group的X.org网站基础上建立。 )。开发所用方式我们也都很熟悉,和创新声卡kX驱动当年开发的方法类似,反编译Nvidia的Linux显卡驱动,然后进行再加工深处理的进一步开发工作。

由于其开源特性,Nouveau是是Linux KMS驱动的一部分,最新的版本在Linux内核中支持Nvidia的帕斯卡构架。

但是,其与NVIDIA官方驱动存在冲突,并且会影响GPU运行的可靠性。因此,对于显卡使用需求不高的用户,可以考虑直接使用Linux KMS集成的nouveau驱动。但对于游戏、高性能计算、3D渲染等场景,则需要使用Nvidia GPU官方驱动。

在Linux系统中安装NVIDIA显卡驱动前,建议先卸载Linux系统自带的显卡驱动nouveau。

# 查看是否开启

lsmod | grep nouveau

#不同Linux系统nouveau驱动禁用方式

Ubuntu

创建文件/etc/modprobe.d/blacklist-nouveau.conf,添加如下文本:blacklist nouveauoptions nouveau modeset=0重新生成initramfs$ sudo update-initramfs -u

Fedora

创建文件/usr/lib/modprobe.d/blacklist-nouveau.conf,添加如下文本:blacklist nouveauoptions nouveau modeset=0重新生成initramfs。$ sudo dracut --force

RHEL/CentOS

创建文件/etc/modprobe.d/blacklist-nouveau.conf,添加如下文本:blacklist nouveauoptions nouveau modeset=0重新生成initramfs$ sudo dracut --force

OpenSUSE

创建文件/etc/modprobe.d/blacklist-nouveau.conf,添加如下文本:blacklist nouveauoptions nouveau modeset=0重新生成initrd$ sudo /sbin/mkinitrd

SLES

SLES中未安装nouveau驱动。

#重启电脑

reboot

#验证是否屏蔽成功

lsmod | grep nouveau

成功禁用nouveau后,到官网下载对应版本驱动的.run文件,进行Nvidia闭源驱动的安装

#安装驱动

./NVIDIA-Linux-x86_64-515.76.run

如果希望命令行静默安装,则

./NVIDIA-Linux-x86_64-515.76.run -s

在安装过程中,最后会提示我们安装 xconfig, 这时候果断选"no"。

显卡驱动里集成的opengl版本可能与Linux桌面环境的opengl版本冲突,则

./NVIDIA-Linux-x86_64-515.76.run --no-opengl-files

#查看显卡基本信息:

nvidia-smi

nvidia-smi展示显卡状态

如果可以看到显卡的信息,那么这次安装的驱动就可以正常打开了。

相关问答

如何在 Linux 系统上验证 驱动 模块?

在系统上执行depmod-a命令后,会在/lib/modules/`uname-r`/目录下创建modules.*map文件,如何能确认硬件所需要的驱动模块是什么,就需要通过硬件的ID...

linux驱动 程序如何调用?

Linux驱动程序可以通过特定的接口被调用,在Linux内核中,所有的设备驱动都是一个个独立的模块。这些模块可以被加载或卸载,也可以被使用者调用。要调用Linux驱...

linux 内核原理与分析?

Linux内核原理与分析如下:进程管理。Linux内核负责创建、调度和中止进程。每位进程都有一个惟一的进程ID,用于分辨不同的进程。显存管理。Linux内核负责分...

研究生学 linux驱动 怎么样?

研究生学习Linux驱动是一个非常具有挑战性和丰富实践经验的过程。通过深入学习Linux内核机制和驱动开发技术,研究生可以掌握系统编程的核心原理和技能,学习Lin...

linux 重启之后一直连不上?

Linux系统上,如果能够搜索到无线网络,但是无法链接:1、使用手机看下能否连接此无线网络,如果能够连接的话,建议您重新启动Linux系统再进行连接。2、重新安...

linux驱动 培训半个月是什么水平?

Linux驱动培训半个月的时间相对较短,具体能够达到的水平会因个人的学习背景、基础知识和努力程度而有所不同。在半个月的时间内,学员可能会对Linux驱动开发的...

如何在 Linux 系统安装显卡 驱动 ?

给你总结一下吧!1.先看硬件列表,用lspci,找到VGA那一行,确定型号2.网上找相应型号的驱动并下载3.安装之前,要禁掉X-serveri:方法为:vim/etc/X11/xorg......

linux 中socket是如何调用 驱动 程序?

Linux中的socket可以通过系统调用接口调用驱动程序。系统调用接口是一种用户空间的接口,通过该接口,用户空间的程序可以请求操作系统内核提供服务,例如创建...

Linux 原理与应用学什么?

1、Linux概述什么是Linux简单地说,Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于Intelx86系列CPU的计算机上。其目的是建立不受任何...

Tenda311Ma无线网卡怎么在 Linux 安装 驱动 ?

我看过Tenda官网,有linux下的311ma无线网卡驱动应该是RPM包下好之后在linux里的命令行里用rpm-ivh311ma**.rpm安装了如果是源码就需要GCC工具。。。。...

 女王陛下的甜品师  redfoo 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2024  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部