- 博客(147)
- 收藏
- 关注
原创 linux 开启ssh服务
sudo apt-get updatesudo apt-get install openssh-server #安装sshps -e | grep ssh #查看开启/etc/init.d/ssh start #修改配置sudo /etc/init.d/ssh resart方法2:终端输入以下命令:lsof -i:22...
2019-07-05 17:26:16
703
原创 嵌入式ARM Linux系统
1、32位Linux系统,内核使用高端内存的vmalloc区来映射IO地址空间。具体地址可以自己定义。例如:三星4412提供的源码使用0xF6000000 至0xF6000000+96MB的内存空间映射IO端口的寄存器。2、有两种方式来进行映射:动态映射:ioremap() 静态映射:map_desc结构体数组中定义映射,系统初始化期间,根据结构体的映射方式建立页表。3、内...
2019-07-03 08:50:15
316
原创 Linux操作系统--进程地址空间
进程的地址空间:进程的地址空间由进程可以使用的全部线性区集合组成,每个进程的线性区集合是不同的,也是不相关的。进程获得线性区的情况:创建一个新的进程,fork+execve 正在运行的进程,装入一个不同的程序,pid不变,但是线性地址空间重新分配。execve()。 mmap文件映射,创建一个线性区来映射这个文件 用户态堆栈的扩展 IPC共享内存,与其他进程共享数据,内核给该进...
2019-07-02 09:56:33
199
原创 虚拟的根文件系统及其作用和工作机理
为什么需要虚拟根文件系统:Linux内核加载真正根文件系统执行/sbin/init程序前,需要找到根设备位置,如果根文件系统所在设备需要驱动的支持,内核有可能无能为力,通过提供一个过渡的临时根文件系统可以使得内核的设计更灵活简单.通常过渡的临时根文件系统基本上是内存文件系统.内核总是能安装ramdisk的(注:这是因为ramdisk临时文件系统和内核一样,也是由bootloader通过低级...
2019-06-30 13:39:03
769
原创 开发板使用--基本概念
Linux内核zlmage里面包括了基本硬件的驱动,因为驱动程序也属于内核,管理硬件资源。ramdisk-uboot是一个基于ram的文件系统,被uboot加载到ram中,内核需要先挂载这个文件系统,相当于一个虚拟根文件系统。临时过渡用的,目的是为了精简内核,使得内核不必包括所有种类的块设备文件的驱动程序。而是先挂载基于RAM的文件系统,就不需要包括哪些SICI等设备的驱动了。在 L...
2019-06-27 22:10:28
530
原创 Linux中的线程(LWP) 和 用户线程(线程库实现) 进程(HWP) 区别和关系
Linux的线程概念:内核线程:它的创建和撤消是由内核的内部需求来决定的,用来负责执行一个指定的函数,一个内核线程不需要和一个用户进程联系起来。它共享内核的正文段和全局数据,具有自己的内核堆栈。它能够单独的被调度并且使用标准的内核同步机制,可以被单独的分配到一个处理器上运行。内核线程的调度由于不需要经过态的转换并进行地址空间的重新映射,因此在内核线程间做上下文切换比在进程间做上下文切换快得多。...
2019-06-25 18:42:15
915
原创 用户线程的使用和同步
创建线程【 GCC编译的时候需要加上选项 -lpthread 添加编译时的静态链接库】pthread_t用于表示Thread ID,具体内容根据实现的不同而不同,有可能是一个Structure,因此不能将其看作为整数 thread具有:ID、栈、信号掩码、等#include <pthread.h>int pthread_create(pthread_t *restrict ...
2019-06-25 18:42:04
109
转载 exec系统调用
因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段。exec函数函数:通常exec函数不返回,成功的调用会调转到新程序的入口点作为结束,而刚刚才被运行的代码是不会存在于进程进程的地址空间中。exec函数调用,改变哪些属性:任何挂起的信号都被丢失; 捕捉的任何信号会被还原为缺省的处理方式; 任何内存的锁定都会丢...
2019-06-24 21:45:40
2014
原创 Linux系统编程--第四章 高级文件IO
散布/聚集IO: 在单个系统调用中同时对多个缓冲区进行读取或者写入操作,适合聚集不同数据结构进行统一的IO操作。epoll:poll() 和 select() 的改进版本,在一个程序需要处理数百个文件描述符的时候很有用内存文件映射IO:将文件映射到内存,可以通过简单的内存管理方式来处理文件文件IO提示: 允许进程将文件IO使用上的一些提示信息提供给内核,能提升IO性能异步IO ...
2019-06-24 08:58:46
660
转载 Linux的五种IO模型
转载:https://blog.csdn.net/qq_38847853/article/details/80789747阻塞IO(bloking IO)非阻塞IO(non-blocking IO)多路复用IO(multiplexing IO)信号驱动式IO(signal-driven IO)异步IO(asynchronous IO)...
2019-06-22 17:19:05
131
原创 OPPO面试题 笔试题 搜集
1、面试在校期间,学得最好的专业课程是什么,问课程相关知识C语言内存结构和struct内存对齐最能体现编程功底的项目,项目难点,io操作应该不少吧,io、多线程了解吗?2、笔试3、HR面试学习了哪些课外知识,怎么学习的,学到了什么你觉得你的核心竞争力是什么?为什么把他作为核心竞争力?除了这个,你觉得还有什么竞争力...
2019-06-20 14:08:10
4377
原创 fork系统调用
一次调用两次返回:一次在父进程中返回,返回值是子进程的pid;另一次是在子进程中返回,返回值为0。在Linux下如果内存没有被写的话,那么父子进程是共用地址空间的,所以内存中的同一个fork函数会在两个进程中调用到。在父进程中返回的就是子进程id,子进程中返回的是0。子进程是父进程的副本:子进程获得父进程的数据段【意味着全部变量不互相影响】、堆栈段、栈的副本。(所谓副本是重新复制一份(或者写时...
2019-06-20 10:06:20
318
原创 GDB调试 和 coredump文件
1、GDB调试https://blog.csdn.net/21cnbao/article/details/7385161#commentBoxhttps://www.cnblogs.com/lsgxeva/p/8078670.html2、coredump 查看程序异常崩溃时的状态2.1开启coredump: 查看命令:【ulimit -c】 ...
2019-06-20 09:56:25
325
原创 Linux操作系统--抢占
1、用户抢占: 从系统调用 或者 中断 返回用户空间时,检查当前进程的need_resched标志(位于thread_info结构体中),当该标志为0时,可以发生进程切换。2、内核抢占: 在内核空间中,从中断返回内核空间 或者 preempt_count计数重新为0(当前进程持有的所有锁都被释放)时 并且need_resched==0,系统处于进程上下文,此时也...
2019-06-18 16:25:06
726
原创 Linux用户态和内核态通信方法--netlink
Linux用户空间和内核空间通信方法:系统调用、procfs、ioctl接口、netlinknetlink 是 Linux 用户态与内核态通信最常用的一种方式。netlink:netlink socekt是一种用于在内核态和用户态进程之间进行数据传输的特殊的IPC。它通过为内核模块提供一组特殊的API,并为用户程序提供了一组标准的socket 接口的方式,实现了一种全双工的通讯连接。...
2019-06-18 10:38:00
1886
原创 根文件系统
Linux 内核在完成系统初步的初始化之后需要挂载某个文件系统做为根文件系统(Root Filesystem)。根文件系统是 Linux 系统的核心组成部分,它可以做为Linux 系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用软件所需要的库。总结根文件系统的作用:(1)init进程的应用程序(Linuxrc)在根文件系统上(2)根文件系统提供了根目录/(3)内核启动...
2019-06-15 21:17:46
335
原创 leetcode 1044 最长重复子串 C语言
char * longestDupSubstring(char * S){ int i=0,j=0,k=0,len=strlen(S); int max_new=0,max=0,max_l,max_r; for(;i<len-max-1;i++){ for(j=len-1;j>i;j--){ max_new=0; ...
2019-06-15 20:39:21
1189
原创 Linux源码阅读的一些笔记
内核入口:stext,在arch/arm/kernel/vmlinux.lds.S中定义的: (该文件定义各个函数编译后在内核镜像中的位置,链接脚本)1、start_kernel()函数 【/kernel/init/main.c】C程序的入口,所有Linux平台的Linux内核入口,主要完成剩余的与硬件平台初试化的工作。和调用第一个init进程。...
2019-06-15 10:30:37
162
原创 Linux内核启动过程
启动条件:CPU位于SVC模式,并且IRQ和FIQ都是禁止的;MMU内存管理关闭,此时都是物理地址;数据cache关闭,指令cache无要求;通用寄存器R0=0,R1=CPU类型,R2=内核参数列表的物理地址(设备树地址)。Linux 内核有两种映像:一种是非压缩内核,叫 Image,另一种是它的压缩版本,叫zImage。根据内核映像的不同,Linux 内核的启动在开始阶段...
2019-06-15 10:30:26
188
原创 Linux启动和0 1 2 号进程
在linux启动的C阶段start_kernel()的最后,rest_init()会开启两个进程:kernel_init,kthreadd,之后主线程变成idle线程。idle进程:pid=0前身是系统创建的一个进程,也是唯一一个没有通过fork()创建或者kernel_thread产生的进程。idle进程的创建:vmlinux的入口是arch/arm/kernel/head.S...
2019-06-11 22:19:57
877
原创 优先级反转
参考:https://blog.csdn.net/u014089131/article/details/740110841、优先级反转: 由于多进程共享资源,具有最高优先权的进程被低优先级进程阻塞,反而使具有中优先级的进程先于高优先级的进程执行,导致系统的崩溃。这就是所谓的优先级反转(Priority Inversion)。2.、产生原因其实,优先级反转是在高优级(...
2019-06-10 22:07:51
211
原创 socket套接字编程
套接字:通过 socket() 函数来创建一个网络连接,或者说打开一个网络文件,socket() 的返回值是(socket描述符),同文件描述符。Windows 也有类似“文件描述符”的概念,但通常被称为“文件句柄”。Linux 平台则使用“描述符”。Internet 套接字分成两种类型:流格式套接字(SOCK_STREAM):TCP 用来确保数据的正确性,IP(Internet ...
2019-06-10 19:41:58
188
原创 各种排序算法总结
1、冒泡排序: 时间复杂度 空间复杂度 稳定性 类型 备注 冒泡排序 稳定 交换排序 每次都从0至i中交换出最大(小)的,沉下去。 选择排序 不稳定 选择排序 每次从剩下的i至n中,选择最大(小)的,并记录位置,再交换。 插入排序 稳定 插入排序 ...
2019-06-05 16:43:02
254
原创 C语言常用的字符串处理函数归纳
strcat: char *strcat(char *des, const char *src);//要求des有足够的空间strncat: char *strncat(char *des, const char *src, int n);//src前n个字符追加到desstrchr char *strchr(const char...
2019-06-05 09:36:49
233
原创 VIVO 提前批 嵌入式 笔试 +面试 经验
经验:一定要先把思路想对,再动手,把自己的思路用测试例程手动算一下,测试正确与否。有些公司的界面可以使用打印调试错误做法:先动手,要是思路不对,再改,基本时间不够。笔试:20190604首先题目很简单,可能是第一次笔试还挺紧张1、找出第一个数组中有的且第二个数组中不存在的元素。2、链表元素互换位置3、一个数组表示商品价格,一个数组表示商品的热力值,给定拥有的总金额,要...
2019-06-04 20:24:55
5492
原创 Linux进程间通信之IPC (信号量、消息队列、共享内存)
1、首先要注意一个概念:IPC结构都是内核的结构。也就是说IPC结构由内核维护,对于每个进程都是公共的,不属于某个特定进程。只有这样,IPC结构才能支持它们“进程间通信”的功能。2、标识符(ID)和键(key):ID是IPC结构的内部名。内部即在进程内部使用,这样的标识方法是不能支持进程间通信的。key就是IPC结构的外部名。当多个进程,针对同一个key调用get函数(msgget...
2019-06-04 18:00:20
352
原创 嵌入式系统 存储体系和存储介质
1、RAM(random access memory):(都属于易失性存储器)SRAM:静态随机存储器,6个晶体管存储一位数据,功耗大,面积大DRAM:动态随机存储器,一个晶体管和一个电容存储一位数据,便宜简单,需要刷新SDRAM:同步动态随机存储器,需要同步时钟,需要刷新DDR(double data rate) SDRAM:双通道同步SDRAM。一个时钟可以读取两个数据...
2019-06-03 21:21:21
2978
原创 __attribute__((aligned())) 和#pragma pack(1)
typedef struct Student_t{ int age; char c;}__attribute__((aligned (64))) Student;//影响结构体自身的对齐和大小,每个结构体单独占用64字节 ,不影响其中结构体中元素的对齐 typedef struct Node_t{ int a; char c;} Node __attribute__((a...
2019-06-03 20:20:15
1785
原创 CRC校验原理
CRC:循环冗余校验原理:发送端采用模2除法,在原数据后面加校验位。接收端将接受的数据也采用模2除法,取出原数据。当接收端余数为0的时候说明接受正确。模2除法:除数选择:用户随机选择,假设k位。一般以多项式表示。假如是1110被除数:原数据在后面添加k-1个0。【用途:用以求除数的余数】假如是100101CRC校验步骤:1、设定一个接收端和发送端都认可的除数.k位...
2019-06-03 16:55:50
605
原创 大疆考核内容
1、ARM特性 + DDR特性 +内存管理+存储2、Linux内核3、C语言语法,包括常用库函数的使用,debug模式,GCC编译器4、实时系统和非实时系统5、常用的实时系统6、常用的嵌入式通讯协议、网络通信协议...
2019-06-03 15:30:30
617
原创 2016华为软件校招 笔试题
1、老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.#include<stdio.h>int main(){ int N=0,M=0; while(scanf("%d %d",&N,&M) != EOF){ int data[N+1],i=1;//局部数组不需要初始...
2019-06-03 09:04:35
779
原创 刷题总结
解题思路:1、先审题,考虑各种情况+功能(例如排序+去重)2、思考结题思路,再动笔技巧总结:1、正向处理不方便,可以考虑逆向处理。(例如:字符串提取数字)2、通过率不高,不能是没有正确处理输入输出,而不是没有考虑全面各种情况。3、奇怪错误:1、文件尾标识符:EOF。用以判断输入结束。2、当不能和正确答案一样输出的时候,输出结果不会完全输出。输出...
2019-06-01 12:22:53
374
原创 华为2018软件题 C语言实现
1、不断按行读入格式为“打分数量-分数1-分数2-分数n”的串,去掉最高分、最低分,求平均分,以保留小数点2位输出。例如:3-88-90-78\nint main(){ char s[100]; scanf("%s",s); int data[100]={ 0 }; int i,n,j,count=0,sum=0; float average; int pre=-1,...
2019-05-31 16:47:47
631
原创 C语言标准输入输出库函数和缓冲区
1、scanf()函数:int scanf(const char *format, ...);返回值:成功匹配的个数的参数个数(一个%s算一个)【注】scanf输入字符串的时候且第一个格式化参数不是字符类型%c的时候,当空格、tab、\n位于最前面的时候,自动去除。同时多个数据同时输入的时候,以空格、tab、\n为分隔符。最后的\n继续保留在缓冲区。【补充】如果scanf输入得到一...
2019-05-31 16:38:28
1314
原创 快乐生活 心得体会
1、自信是一切的良性循环的前提2、做事有计划,有总结,归纳3、学会价值呈现,干得好也要说得好4、学会分享自己的观点,不轻易接受别人的观点5、爱好技术,喜欢技术但不沉迷于技术6、生气是无能的表现(林耀东)7、...
2019-05-31 15:08:20
65
原创 数据转换字节扩展 char c=128
char c=128;printf("%d",c);【将C语言代码汇编,可以看到128转换成了-128】C语言char类型的表示范围-128~127。128:补码10000000b装载到寄存器exa中:属于有符号数扩展,按照符号位填充高位字节。由于 128最高为是1,为负数,扩展为int的-128为11111111 111111 111111 1000000,即0xfff...
2019-05-30 21:37:02
1883
原创 华为嵌入式软件笔试题
1、输出2,5 【注意指针指向的类型,操作指针的时候才知道指针移动的字节】int main(){ inta[5]={1,2,3,4,5}; int *ptr=(int*)(&a+1);//a指向int类型,&a指向数组类型 printf("%d,%d",*(a+1),*(ptr-1));}2、死锁产生死锁的必要条件:(1)互...
2019-05-30 18:43:42
6493
10
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅