1、Linux内核的组成部分
Linux内核主要由五个子系统组成:进程调度、内存管理、虚拟文件系统、网络接口、进程间通信;
2、Linux系统的组成部分
主要是4个部分: 内核、shell、文件系统和应用程序。
3、用户空间与内核通信方式有哪些?
(1)系统调用,用户空间进程通过系统调用进入内核空间,访问指定的内核空间数据; (2)驱动程序,用户空间进程可以使用封装后的系统调用接口访问驱动设备节点,以和运行在内核空间的驱动程序通信; (3)内存共享mmp,在代码中调用接口,实现内核空间与用户空间的地址映射,在实时性要求很高的项目中为首选,省去拷贝数据的时间等资源,但缺点是不好控制; (4)copy_to_user()、copy_from_user(),是在驱动程序中调用接口,实现用户空间与内核空间的数据拷贝操作,应用于实时性要求不高的项目中。
4、系统调用与普通函数调用的区别?
系统调用
- 使用INT和IRET指令,内核和应用程序使用的是不同的堆栈,因此存在堆栈的切换,从用户态切换到内核态,从而可以使用特权指令操控设备
- 依赖于内核,不保证移植性
- 在用户空间和内核上下文环境间切换,开销较大
- 是操作系统的一个入口点
普通函数调用
- 使用CALL和RET指令,调用时没有堆栈切换
- 平台移植性好
- 属于过程调用,调用开销较小
- 一个普通功能函数的调用
5、内核态,用户态的区别
内核态,操作系统在内核态运行——运行操作系统程序; 用户态,应用程序只能在用户态运行——运行用户程序;
6、 bootloader、内核 、根文件的关系
启动顺序:bootloader——>linux kernel——>rootfiler——>app bootloader,全名为启动引导程序,是第一段代码,主要用来初始化处理器及外设。然后调用linux内核,linux内核在完成系统的初始化之后需要挂载在文件系统作为根文件系统,然后加载必要的内核模块,启动应用程序。 (一个嵌入式Linux系统从软件角度看可以分为四个部分:引导加载程序(Bootloader),Linux内核,文件系统,应用程序。)
7 、Bootloader启动的两个阶段:
-
Stage1:汇编语言 (1)基本的硬件初始化(关闭看门狗、MMU(代操作系统)、CACHE、配置系统工作时钟); (2)为加载stage2准备RAM空间; (3)拷贝内核映像和文件系统映像到RAM中; (4)设置堆栈指针sp; (5)跳到stage2的入口点 -
Stage2:c语言 (1)初始化本阶段 要使用的硬件设备; (2)检测系统的内存映射; (3)加载内核映像和文件系统映像; (4)设置内核的启动参数。 嵌入式系统中广泛采用的非易失性存储器通常是Flash,而Bootloader就位于该存储器的最前端,所以系统上电或复位后执行的第一段程序便是Bootloader。
8、linux下检查内存状态的命令
(1)查看进程:top; (2)查看内存:free; (3)cat/ proc /meminfo; (4)vmstat
假如一个公司服务器有很多用户,你使用top命令,可以看到哪个同事在使用什么命令,做什么事情,占用了多少CPU。
9 、一个程序从开始运行到结束的完整过程(四个过程)
预处理(Pre-Processing)、编译(Compiling)、汇编(Assembling)、链接(Linking)
10、什么是堆,栈,内存泄漏和内存溢出?
栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS(操作系统)回收,分配方式倒是类似于链表。
所以内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序一般使用malloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用。
内存溢出:你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。
内存越界:向系统申请了一块内存,而在使用内存时,超出了申请的范围(常见的有使用特定大小数组时发生内存越界)
内存溢出问题是 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有什么区别
参考百度
1、表示
32bit:X 86
64bit:X 64
2、处理数据的能力
32位计算机的CPU一次最多能处理32位数据,例如它的EAX寄存器就是32位的,32位计算机通常也可以处理16位和8位数据。64位计算机一次处理数据要比32位大得多,一次运行64位的数据。
3、支持的内存不同(寻址能力不同)
32位的系统许多支持4G的内存,而64位则可以支持上百G的内存。
4、架构不同
从32位到64位架构的改变是一个根本的改变,因为大多数操作系统必须进行全面性修改,以取得新架构的优点。其它软件也必须进行移植,以使用新的性能;较旧的软件一般可借由硬件兼容模式(新的处理器支持较旧的32位版本指令集)或软件模拟进行支持。
或者直接在64位处理器里面实作32位处理器内核(如同 Intel 的 Itanium 处理器,其内含有x86处理器内核,用来执行32位x86应用程序)。支持64位架构的操作系统,一般同时支持32位和64位的应用程序。
5、对配置的要求不同
64位操作系统只能安装在64位电脑上(CPU必须是64位的)。同时需要安装64位常用软件以发挥64位(x64)的最佳性能。32位操作系统则可以安装在32位(32位CPU)或64位(64位CPU)电脑上。
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 目录(文件夹)
|