面试1-5
内核态,用户态的区别 系统态(也称为管态或核心态),操作系统在系统态运行--运行操作系统程 序 用户态(也称为目态),应用程序只能在用户态运行一-运行用户程序 当一个进程在执行用户自己的代码时处于用户运行态((用户态),此时特权 级最低,为 3级,是普通的用户进程运行的特权级,大部分用户直接面对的程序 都是运行在用户态。Ring3状态不能访问 Ring0 的地址空间,包括代码和数据; 当一个进程因为系统调用陷入内核代码中执行时处于内核运行态(内核态),此 时特权级最高,为 0级。执行的内核代码会使用当前进程的内核栈,每个进程都 有自己的内核栈。 用户运行一个程序,该程序创建的进程开始时运行自己的代码,处于用户态。 如果要执行文件操作、网络数据发送等操作必须通过 write、send 等系统调用, 这些系统调用会调用内核的代码。进程会切换到 Ring0,然后进入 3G-4G 中的内 核地址空间去执行内核代码来完成相应的操作。内核态的进程执行完后又会切换 到 Ring3,回到用户态。这样,用户态的程序就不能随意操作内核地址空间,具 有一定的安全保护作用。这说的保护模式是指通过内存页表操作等机制,保证进 程间的地址空间不会互相冲突,一个进程的操作不会修改另一个进程地址空间中 的数据。 bootloader 内核根文件的关系 启动顺序∶bootloader->linuxkernel->rootfile 后者需要前者提供功能支持,前者的目的就是启动后者。 嵌入式Linux系统启动过程Linux 引导的整个过程∶当系统首次引导时,或 系统被重置时,处理器会执行一个位于F1ash/ROM 中的已知位置处的代码, Bootloader 就是这第一段代码。它主要用来初始化处理器及外设,然后调用 Linux 内核。Linux 内核在完成系统的初始化之后需要挂载某个文件系统作为根 文件系统(RootFilesystem),然后加载必要的内核模块,启动应用程序。(一 个嵌入式Linux 系统从软件角度看可以分为四个部分;引导加载程序 (Bootloader),Linux内核,文件系统,应用程序。) 嵌入式Linux系统通过Bootloader 引导,一上电,就要执行Bootloader来 初始化系统。在完成对系统的初始化任务之后,它会将非易失性存储器(通常是 Flash或D0C等)中的Linux内核拷贝到 RAM中去,然后跳转到内核的第一条指 令处继续执行,从而启动Linux 内核。Bootloader和Linux 内核有着密不可分 的联系。 Bootloader多数有两个阶段的启动过程∶ Stage1∶是汇编的 1)基本的硬件初始化(关闭看门狗(单片机程序中为什么要禁止看门狗 http∶//www.sohu.com/a/122050439_505888)和中断,MU(带操作系统),CACHE。 配置系统工作时钟) 2)为加载 stage2准备 RAM 空间 3)拷贝内核映像和文件系统映像到RAH 中 4)设置堆栈指针 sp 5)跳到 stage2的入口点 Stage2∶c语言的 1)初始化本阶段要使用到的硬件设备(1ed uart 等) 2)检测系统的内存映射 3)加载内核映像和文件系统映像 4)设置内核的启动参数 嵌入式系统中广泛采用的非易失性存储器通常是Flash,而 Bootloader 就位 于该存储器的最前端,所以系统上电或复位后执行的第一段程序便是 Bootloader。 inux 的内核是由 bootloader装载到内存中的? 解析∶1inux的内核的确是由 bootloader 装载到内存中的。1inux的 bootloader有2个部分组成∶bootstrap和uboot。所以更准确点的说法是∶1inux 的内核是由 uboot装载到内存中的。内核文件本身是存放在硬盘的文件系统中, 这句话就是错的。内核和文件系统是分开存储的。uboot 读取kerne1到内存是 从 kerne1开始存储的地址开始读取的,而读取开始位置和读取大小,是由环境 变量决定的。所以这个时候不需要文件系统的。 给你张图片,便于理解吧。这张图片是bootstrap、uboot、环境变量、kernel、 文件系统在 nandf1ash 里面的存储分布
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
