1、Linux内核的组成部分
2、Linux系统的组成部分
- Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。
- 内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统
- 一.Linux内核
内核是操作系统的核心,具有很多最基本功能,如虚拟内存、多任务、共享库、需求加载、可执行程序和TCP/IP网络功能。Linux内核的模块分为以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信、系统的初始化和系统调用等 - 二.Linux shell
shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行,是一个命令解释器。另外,shell编程语言具有普通编程语言的很多特点,用这种编程语言编写的shell程序与其他应用程序具有同样的效果。 - 三.Linux文件系统
文件系统是文件存放在磁盘等存储设备上的组织方法。Linux系统能支持多种目前流行的文件系统,如EXT2、EXT3、EXT3、FAT、FAT32、VFAT和ISO9660。 - 四.Linux应用程序
标准的Linux系统一般都有一套都有称为应用程序的程序集,它包括文本编辑器、编程语言、XWindow、办公套件、Internet工具和数据库等。
3、用户空间与内核通信方式有哪些?
- 1)系统调用。用户空间进程通过系统调用进入内核空间,访问指定的内核空间数据;
- 2)驱动程序。用户空间进程可以使用封装后的系统调用接口访问驱动设备节点,以和运行在内核空间的驱动程序通信;
- 3)共享内存mmap。在代码中调用接口,**实现内核空间与用户空间的地址映射,**在实时性要求很高的项目中为首选,省去拷贝数据的时间等资源,但缺点是不好控制;
- 4)copy_to_user()、copy_from_user(),是在驱动程序中调用接口,实现用户空间与内核空间的数据拷贝操作,应用于实时性要求不高的项目中。
4、系统调用与普通函数调用的区别
- 系统调用(fprint等等):
- 1.使用INT和IRET指令,内核和应用程序使用的是不同的堆栈,因此存在堆栈的切换,从用户态切换到内核态,从而可以使用特权指令操控设备
- 2.依赖于内核,不保证移植性
- 3.在用户空间和内核上下文环境间切换,开销较大
- 4.是操作系统的一个入口点
- 普通函数调用(c标准库prinf):
- 1.使用CALL和RET指令,调用时没有堆栈切换
- 2.平台移植性好
- 3.属于过程调用,调用开销较小
- 4.一个普通功能函数的调用
5、内核态,用户态的区别
- 内核态,操作系统在内核态运行——运行操作系统程序
- 用户态,应用程序只能在用户态运行——运行用户程序
- 当一个进程在执行用户自己的代码时处于用户运行态(用户态),此时特权级最低,为3级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态。Ring3状态不能访问Ring0的地址空间,包括代码和数据;当一个进程因为系统调用陷入内核代码中执行时处于内核运行态(内核态),此时特权级最高,为0级。执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈。
6、 bootloader、内核 、根文件的关系
- 启动顺序:bootloader->linux kernel->rootfile(app)
- Bootloader全名为启动引导程序,是第一段代码,它主要用来初始化处理器及外设,然后调用Linux内核。Linux内核在完成系统的初始化之后需要挂载某个文件系统作为根文件系统(RootFilesystem),然后加载必要的内核模块,启动应用程序。(一个嵌入式Linux系统从软件角度看可以分为四个部分:引导加载程序(Bootloader),Linux内核,文件系统,应用程序。)
7 、Bootloader启动的两个阶段:
- Stage1:汇编语言
- 1)基本的硬件初始化(关闭看门狗和中断,MMU(带操作系统),CACHE。配置系统工作时钟)
- 2)为加载stage2准备RAM空间
- 3)拷贝内核映像和文件系统映像到RAM中
- 4)设置堆栈指针sp
- 5)跳到stage2的入口点
- Stage2:c语言
- 1)初始化本阶段要使用到的硬件设备(led uart等)
- 2)检测系统的内存映射
- 3)加载内核映像和文件系统映像
- 4)设置内核的启动参数bootargs
- 嵌入式系统中广泛采用的非易失性存储器通常是Flash,而Bootloader就位于该存储器的最前端,所以系统上电或复位后执行的第一段程序便是Bootloader。
8、linux下检查内存状态的命令
- 查看进程:top
- 查看内存:free
- 假如一个公司服务器有很多用户,你使用top命令,可以看到哪个同事在使用什么命令,做什么事情,占用了多少CPU。
9、一个程序从开始运行到结束的完整过程(四个过程)
-
预处理(Pre-Processing):gcc -E hello.c -o hello.i
- 主要工作是删除程序中所有的注释、处理以# 开头的命令,如:头文件的展开、宏定义的替换。
-
编译(Compiling):gcc -S hello.i -o hello.s
- gcc在编译阶段会对预处理后的代码进行各种检查(词法分析、语法分析、语义分析),来判断我们代码是否符合规范,如果通过就会生成汇编代码(以.s结尾的文件)
- 注意:gcc -S 不是只能编译经过预处理后的.i文件,它的涵义是控制GCC 编译器仅对指定文件处理至编译阶段。
- 如果需要编译的文件是经过预处理后的 .i 文件,则 GCC 编译器只需编译此文件。
- 如果需要编译的文件是 .c 或者 .cpp 源文件,则 GCC 编译器会对其进行预处理和编译(两步)。
-
汇编(Assembling):gcc -c hello.s -o hello.o
- 把 .s 文件翻译成二进制.o文件(目标文件)
- 注意:gcc -c 不是只能编处理.s文件,它的涵义是控制GCC 编译器仅对指定文件处理至汇编阶段
- 如果指定文件为.c文件,则 gcc -c 指令会对 该文件执行预处理、编译、汇编。
- 如果指定文件为经过预处理后的.i文件,则 gcc -c 指令对该文件执行编译和汇编。
- 如果指定文件为经过编译后的文件,则 gcc -c 指令只对该文件执行汇编操作。
-
链接(Linking):gcc hello.o -o hello
- 汇编阶段将代码编译成了二进制文件,还需要和系统其他组件(比如标准库、动态链接库等)结合起来才能正常运行,比如调用print函数打印,在预处理阶段也只是将“stdio.h”头文件中的申明引入进来,没有函数的实现,那怎么调用它的呢?这就是链接的工作了,链接之前的操作都是对一个文件进行处理,而链接可以看作是对多个文件进行“打包”的过程,它将所有的目标文件以及系统组件组合成一个可执行文件。
- 其链接过程又涉及到动态库、静态库的链接
10、什么是堆,栈,内存泄漏和内存溢出?
- 栈由系统操作,程序员不可以操作。
- 内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序一般使用malloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用。
- 内存溢出:你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。strcpy函数
- 内存越界:向系统申请了一块内存,而在使用内存时,超出了申请的范围(常见的有使用特定大小数组时发生内存越界)
- 内存溢出问题是 C 语言或者 C++ 语言所固有的缺陷,它们既不检查数组边界,又不检查类型可靠性(type-safety)。众所周知,用 C/C++ 语言开发的程序由于目标代码非常接近机器内核,因而能够直接访问内存和寄存器,这种特性大大提升了 C/C++ 语言代码的性能。只要合理编码,C/C++ 应用程序在执行效率上必然优于其它高级语言。然而,C/C++ 语言导致内存溢出问题的可能性也要大许多。
11、死锁的原因、条件
- 产生死锁的原因主要是:
- (1) 因为系统资源不足。 - (2) 进程运行推进的顺序不合适。 - (3) 资源分配不当等。 如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁 - 四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
- (1) 互斥条件:一个资源每次只能被一个进程使用。
- (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
- (3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
- (4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
12、硬链接与软链接
- 链接操作实际上是给系统中已有的某个文件指定另外一个可用于访问它的名称。对于这个新的文件名,我们可以为之指定不同的访问权限,以控制对信息的共享和安全性的问题。如果链接指向目录,用户就可以利用该链接直接进入被链接的目录而不用打一大堆的路径名。而且,即使我们删除这个链接,也不会破坏原来的目录。
- 1>硬链接
- 硬链接只能引用同一文件系统中的文件。
- 它引用的是文件在文件系统中的物理索引(也称为inode)。
- 当您移动或删除原始文件时,硬链接不会被破坏,因为它所引用的是文件的物理数据而不是文件在文件结构中的位置。
- 硬链接的文件不需要用户有访问原始文件的权限,也不会显示原始文件的位置,这样有助于
文件的安全如果您删除的文件有相应的硬链接,那么这个文件依然会保留,直到所有对它的引用都被 删除。 - 2>软链接(符号链接)
- 软连接,其实就是新建立一个文件,这个文件就是专门用来指向别的文件的(那就和windows 下的快捷方式的那个文件有很接近的意味)。
- 软连接产生的是一个新的文件,但这个文件的作用就是专门指向某个文件的,删了这个软连接文件,那就等于不需要这个连接,和原来的存在的实体原文件没有任何关系,但删除原来的文件,则相应的软连接不可用。
13、计算机中,32bit与64bit有什么区别
- 64bit计算主要有两大优点:
- 64位操作系统下的虚拟内存空间大小:地址空间大小不是232,也不是264,而一般是2^48。因为并
不需要2^64那么大的寻址空间,过大的空间只会造成资源的浪费。所以64位Linux一般使用48位表示虚拟空间地址,40位标识物理地址。
14、中断和异常的区别
- 内中断:同步中断(异常)是由cpu内部的电信号产生的中断,其特点为当前执行的指令的指令结束后才转而产生中断,由于有cpu主动产生,其执行点必然是可控的
- 外中断:异步中断是cpu的外设产生的电信号引起的中断,其发生的时间点不可预期
15、中断怎么发生,中断处理流程
- 请求中断->响应中断->关闭中断->保留断点->中断源识别->保护现场->中断服务子程序->恢复现场->中断返回
16、Linux 操作系统挂起、休眠、关机相关命令
- 关机命令有halt, init 0, poweroff ,shutdown -h 时间,其中shutdown是最安全的
- 重启命令有reboot,init 6,,shutdow -r时间
- 在linux命令中reboot是重新启动,shutdown -r now是立即停止然后重新启动
17、说一个linux下编译优化选项:
加:-o
18、在有数据cache情况下,DMA数据链路为:
外设-DMA-DDR-cache-CPU:
19、linux命令
- 1、改变文件属性的命令:chmod (chmod 777 /etc/squid 运行命令后,squid文件夹(目录)的权限
就被修改为777(可读可写可执行)) - 2、查找文件中匹配字符串的命令:grep
- 3、查找当前目录:pwd
- 4、删除目录:rm -rf 目录名
- 5、删除文件:rm 文件名
- 6、创建目录(文件夹):mkdir
- 7、创建文件:touch
- 8、vi和vim 文件名也可以创建
- 9、解压:tar -xzvf 压缩包 打包:tar -cvzf 目录(文件夹)
- 10、查看进程对应的端口号
- 先查看进程pid ps -ef | grep 进程名
- 通过pid查看占用端口 netstat -nap | grep 进程pid
20、硬实时系统和软实时系统
- 软实时系统:
Windows、Linux系统通常为软实时,当然有补丁可以将内核做成硬实时的系统,不过商用没有这么做的。 - 硬实时系统:
- 对时间要求很高,限定时间内不管做没做完必须返回。
- VxWorks,uCOS,FreeRTOS,WinCE,RT-thread等实时系统;
21、MMU基础
- 现代操作系统普遍采用虚拟内存管理(Virtual Memory Management)机制,这需要MMU(
Memory Management Unit,内存管理单元)的支持。有些嵌入式处理器没有MMU,则不能运行依赖 于虚拟内存管理的操作系统。 - 也就是说:操作系统可以分成两类,用MMU的、不用MMU的。
- 用MMU的是:Windows、MacOS、Linux、Android;不用MMU的是:FreeRTOS、VxWorks、
UCOS…… - 与此相对应的:CPU也可以分成两类,带MMU的、不带MMU的。
- 带MMU的是:Cortex-A系列、ARM9、ARM11系列;
- 不带MMU的是:Cortex-M系列……(STM32是M系列,没有MMU,不能运行Linux,只能运行一些
UCOS、FreeRTOS等等)。 - MMU就是负责虚拟地址(virtual address)转化成物理地址(physical address),转换过程比较复
杂,
参考链接:https://blog.csdn.net/xiezhi123456/article/details/80250100 参考链接:https://blog.csdn.net/mengdg/article/details/50728498 参考链接:https://blog.csdn.net/start_mao/article/details/111085064
|