在学习资料满天飞的大环境下,知识变得非常零散,体系化的知识并不多,这就导致很多人每天都努力学习到感动自己,最终却收效甚微,甚至放弃学习。我的使命就是过滤掉大量的垃圾信息,将知识体系化,以短平快的方式直达问题本质,把大家从大海捞针的痛苦中解脱出来。

文章目录

  • 1 什么是文件系统
  • 2 从根文件系统启动第一个应用程序

1 什么是文件系统

什么是文件系统?文件系统的作用是什么?没有文件系统可不可以?操作系统和文件系统有什么关系?

文件系统就是文件管理系统。从字面意思理解就是管理文件的系统。嵌入式设备需要管理的硬件资源主要有以下几类:CPURAMROMIO 。用来管理CPU资源的就是调度系统;用来管理RAM资源的就是内存管理系统;用来管理ROM资源的就是文件系统;用来管理IO资源的就是输入输出系统。这些系统都属于操作系统旗下的子系统,这些子系统都是用来管理硬件资源的,这也是操作系统存在(或者说被创造)的最大的价值。

那什么又叫做 管理 呢?管理就是将硬件资源合理高效地利用起来,并为上层软件提供标准的接口以便上层软件更简单地使用底层的硬件资源。所以,操作系统以及其子系统最重要的 目的 就是改善硬件使用的 效率便捷性 。明确这个目的很重要,因为系统中的大部分设计最终都指向该目标。

文件是依赖文件系统而存在的,没有了文件系统也就没有了文件的概念。其实在没有文件系统和文件的情况,嵌入式软件想要使用ROM就按照字节或者结构体去读写。但这种方式有很大的缺陷,比如存储的内容要求地址必须连续,多个线程同时访问时会产生冲突等等。为了解决这些问题,文件系统才应运而生。

文件是基于 面向对象 思想进行设计的。文件其实就是一个对象,有着自己的存储结构和相应的操作方法,对象类型就是文件系统类型。也可以从 协议 的角度来理解文件和文件系统,文件的存储结构和相应的操作方法就是一种对二进制数据编码和解析的一组协议。

至于什么是根文件系统,这里埋个伏笔,大家先跟着后面的文章一步步去应用、去创建、去阅读源码,等到本系列的最后我们再来剖析这个问题。

2 从根文件系统启动第一个应用程序

应用程序存放在文件系统里,或者说应用程序以文件的格式存放在ROM中。

为什么要这样设计呢?因为从逻辑和使用习惯上要求需要将文件系统和Linux内核代码分割开来编译和存放。内核负责为应用程序提供启动前和启动后的各项服务,文件系统用来存放应用程序。由于应用程序的种类和数目非常多,而且还有可能根据用户的需求动态调整(比如朋友推荐了一款好用的软件,你肯定也想着在自己的电脑或手机上装一个),所以将这些 经常变化 的东西和 不经常变化 的内核分割开来存放是最好的选择。

内核通过init进程启动第一个应用程序标志着用户态的开启。init进程前一半是运行在内核态的,后一半是运行在用户态的,并在用户态驻扎下来变成守护进程,监视其他用户进程的运行。所以,init进程(关于Linux进程和线程的深入分析,我们放在后续的CPU调度专题分析,防止一入门就劝退~)是系统中所有其他用户进程的祖先进程。

下面,我们主要看一下内核中第一个应用程序是谁,在何时启动的。

第一个应用程序是由init进程调用的,我们从 kernel_init() 函数看起:

/* /init/main.c */static int __init kernel_init(void * unused)
{.../** Ok, we have completed the initial bootup, and* we're essentially up and running(此时,已经进入怠速状态). * Get rid of the initmem segments and start the user-mode stuff..* (从这里开始进入用户态)*/init_post();return 0;
}

接下来展开 init_post() 函数分析。该函数主要做了两件事。

一件是创建0、1、2号文件映射到控制台设备,分别对应着标准输入、标准输出和标准错误,以便应用程序可以使用scanf()、printf()和err()函数。

另一件就是启动第一个应用程序。启动应用程序使用的是 run_init_process() 函数,直到启动成功一个为止。看来init进程也是一个不折不扣的花心大萝卜了,居然有这么多备胎~~ 有兴趣的TX可以将这几个应用程序都试一试,我自己只把execute_command破坏了,试了一下/sbin/init,也是可以正常启动的。

/* This is a non __init function. Force it to be noinline otherwise gcc* makes it inline to init() and it becomes part of init.text section* (该函数使用noinline属性就是为了防止该函数被编译到init.text,后续在* CPU调度专题中会深入介绍这个操作的效果,因为一开始就一头扎进去很容易劝退~)*/
static int noinline init_post(void)
{free_initmem();unlock_kernel();mark_rodata_ro();system_state = SYSTEM_RUNNING;numa_default_policy();/*第0个文件:标准输入,映射到/dev/console设备*/if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0) printk(KERN_WARNING "Warning: unable to open an initial console.\n");(void) sys_dup(0); /*第1个文件:标准输出,映射到/dev/console设备*/(void) sys_dup(0); /*第2个文件:标准错误,映射到/dev/console设备*/if (ramdisk_execute_command) { /*该参数为空*/run_init_process(ramdisk_execute_command);printk(KERN_WARNING "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.*//*该参数是从uboot传递过来的,为/Linuxrc*/if (execute_command) {run_init_process(execute_command);printk(KERN_WARNING "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系统设计思想——04文件系统(一)相关推荐

  1. 一起分析Linux系统设计思想——05字符设备驱动框架剖析(四)

    在学习资料满天飞的大环境下,知识变得非常零散,体系化的知识并不多,这就导致很多人每天都努力学习到感动自己,最终却收效甚微,甚至放弃学习.我的使命就是过滤掉大量的垃圾信息,将知识体系化,以短平快的方式直 ...

  2. 一起分析Linux系统设计思想——05中断框架剖析(二)

    在学习资料满天飞的大环境下,知识变得非常零散,体系化的知识并不多,这就导致很多人每天都努力学习到感动自己,最终却收效甚微,甚至放弃学习.我的使命就是过滤掉大量的无效信息,将知识体系化,以短平快的方式直 ...

  3. 一起分析Linux系统设计思想——03内核启动流程分析(六)

    在学习资料满天飞的大环境下,知识变得非常零散,体系化的知识并不多,这就导致很多人每天都努力学习到感动自己,最终却收效甚微,甚至放弃学习.我的使命就是过滤掉大量的垃圾信息,将知识体系化,以短平快的方式直 ...

  4. 分析Linux磁盘管理与文件系统专题三

    1.前言 紧接着我的上一篇博客进行磁盘管理操作: http://zhangfengzhe.blog.51cto.com/8855103/1430531 我们已经对磁盘进行了分区,信息如下: [root ...

  5. usb接口linux系统设计,AUFS 联合文件系统 - 基于USB接口的微型桌面Linux系统设计

    3.4 AUFS 联合文件系统 AUFS( Another UnionFS 的缩写), 是一个与UnionFS 类似的可堆叠联合文件系统,它将多个目录整合成单一的目录,是Linux 文件系统联合挂载的 ...

  6. linux文件系统分隔符,Linux的哲学思想和文件系统

    Linux的哲学思想 Linux是一个自由的操作系统,其内部也有着自己独特的一些特定的规则,就是我们所说的关于Linux的哲学思想. Linux系统的哲学思想 1.一切皆文件:Linux系统把几乎所有 ...

  7. 关于linux下的嵌入式文件系统以及flash文件系统选择(转)

    嵌入式linux下常见的文件系统 • RomFS:只读文件系统,可以放在ROM空间,也 可以在系统的RAM中,嵌入式linux中常用来作 根文件系统 • RamFS:利用VFS自身结构而形成的内存文件 ...

  8. ARM嵌入式Linux系统设计与开发

    ARM嵌入式Linux系统设计与开发 基本信息 作者: 俞辉    李永    刘凯    王晓虹    丛书名: 高等院校计算机教材系列 出版社:机械工业出版社 ISBN:9787111300045 ...

  9. 操作系统设计思想--主奴思想

    操作系统设计思想–主奴思想 对于操作系统而言,如何稳定可靠运行无疑是最重要的.目前的方案均为将用户进程和其他用户进程.将用户进程和操作系统进行分离.实现操作系统可以管理用户进程,但用户进程不能侵入内核 ...

最新文章

  1. Delphi编辑器使用指南
  2. server2008中如何关闭internet explorer增强的安全配置
  3. IntelliJ IDEA 乱码:全网最全 4 种方法完美解决 IntelliJ IDEA 控制台中文乱码问题
  4. 网络游戏中的数据包设计和定义(初论)
  5. ECharts折线图自定义横坐标显示或隐藏
  6. 计算机学院静态网页毕业论文,静态网页毕业论文静态网页毕业论文.doc
  7. 设计一个高性能三维渲染服务器,最强大脑-CATIA飞机协同设计制造工作站配置方案2016...
  8. Ubuntu 16.04无线网卡RTL8723BE频繁掉线及信号不足解决办法
  9. html页面国际化之谷歌翻译js实践,支持通过判断浏览器语言自动将中文翻译成英文
  10. git--工作区、暂存区、本地仓库、远程仓库
  11. nii数据转png图像
  12. Android Genymotion使用中文输入法
  13. 蒟蒻的第一篇博客——博弈
  14. 【教程】教你如何获得超能力!
  15. 厉害啦,八万腾讯员工有望拿到专属退休金,这背后意味着什么?
  16. linux系统初始化ansible-playbook文件
  17. 7-24 约分最简分式 (15 分)(python编写)
  18. python解释器之PyPy解释器
  19. Maven的依赖配置
  20. java新人培训_Java新人学习必要的步骤以及全套学习路线!

热门文章

  1. AI落地步入深水区 , 旷视、依图、云从、商汤该学会赚钱了
  2. UG NX二次开发(C#)-曲线-创建样条曲线的几种方法
  3. 49.逻辑卷管理4,逻辑卷管理详解,lvscan,lvcreate,lvdisplay,lvextend,lvreduce,lvremove,lvresize,lvchange
  4. 重新系统后的飞信使用
  5. VIDIOC_S_CROP inappropriate ioctl for device的解决办法
  6. c语言读取json配置文件
  7. Linux系统学习攻略带你学会Linux
  8. 面试后哪些表现,说明你面试失败了?
  9. 跑步用什么牌子的耳机好、跑步运动骨传导耳机品牌排行榜
  10. python猴子吃桃子