自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

原创 进程间通讯_IPC

信号量:信号量是实现进程间同步的方式,这个信号量又叫信号灯集。在一个信号量中可以包含很多的信号灯,信号灯之间相互不干扰。问:上述的程序能够保证读写的顺序?如果没有执行写,先向执行读的现象?答:上述的共享内存在没有执行写的时候,执行读是不会阻塞的,所以如果向。看到现象就必须先执行写,在执行读,上述的代码遵从生产者消费者模型,必。答:存在,直到下一次写覆盖掉,或者删除共享内存这些数据才消失。ipcs 查看所有的信息(消息队列,共享内存,信号量)问:共享内存的数据读取后还存在吗?注:这里的ID并不是key。

2022-12-09 22:38:25 294 1

原创 进程间通讯_原始

信号是软件模拟的中断的功能,在信号是软件实现的,中断是硬件实现的。信号是Linux内核实现的,如果没有Linux内核就没有信号的概念。用户可以给进程发信号,进程可以给进程发信号,内核也可以给进程发信号。信号属于异步通知。进程对信号的处理方式有三种默认,忽略,捕捉。

2022-12-09 22:36:26 345

原创 Linux_多线程

多线程互斥:互斥是多个线程争抢临界资源的过程,只要抢占成功就可以操作临界资源,如果没有抢占成功就不能够操作这个临界资源,这里没有体现顺序执行的概念,可能某个线程执行多次之后另外一个线程在执行一次。但是在其中一个线程执行的时候另外一个线程一定不能执行的,这个就是互斥。这个互斥可以通过线程互斥锁完成。线程同步:线程同步就是已经知道线程执行的顺序,并且线程是顺序执行的。线程同步适合用于生产者消费者模型。例如线程1生产一辆车,线程2购买这辆车。所以线程执行的时候就必须线程1执行线程2在执行。

2022-12-09 22:34:19 365

原创 Linux_多进程

在前7秒钟执行a.out。a.out进程号是5126是拷贝终端进程得到的,当执行到fork函数的时候拷贝5126进程得到了5168进程。如果一个进程的父进程死了,子进程变成了孤儿进程,被init进程收养,当孤儿进程结束后init进程为它收尸。进程的创建过程是通过拷贝父进程得到的,进程在内核空间是通过task_struct结构体表述的,进程的PID:进程的pid是进程的唯一的标识符号,它是一个大于等0的整数值。0号进程(idel):它是Linux操作系统启动的第一个进程,这个进程叫做空闲进程,

2022-12-09 22:32:31 482

原创 Linux_文件IO

文件描述符:文件描述符本身是一个大于等于0的整数,使用open打开文件之后返回文件描述符,以后在操作文件的时候通过这个文件描述符完成。在一个正在执行的程序中文件描述的范围是0-1023(1024个),可以通过ulimit -a查看限制,这个限制值是可以修改的(ulimit -n 2048)。文件描述符的分配原则是最小未使用。在一个正在执行的程序中默认已经有三个文件描述符了ulimit - a0:标准输入文件描述符1:标准输出文件描述符2:标准错误文件描述符。

2022-12-09 22:27:20 160

原创 Linux_标准IO

在使用fopen打开文件的时候,会返回一个FILE*的指针(文件指针),FILE的本质是一个结构体,在这个结构体中记录所有的关于文件的信息,以后对文件的操作通过FILE*来完成。//创建索引//查找FILE实现的位置//缓冲区的首地址 char * _IO_buf_end;//缓冲区的结束地址 . . . };在一个正在执行的程序中,已经创建了三个FILE的指针,如下:stdin: 标准输入 (scanf)stdout 标准输出 (printf)stderr: 标准出错。

2022-12-09 22:25:35 396

原创 Linux_IO基础知识概括

系统调用(posix(可移植操作系统的标准)):从用户空间到内核空间的切换过程,不同的操作系统系统调用的接口是不同的。只要从用户空间到内核空间了就要发生一次系统调用,效率比较低。系统调用没有缓冲区。库函数(ANSI C):库函数的平台的通用新更强,库函数有缓冲区,效率比系统调用高。库函数=缓冲区+系统调用。

2022-12-09 22:18:19 375

原创 Linux系统中的库

库:在系统中是一个二进制文件,它有.c(没有main)文件编译而来的,其他的程序就是使用这个库中的函数了,其中库又分为静态库和动态库。不同的操作系统对应库文件的格式不同。由于库文件是二进制文件,所以不能够看到函数的实现过程,只能调用函数,比较安全。windows:linux:1、静态库静态库:静态库是将xxx.c文件编译生成一个lib库名.a的二进制文件,当你需要使用这个库中的某个函数的时候直接调用这个库中的函数即可。gcc在编译代码的时候会将你的文件和库最终编译生成一个二进制的文件(把库也放到可

2022-12-07 18:07:34 551

原创 Linux块设备驱动

块设备驱动是用来操作硬盘类的存储设备的磁头:一个磁盘有多少个面就有多少个磁头磁道:在一个磁头上可以有很多环,这些环就叫做磁道扇区:磁道上访问数据的最小的单位就是扇区,一个扇区的大小就是512字节1block = 512字节 1024字节 2048字节 4096字节1扇区 = 512字节块设备的能存储的数据=磁头*磁道*扇区*5121.5块设备驱动的API1.6块设备驱动的实例1.7队列处理相关的结构体、关系、相关函数reque_queue和request及bio的关系队列处理

2022-12-05 16:00:21 568

原创 Linux内核之内存分配

物理地址:在datasheet中能够查到的地址称之为物理地址,实际设备的操作地址;虚拟地址、线性地址:在操作系统程序员能够操作的地址称之为虚拟地址;逻辑地址:将程序进行反汇编之后,其中能够看到的地址称之为逻辑地址;段式管理:x86架构,分段管理页式管理:arm架构,页式管理

2022-12-05 15:59:57 1096

原创 Linux总线之SPI

1.2spi时序解析例如:CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是 SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿。CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是 SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。CPOL=1,CPHA=0:此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是 SCLK由高电平到低电平的跳变,所以数据采集是在

2022-12-05 15:59:56 1208

原创 Linux总线之I2C

(1)i2c几根线?(2)几种信号?(3)i2c读写时序(4)i2c总线的特点(5)i2c总线速率(控制器)1.2i2c总线驱动框架结构1.4i2c总线驱动的实例2.i2c总线驱动2.1si7006(sht20)设备树的编写2.1.1画出硬件连接图stm32mp151.dtsi2.1.3编写自己的设备树2.2i2c中相关的结构体i2c_client结构体:当驱动进入到probe函数之前,内核会创建i2c_client,这个i2c_client是用来记录数据的。比如i2c_ad

2022-12-05 15:59:36 1371 1

原创 Linux总线之Platform

在Linux内核中所有总线驱动都遵从设备驱动的模型,总线驱动的模型如下图:内核在设计这些总线驱动模型的时候将一个驱动分为了三个部分device、bus、driver。device是用来描述硬件设备的,bus是总线用来链接device和driver,driver是用来描述驱动的对象。在内核中所有的device放在内核的klist_devices的链表中管理,而内核中所有的driver放在klist_driver中管理。内核中的device和driver通过bus完成关联。当device和driver匹配成功

2022-12-04 21:19:43 866 1

原创 Linux子系统之中断

异常处理流程:4大步,3小步1.3中断子系统的设备树添加1.3.1按键中断的硬件原理图stm32mp151.dtsi1.3.3参考内核帮助文档,编写自己的设备树Documentation/devicetree/bindings/interrupt-controller$ vi interrupts.txt1.4按键中断的实例(一个按键)1.5按键中断的实例(三个按键)2.Linux内核定时器2.1内核定时器的定时时间问题1.当前的时间如何获取?jiffies:内核时钟节拍数,从内核

2022-12-04 21:17:37 637

原创 Linux子系统之GPIO

1.3GPIO子系统的设备树添加1.3.1LED的硬件原理图1.3.3编写自己的设备树参考内核帮助文档填写自己的设备树。/home/linux/linux-5.10.61/Documentation/devicetree/bindings/gpio/gpio.txt1.4GPIO子系统点灯的实例作业:1.实现流水灯(6盏灯)1.1实现流水灯(6盏灯)myleds.hmyleds.ctest.c1.2gpiod子系统gpiod子系统是linux内核引入新的版本,这个版本的子系统的功

2022-12-04 21:14:12 1662 1

原创 Linux设备树

设备树:描述设备信息的一种树状方式。在linux内核的3.10版本前并没有使用设备树这种方式描述设备信息,而是通过文件的方式描述设备信息。在3.10内核版本出现前利纳斯托瓦斯要求ARM社区整改设备信息的表述方式。ARM社区参考POWER PC设备信息表述方式,引入了设备树。所以在3.10的内核版本之后所有ARM的内核表示设备信息的方式都使用设备树。dts -------------*.cdtsi -------------*.h​ |​ DTC​ |​ --------------*.dtb设备树

2022-12-04 20:34:31 2500 1

原创 Linux内核竟态和并发

竞态产生的原因:如果在用户空间同时有多个进程需要访问同一个硬件,此时竞态就产生了。(如果有多个进程同时访问临界资源的时候,竞态就会产生了)1.对于单核cpu来说,如果内核支持抢占,就会产生竞态。2.多核cpu来说,核与核之间本身就会产生竞态3.中断和进程之间也会产生竞态错误的说法:在arm架构下,中断和中断间也会产生竞态(1)中断屏蔽(了解)(2)自旋锁(重点掌握)(3)信号量(重点掌握)(4)互斥体(会用)(5)原子操作(会用)中断屏蔽:就是将中断临时关闭,中断屏蔽只针对单核处理器有效。中断屏蔽的时间有尽

2022-12-04 20:28:32 462

原创 Linux的IO模型

IO模型的种类

2022-12-04 20:19:58 457

原创 Linux字符设备驱动_进阶

字符设备驱动myled.ctest.c2.ioctl函数的使用2.1为什么需要ioctlioctl:设备的控制,linux内核想把数据的读写和设备的控制拆分开来。以后设备的控制就通过ioctl完成,数据的读写通过read/write完成。例如:可以通过ioctl设置摄像头的工作模式(拍摄图片的大小,拍摄图片的格式

2022-12-04 20:05:19 317

原创 Linux字符设备驱动_基础

字符设备驱动1.4 应用层的代码实现1.5 修改Makefile文件,编译应用层的代码1.6 加载驱动并测试驱动的步骤2、 用户空间和内核空间直接数据的拷贝2.1 用户空间和内核空间数据拷贝的API2.2 系统调用函数和驱动中的read/write对应关系2.4 用户空间和内核空间数据拷贝应用层代码实现2.5 代码测试3.2 物理地址到虚拟地址映射的API3.3 完成LED灯的驱动3.3.1 分析led1灯的电路图

2022-12-04 19:57:17 252

原创 Linux驱动模块

入口:在入口函数中申请资源出口:在出口函数中释放资源许可证:遵循GPL的开源协议1.3 对模块化的驱动进行编译1.3.1 采用内部编译的方式1.3.2 采用外部编译的方式1.4 模块化驱动相关的命令2、linux内核中的打印语句的使用2.1 printk函数的使用用法:printk(打印级别 “格式化字符串”, 可变参数);打印级别:过滤打印信息的。2.3 过滤信息的作用2.4 打印函数的练习2.5 加载驱动,查看打印信息.png" alt=“image-202208081

2022-12-04 17:29:51 446

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除