软链接与硬链接的区别。
相同点
链接解决的痛点都是要解决数据访问时候的路径重定向的问题。
不同点
软连接顾名思义,他只是一个链接,目标就是指向源文件,能够访问源文件。软连接可以跨文件系统。而硬链接不行。
硬链接的链接直接链接的是inode链接的更加底层,只要存在硬链接,即使原来文件删除了也能访问,即保存内部的文件,类似百度网盘一样,复制粘贴是假的,相同的编码的文件是只会存储一份。所有人的都删除了才算是删除,硬链接有保存原文件的功能,不怕误删除,也不怕原文件移动位置。
目录不能硬链接,但是可以软链接
2.对DMA操作的认识,DMA数据存取的协议而存在,免于使用不同的CPU还要进行配置,有专用的硬件底层的逻辑电路支持。
直接内存读取,是cpu访问内存的一种方式,允许不同速率的硬件装置进行沟通,并且不用依赖cpu,传输动作由DMA控制器完成
1.DMA请求
2.DMA响应
3.DMA传输
4.DMA结束
CPU读取外部数据,相对于DMA的劣势,DMA专用性很强,省去大boss的精力,让大boss省出时间去干更有意义的事情去。
地址计算: 地址计算通常占用的时间非常短,因为它主要涉及简单的算术运算。通常,这个步骤所占用的时间可以忽略不计。
内存地址传递: 传递地址到内存控制器通常也非常快,因为这是通过地址总线完成的。这个步骤通常也可以忽略不计。
内存读取请求: 内存读取请求的时间取决于内存控制器的性能和负载,以及请求的地址是否在内存中缓存。在通常情况下,内存读取请求的时间通常比较短。
内存控制器操作: 内存控制器的操作时间取决于具体硬件设计和访问模式。如果内存控制器的性能较好且数据易于访问,这一步骤的时间可能相对短。
数据传输到寄存器: 数据传输到CPU内部寄存器或缓存通常非常快,因为这些存储器位于CPU内部,可以高效地访问数据。
处理数据: 数据处理时间会根据CPU的性能和所执行的操作而有所不同。这个时间比例取决于对图像的具体处理需求。
等待时间: 在整个过程中,可能会有一些等待时间,这可能是由于内存访问延迟、数据传输速度慢或其他系统负载因素引起的。等待时间可能会显著影响整体时间比例。
3.字符设备所需要的接口
1.open/close //打开关闭
2.read/write //读写
3.ioctl //配置寄存器操作
4.mmap //地址映射,乾坤大挪移
mmap: mmap
系统调用允许应用程序将字符设备文件映射到其地址空间中,从而使应用程序能够直接访问设备内存或缓冲区,而无需通过传统的 read
和 write
操作。这种内存映射技术对于需要高性能数据传输的应用程序非常有用。
一半情况字符设备是指使用某些接口的设备,比如键盘、鼠标、蓝牙、tty等等,要求实时传输少量信息的。
MMU(内存管理单元)的工作原理是将虚拟地址映射到物理地址,以便访问主存储器中的数据。下面是MMU的工作原理的简要概述:
-
虚拟地址和物理地址分离: 操作系统和应用程序使用虚拟地址来寻址内存,而物理地址则用于实际的内存访问。MMU的任务是将虚拟地址映射到物理地址。
-
页表: 为了实现地址映射,操作系统维护了一个数据结构,通常称为页表。页表将虚拟页号映射到相应的物理页框号。页表的基地址通常存储在特殊的CPU寄存器(在ARM体系结构中是CP15的C2寄存器)中。
-
分页: 操作系统将虚拟地址空间分为固定大小的页面(通常是4KB)。当应用程序引用虚拟地址时,MMU会将虚拟地址分为页号和页内偏移。
-
TLB(快表): 为了提高地址映射的性能,MMU使用TLB,它是一个高速缓存,用于存储最近使用的页表项。TLB存储了一些最常用的页表项,以便在下一次引用相同页时可以快速找到对应的物理页框。
-
地址转换: 当应用程序引用虚拟地址时,MMU首先查找TLB,如果在TLB中找到了对应的页表项,MMU会将虚拟页号转换为物理页框号,并将页内偏移添加到物理页框号上,得到物理地址。如果在TLB中找不到对应的页表项,MMU将访问页表,找到相应的页表项并将其加载到TLB中,然后进行地址转换。
-
缺页中断: 如果在虚拟地址中找不到对应的页表项,MMU会引发缺页中断。操作系统会处理此中断,将所需的数据从外部存储器(如硬盘)加载到内存,并更新页表,然后重新启动引发中断的指令。
-
更新TLB: MMU会定期更新TLB,以确保它包含最新的页表项。在TLB中的页表项通常是根据最近的使用情况进行替换的。
总之,MMU的工作原理涉及将虚拟地址映射到物理地址,使用页表和TLB来实现这一映射过程。这有助于操作系统和应用程序以虚拟地址的方式管理内存,同时允许硬件访问实际的物理内存
Linux内核分为四个子系统
进程管理
进程管理是Linux操作系统的核心功能之一,它涉及创建、调度、终止和管理进程。Linux内核负责为每个进程分配资源,如CPU时间、内存和文件描述,以便他们能够并发运行。进程间管理还包括进程状态转换、进程调度和进程优先级等概念。
进程间通信
进程间通信是Linux系统中不同进程之间交换数据和信息的方法和机制。常见的IPC机制包括管道、消息队列、信号、共享内存和套接字等。这些机制允许进程在同一系统上或不同系统上进行通信和协作。
内存管理
内存管理涉及分配、回收和保护系统内存。Linux内核负责将物理内存分配给进程,管理虚拟内存,进行页面交换,以及维护内存权限和保护机制。内存管理还包括虚拟内存、页表和内存分页等概念。
文件系统
文件系统是Linux中用于管理文件和目录的核心子系统。Linux支持多种文件系统类型,如ext4、NTFS、FAT32等。虚拟文件系统(VFS,Virtual File System)是Linux文件系统的抽象层,它使不同类型的文件系统可以与应用程序和内核交互,而无需修改应用程序代码。
网络接口
Linux操作系统提供了网络接口,以便计算机能够通过网络连接到其他计算机和服务。这包括网络协议栈、套接字编程接口、网络驱动程序和配置网络接口的工具。Linux支持各种网络协议,如TCP/IP、UDP、HTTP等,以实现网络通信。
虚拟文件系统通常不是Linux操作系统的主要子系统之一,但它是文件系统的抽象层,用于统一处理不同类型的文件系统。它允许应用程序使用相同的系统调用来访问不同的文件系统,而无需关心底层文件系统的差异。
2.在windows环境下共享Linux中的用户目录的一个工具是?
Samba服务器
Linux内核的多线程同步机制有哪些?
Linux内核提供了多种多线程同步机制,这些机制用于确保多个线程能够在共享资源上安全地协同工作。以下是一些常见的Linux内核多线程同步机制:
-
互斥锁(Mutex): 互斥锁用于保护临界区,确保只有一个线程可以访问临界区的代码。它是最常见的同步机制之一。
-
读写锁(Reader-Writer Lock): 读写锁允许多个线程同时读取共享数据,但只允许一个线程写入共享数据。这对于读取频繁、写入较少的场景非常有用,以提高性能。
-
条件变量(Condition Variable): 条件变量允许线程等待某个条件的发生,然后在条件满足时唤醒线程。通常与互斥锁一起使用,以在共享资源上进行条件等待。
-
信号量(Semaphore): 信号量是一个计数器,用于控制多个线程对共享资源的访问。它可以用于限制同时访问资源的线程数。
-
自旋锁(Spin Lock): 自旋锁是一种轮询锁,它会一直尝试获取锁,而不会将线程置于休眠状态。自旋锁在内核中使用频率较低,通常用于一些特定的场景。
-
屏障(Barrier): 屏障用于等待一组线程达到某个点,然后同时继续执行。它对于分阶段任务的协同工作非常有用。
-
原子操作: 原子操作是一种特殊的操作,它在不被中断的情况下执行,以确保线程之间的原子性。原子操作通常涉及对共享数据的增减、赋值等操作。
这些同步机制在Linux内核中被广泛使用,以确保多线程程序的正确性和性能。开发者可以根据具体的应用场景和需求选择合适的同步机制。不同的同步机制在性能、复杂性和适用场景上都有不同的权衡,因此需要谨慎选择。
原子操作
原子操作通常是在硬件或操作系统级别实现的,以确保操作的不可分割性。这意味着即使在多线程或多进程环境中,原子操作在执行时不会被中断,其他线程无法同时修改相同的数据。原子操作通常包括对内存位置的读取、写入、增加、减少等基本操作。
5.Linux指令实现当前目录下查找文件以lib开头的文件。
bash
find ./ lib*
7.写出Linux指令实现在当前目录中递归查找包含字符串"string"的文件,但不搜索".svn"目录
bash
grep --exclude-dir .svn -r "string" ./*
编写strcpy函数
bash
char * strcpy( char * dst , char * src ){
assert( dst != NULL && src != NULL );
char * tmp = dst;
while( (*dst++ = *src++) != '\0');
return tmp;
}
1. 阅读以下linux内核从系统调用返回到用户态的arm汇编代码。简要描述这种情况下,linux从内核态返回到用户态所做的工作。
实现list_entry宏代码
cpp
#define list_entry(ptr,type,member) ( (type*) ( ptr - &( ((type *)0)->member ) ) )
3. 简述Linux MMU的工作原理,或者简述Linux内核虚拟地址转换成物理地址的过程(可以按照32位体系结构来描述)
MMU解决痛点(主内存页表访问执行地址转换)
MMU的设计支持虚拟内存系统,它允许虚拟地址空间比物理内存更大,并管理虚拟地址到物理地址的映射,以实现内存的高效使用和虚拟内存的功能。
解决痛点同时有一种更优化的方法
直接每次都访问主内存中的页表以进行地址转换会花费时间。这是因为主内存的访问通常比 CPU 寄存器和高速缓存的访问速度慢得多。因此,频繁地访问主内存以执行地址转换会增加内存访问的延迟,从而影响程序的性能。
虚拟内存系统的目标之一是通过减少直接访问主内存的次数来提高性能。TLB(Translation Lookaside Buffer)就是设计用来缓存虚拟地址到物理地址的映射,以减少对主内存的访问。TLB 是一个小型、高速的硬件缓存,通常位于 CPU 中,可以存储最近访问的虚拟地址到物理地址的映射。当程序访问内存时,CPU 首先查找 TLB 来查找映射,如果映射存在于 TLB 中,CPU 可以直接执行地址转换,而不必访问主内存中的页表。
通过使用 TLB,可以大幅减少需要访问主内存的次数,从而提高内存访问的速度和程序的性能。TLB 的命中率(即在 TLB 中找到映射的概率)对性能有重要影响,因此优化 TLB 的设计和使用对于提高计算机系统性能非常关键。
TLB(Translation Lookaside Buffer)的主要目的是加速虚拟内存地址转换,从而提高内存寻址的速度。虚拟内存是一种计算机内存管理技术,它允许程序访问一个比物理内存更大的虚拟地址空间。
当程序访问内存中的数据时,它使用虚拟地址,而这些虚拟地址需要映射到物理内存中的实际地址。这个地址转换是由操作系统的内存管理单元执行的,通常需要访问页表来查找虚拟地址到物理地址的映射。
TLB 存储了部分虚拟地址到物理地址的映射,通常是最近访问的页表项。因此,TLB 允许 CPU 在执行指令时快速查找虚拟地址到物理地址的映射,而不必每次都访问主内存中的页表。这显著提高了内存寻址的速度,因为 TLB 具有非常低的访问延迟。
TLB 的目的是减少对主内存中页表的频繁访问,从而提高计算机程序的性能,特别是在虚拟内存系统中。通过加速地址转换,TLB 有助于减少了内存访问的延迟,这对于现代计算机系统的性能至关重要
MMU :主要作用是将虚拟地址转化为物理地址,当然还有在硬件上内存访问权限控制的功能。
页和页框:Linux的4g虚拟地址按照4k~16k分页处理,一般是4k,每一份称为页。页映射到同样大小的物理地址,称为页框。
页表项和页表: 页与页框的映射关系,称为页表项(PTE),而页表项的集合,称为页表。
快表TLB: 分页可能会生成很多页表项,并且页表是存在物理地址空间中的,当mmu收到一个虚拟地址时,如果直接在页表中查找,频繁对片外存储器读写很浪费时间资源(物理地址空间属于片外),所以出现了快表TLB,这是mmu专用的片上cache,将使用到的或者经常用的页表项存到TLB中,加快速度。
所以整个流程就是CPU运行到一个虚拟地址时,将该虚拟地址发送到MMU,MMU将其分为页和页内offset;首先在TLB中匹配页,如果找到对应页框,则补上偏移直接访问该物理地址,否则访问物理内存中的页表,找到对应的物理地址进行访问,同时保存到TLB中。
如果页表中发现该虚拟页没有对应的页框?这时候会发生一个缺页中断,交给OS处理,如果还有可以被映射的页框就直接分配,如果物理页框已经分配完了,那就会将某块较少使用的页框写回外部存储器,再重新把这个虚拟页映射到该页框中。
页面置换
页面置换(Page Replacement):当内存不足时,操作系统会选择一个或多个内存页面(页框)进行页面置换,将其写入磁盘上的Swap空间,并将新的数据加载到空闲的页框中。这个过程由内存管理部分执行,而MMU仍然负责虚拟地址到物理地址的映射,但这些映射可能会在内存页面置换过程中发生变化。
交换(Swapping):当内存不足时,操作系统可以将整个进程或进程的一部分从物理内存中移至磁盘上的Swap空间,以便为其他进程腾出足够的物理内存。这个操作由内存管理部分执行,MMU会根据新的物理内存映射重新加载数据。