操作系统杂项笔记

本文详细探讨了ARM处理器的工作模式、中断处理、Linux内核中的系统调用过程以及同步机制。讲解了RS232和RS485通讯接口的区别,中断为何不能嵌套,并分析了Linux中RCU原理。此外,还讨论了ARM处理器的寄存器、MMU映射、中断处理流程以及在Linux启动和系统调用中的角色。内容涵盖了数据通信、中断处理、内存管理和操作系统核心概念。
摘要由CSDN通过智能技术生成

目录

RS232和RS485通讯接口有什么区别

用串口发送十个字节,丢失一个两个你会怎么检查

中断能不能睡眠?

中断为什么不能嵌套?

linux中系统调用过程?

Linux中的同步机制

ARM处理器的寄存器

复位后,ARM处理器处于 SVC 模式,ARM 状态

在ARM Linux系统中,中断处理程序进入C代码以后,ARM处于 超级用户(SVC) 工作模式

在ARM系统结构中,MMU映射最小的单元空间是 1KB ,映射最大的单元空间是 1MB

协处理器主要控制:片内的MMU、指令和数据缓存(IDC)、写缓冲(Write Buffer)

当一个异常出现以后,ARM微处理器会执行哪几步操作?

段错误处理

Linux中RCU原理

为什么uboot要关掉cache?

FIQ的什么特点使得它处理的速度比IRQ快?

32位bit位反转

container_of宏

ARM系统中,在函数调用的时候,参数是通过哪种方式传递的?

ARM有几种工作模式?

如何判断计算机处理器是大端还是小端?

为什么要区分内核态和用户态?

进程有几种状态?

进程间通信方式有哪些?

线程间同步方法?

死锁的四个必要条件是什么

内存管理有哪几种方式

Readn

Writen

fcntl

strace工具的实现原理

fork后子进程保留了父进程的什么?

etc配置文件

Linux启动过程

/etc/skel

new/delete和malloc/free的区别

数值溢出的判断方法(必会)

RCU机制

锁与进程间通信

内核锁机制

进程间通信


RS232和RS485通讯接口有什么区别

  1. 传输方式不同。RS232采取不平衡传输方式,即所谓单端通讯。而RS485则采用平衡传输,即差分传输方式

  2. 传输距离不同。RS232适合本地设备之间的通信,传输距离一般不超过20m。而RS485的传输距离为几十米到上千米

  3. RS232 只允许一对一通信,而RS485接口在总线上是允许连接多达128个收发器。RS232/RS485,是两种不同的电气协议,也就是说,是对电气特性以及物理特性的规定,作用于数据的传输通路上,它并不内含对数据的处理方式。比如,最显著的特征是: RS232使用3 - 15v有效电平,而UART,因为对电气特性并没有规定,所以直接使用CPU使用的电平,就是所谓的TTL电平(可能在0~3.3V之间)。更具体的,电气的特性也决定了线路的连接方式,比如RS232, 规定用电平表示数据,因此线路就是单线路的用两根线才能达到全双工的目的;而RS485,使用差分电平表示数据,因此,必须用两根线才能达到传输数据的基本要求,要实现全双工,必需用4根线。但是,无论使用RS232还是RS485,它们与UART是相对独立的,但是由于电气特性的差别,必须要有专用的器件和UART接驳,才能完成数据在线路和UART之间的正常流动。

用串口发送十个字节,丢失一个两个你会怎么检查

  1. 发送方自己发自己收,看有无问题

  2. 接收方自己发自己收,看有无问题

  3. 都没问题就是在发送过程中出现问题,发送和接收的参数是否一致,比如波特率和奇偶校验位、打印发送buffer的数据和接收buffer的数据

  4. 检查丢失的字节有什么规律

  5. 逻辑分析仪查看发送和接收的时序,导出发送的数据和接收的数据

中断能不能睡眠?

  1. 中断处理的时候,不应该发生进程切换,因为在中断上下文中,唯一能打断当前中断handler的只有更高优先级的中断,它不会被进程打断,如果在中断上下文中休眠,则没有办法唤醒它,因为所有的wake_up_xxx都是针对某个进程而言的,而在中断上下文中,没有进程的概念,没有一个task_struct,因此真的休眠了。

  2. schedule()在切换进程时, 保存当前的进程上下文(CPU寄存器的值、进程的状态以及堆栈中的内容),以便以后恢复此进程运行。中断发生后,内核会先保存当前被中断的进程上下文(在调用中断处理程序后恢复) ;

  3. 2.4内核中schedule()函数本身在进来的时候判断是否处于中断上下文

中断为什么不能嵌套?

官方资料:中断处理不能嵌套

中断处理函数需要调用C函数,这就需要用到栈。中断A正在处理的过程中,假设又发生了中断B,那么在栈里要保存A的现场,然后处理B。在处理B的过程中又发生了中断C,那么在栈里要保存B的现场,然后处理C。如果中断嵌套突然暴发,那么栈将越来越大,栈终将耗尽。所以,为了防止这种情况发生,也是为了简单化中断的处理,在Linux系统上中断无法嵌套:即当前中断A没处理完之前,不会响应另一个中断B(即使它的优先级更高)。

linux中系统调用过程?

  1. 当open函数打开设备文件时,可以根据设备文件对应的struct inode结构体描述的信息,可以知道接下来要操作的设备类型(字符设备还是块设备),还会分配一个struct file结构体。

  2. 根据struct inode结构体里面记录的设备号,可以找到对应的驱动程序。这里以字符设备为例。在Linux操作系统中每个字符设备都有一个struct cdev结构体。此结构体描述了字符设备所有信息,其中最重要的一项就是字符设备的操作函数接口。

  3. 找到struct cdev结构体后,Linux内核就会将struct cdev结构体所在的内存空间首地址记录在struct inode结构体i_cdev成员中,将struct cdev结构体中的记录的函数操作接口地址记录在struct file结构体的f_ops成员中。

  4. 任务完成,VFS层会给应用返回一个文件描述符(fd)。这个fd是和struct file结构体对应的。接下来上层应用程序就可以通过fd找到struct file,然后在由struct file找到操作字符设备的函数接口了。

Linux中的同步机制

原子操作、信号量、读写信号量、自旋锁、顺序锁

ARM处理器的寄存器

ARM处理器共有37个寄存器。它包含31个通用寄存器和6个状态寄存器。

 

复位后,ARM处理器处于 SVC 模式,ARM 状态

在ARM Linux系统中,中断处理程序进入C代码以后,ARM处于 超级用户(SVC) 工作模式

在ARM系统结构中,MMU映射最小的单元空间是 1KB ,映射最大的单元空间是 1MB

协处理器主要控制:片内的MMU指令和数据缓存(IDC)写缓冲(Write Buffer)

当一个异常出现以后,ARM微处理器会执行哪几步操作?

  1. 将下一条指令的地址存入相应的连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。若异常是从ARM状态进入,则LR寄存器中保存的是下一条指令的地址;若异常是从Thumb状态进入,则在LR寄存器中保存当前PC的偏移量,这样,异常处理程序就不需要确定异常是从何种状态进入的。

  2. 将CPSR复制到相应的SPSR中。

  3. 根据异常类型,强制设置CPSR的运行模式位。

  4. 强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。

段错误处理

在开发板上 ulimit -c unlimited 生成core文件

在pc上 /bin/arm-linux-gdb ./test_debug ./core backtrace

Linux中RCU原理

答: rcu是2 .6出现的一种读写锁,可以说是老的读写锁的升级版,要用在链表这种数据结构上,经典使用场景是多读者少写者的情况,rcu允许多个读者一个写者共同操作数据而不必加锁,这是经典用法,若出现多个写者时,写者与写者之间就得自己手动同步。当要删除一个节点时,删除后并不会马上释放节点,而是会等待在删除动作之前已经开始读该节点的读者都完成读操作之后才会释放此节点,这段时间被称为宽限期。

为什么uboot要关掉cache?

Caches是CPU内部的一个2级缓存,它的作用是将常用的数据和指令放在CPU内部。Caches是通过CP15管理的,刚上电的时候,CPU还不能管理Caches。上电的时候指令Cache可关闭,也可不关闭,但数据Cache一定要关闭,否则可能导致刚开始的代码里面,去取数据的时候,从Cache里面取,而这时候RAM中数据还没有Cache过来,导致数据预取异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值