PCIE总线概述(一)
PCIE总线概述(一)开坑🕳待填
面试问题汇总-网络
面试问题汇总-网络从这里就要开始最后的准备了,把前人遇到的面试问题进行汇总,并用自己的语言总结一下,也从这里开始查漏补缺吧。
我大概看了一下所有公司的面试问题,每个人的简历不同,面试的岗位不同,面试官提到的问题不尽相同。不过主要还是围绕项目+技术点+人事来进行提问的。所以,我主要也是分为这三个方面进行总结,并且定时复习。
需要注意的是,毕竟是面试问题,所以动嘴说是必须的,但是hexo并没有实现在线录音的插件,这里只能对照问题使用手机录音,之后再分析自身的问题了。
技术点问题 网络
说说TCP协议怎样建立连接?*说说三次握手**四次挥手的原理?**TCP与UDP协议有什么的区别?**TCP保证传输可靠的原因TCP创建链接时c端和s端用什么样的函数TCP协议怎么实现!端口是干嘛的socket编程步骤简述一下?说一下应用层的网络协议?说一下TCP协议层?传输层的网络协议?使用网络套接字传输的过程TCP一般用在什么情况下组播的地址TCP和udp的区别 具体的实现机制就是具体的建立的过程TCP四次挥手,有一个状态是TIME_WAIT你 ...
分布式多媒体组播系统
分布式多媒体组播系统
一个简单的流媒体项目,基于客户端/服务器模型(C/S)开发,采用UDP组播技术,实现MP3格式音乐广播系统。服务器端采用多线程处理频道信息并使用线程池解决多线程并发带来的性能消耗问题,实现媒体库(MP3)读取并进行流量控制(令牌桶),并通过UDP组播发送;客户端采用多进程,实现父进程接受来自网络的数据,通过进程间通信技术管道发送给子进程,子进程进行数据解码并输出到特定频道。
server端该系统的server端主要分为三个模块,解析本地目录和读取音乐文件的媒体库模块,一个就是向多播组里面发送每一个频道信息的线程池模块,还有一个就是负责主要调度的main线程模块。
媒体库模块媒体库模块负责向上层提供数据和频道列表,主要就是解析目录和读取本地的媒体文件。其中主要有两个接口,读取频道的列表和读取频道数据,使用IO进行读取。读取相应的数据加入到多播组来进行后续操作。
线程池模块线程池模块主要解决的是多线程的并发问题,我们需要向多播组里面发送频道数据,而每一个频道使用一个线程。每一个线程我们使用完后就需要销毁,再次使用又需要重新创建新的线程,我们就需要使用线程池来对线程进行 ...
IIC总线接口
IIC总线接口IIC是两线式串行同步总线,通信时使用两根线:SDA(数据线) SCL(时钟线),空闲状态的时候,这两根线上都保持高电平,将来要开始传输数据了。
首先要发送一个起始信号,这个起始信号是主设备给从设备发的,什么叫起始信号的?就是时钟线处于高电平期间,数据线由高到低产生一个下降沿,这就是起始信号。
产生完起始信号以后,主设备要先往数据线上发一个七位的设备地址。发七位的设备地址就是告诉我这个总线上的所有设备,我现在要和哪一个从设备进行通信了。
再有,发完这个设备地址我要加一个读位或者写位,读的话是高电低的,写的话是低电平,告诉具体的设备,要从里边读数据,还是往这里边写数据。
发送设备地址是采用的是高位先出,先发送设备地址的高位。发送完设备地址以后,等待着从设备给数据线上发一个ack信号,也就是从设备已经收到指令了,已经知道要通信了,从设备要回主设备一个ack,如果主设备收到了ack以后,主设备就可以从里边读数据或者往里边写数据了。每次读数据也好,写数据也好,都要读或写一个字节的数据。然后同样每次读完以后,主设备如果是读,主设备要给从设备回一个ack,如果是往里写的话,写进去以 ...
Linux内核中的内存管理
Linux内核中的内存管理基本概念Linux内核管理内存时以物理页(4k)为单位内核会为每一个物理内存页建立一个数据结构
1234struct page{ //内存被引用的次数,为0表示空闲页 atomic_t _count; //引用计数};
Linux内核在管理内存时,并不一视同仁
高端内存:物理内存超过896M(大小可调)的空间
动态映射的策略,使用时进行映射,使用完毕之后ima接触映射
低端内存:介于0~896M的内存,映射关系是固定的,虚拟地址 = 0xc0000000 + 物理偏移
内核中动态申请内存的方法按页申请方式一
alloc_pages(gfd_mask, order)
order,要申请2^order
void *page_address(const struct page *page)
将page指定的物理内存进行映射,返回映射后的虚拟地址
方式二
unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)
要申请2^order个物理内存页
方式三
__ ...
听说全会能拿12k
听说全会能拿12k从这篇文章开始,准备换一种方式来做面试题,之前做的题相当于只是搜集答案,在整理的过程中没有结合自己做题的过程。接下来笔试题整理的过程中,打算加上对题中知识点的整理,也能顺带着复习基础的知识。
基础题无符号二进制数100110.101转换成十进制数为:A、38.625 B、38.315 C、48.625 D、48.815
答案
这道题有两个考点:无符号二进制转十进制二进制小数转十进制无符号就意味着给出的二进制数最高位不代表符号位,直接把二进制数整数部分使用8421法进行计算转换为十进制数38之后处理二进制的小数部分,其实小数部分也不难,就是从低位到高位也是2的负次方。所以0.101可以表示为1*2-1 + 0*2-2 + 1*2-3 = 0.625最后把整数和小数部分相加得38.625答案:A、38.625扩展:C语言实现进制转换十进制转换为任意进制算是比较好实现的,只需要用十进制数除以任意进制数,余数取反就是对应进制的结果了,我们只要在代码中创建一个数组用来存储最后结果12345 ...
U-Boot源代码阅读
U-Boot源代码阅读初始化异常向量表
1234567891011 .globl _stext_stext: b reset /*异常向量表 8种异常*/ ldr pc, _undefined_instruction /*未定义指令异常*/ ldr pc, _software_interrupt /*软中断异常*/ ldr pc, _prefetch_abort /*内存操作异常*/ ldr pc, _data_abort /*数据异常*/ ldr pc, _not_used /*未使用*/ ldr pc, _irq /*普通中断异常*/ ldr pc, _fiq /*快速中断异常*/
链接脚本中异常向量的入口地址
1234567891011/*后面的符号正好是对应的中断异常服务程序的入口地址*//*每种异常入口处都填写一条跳转指令,直接跳转到相应的异常处理函数中*/_undefined_instruction: .word undefined_instruction_software_interrupt: .word software_inter ...
ARM伪指令
ARM伪指令伪指令本身不能被CPU所识别,但是能被汇编器编译成一条或多条CPU所识别的指令。
ldr伪指令ldr r0, [r1] @汇编指令
要判断是否是伪指令,只需要看指令中是否存在[],有[]的是加载指令,没有的则是伪指令
ldr r0, #0x1ff是不合法的指令
其中地址是不合法的,存在一个8bit的立即数能够循环右移偶数位得到,这个立即数就是合法的
要想执行这条本来不合法的指令,我们就可以通过伪指令实现。
1234567891011.code 32.global _start.text _start: ldr r0, #0x1ff ldr r1, =text @将立即数本身放到r1寄存器 ldr r2, text @将立即数指向的内存中的数据加载到r2寄存器中 text: .word 0x12345678.end
NOP伪指令mov r0, r0
为了优化流水线而设计的,相当于空操作
ARM伪操作完成一些辅助功能的操作,在对汇编源程序进行汇编时由汇编程序处理,而不是在程序运行期间由机器执行。
汇编文件中的以.开头的都是位操作
12345678910111213141 ...
ARM汇编-栈操作指令
ARM汇编-栈操作指令ARM中栈种类在ARM中有4种栈,分别是:减栈、增栈、满栈、空栈
减栈:向内存地址减小的方向发生变化
增栈:向内存地址增加的方向发生变化
满栈:栈指针(sp)指向的栈顶有有效数据
空栈:栈指针(sp)指向的栈顶没有有效数据
在学习ARM的三级流水线时,执行取指、解码、执行三步操作时对PC进行偏移,每一步都偏移PC-4。
上述偏移之所以是PC-4,原因就是在ARM种默认的栈种类就是减栈。
上述4种栈也可以进行组合,再次区分为: 满减栈、满增栈、空减栈、空增栈。ARM中默认使用的栈的形式是满减栈。
栈指令LDMXX sp!, {r1, r2, r3, r5, r8}
将sp指向的栈空间中的数据加载到 r1, r2, r3, r5, r8 寄存器中
STMXX sp!, {r1, r2, r3, r5, r8}
将 r1, r2, r3, r5, r8 寄存器中的值存放到sp指向的栈空间中
12345其中xx: fd 满减 ldmfd sp!, {r1, r2, r3, r5, r8} fa ...
方位通讯笔试题
方位通讯笔试题请写出下列代码的输出内容?12345678910111213141516171819int sum(int a){ static int b = 3; auto int c = 0; c += b++; a += ++b; return (a + b + c);}void main(){ int i; int a = 2; for (i=0; i<5; i++) { printf("%d,", sum(a)); }}
答案
15,21,27,33,39,
下面的代码输出是什么,为什么?12345678void foo(void){ char a = 127; int sum = 200; a += 1; sum += a; printf("su ...