自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 Linux Thermal Framework分析及实施

Linux Thermal Framework分析及实施关键词:Zone、Cooling、Governor、Step Wise、Fair Share、trip等等。Linux Thermal的目的是控制系统运行过程中采样点温度,避免温度过高造成器件损坏,确保芯片长期稳定工作。整个Thermal框架可以分为四部分:Thermal Driver负责将获取温度设备,注册成structthermal_zone_device,比如Temp Sensor、NTC等。 Thermal Gover..

2020-12-30 11:18:47 2456 1

转载 为什么一定要copy_from_user

网上很多人提问为什么一定要copy_from_user,也有人解答。但是这里面很多的解答没有回答到点子上,不能真正回答这个问题。我决定写篇文章正式回答一下这个问题,消除读者的各种疑虑。这个问题,我认为需要从2个层面回答:第一个层次是为什么要拷贝,可不可以不拷贝?第二个层次是为什么要用copy_from_user而不是直接memcpy为什么要拷贝?拷贝这个事情是必须的,这个事情甚至都跟Linux都没有什么关系。比如Linux有个kobject结构体,kobject结构体里面有个name指针:1

2020-12-22 20:07:53 685

转载 linux 内核 - ioctl 函数详解

概念ioctl 是设备驱动程序中设备控制接口函数,一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设 ioctl() 命令的方式实现。在文件 I/O 中,ioctl 扮演着重要角色,本文将以驱动开发为侧重点,从用户空间到内核空间纵向分析 ioctl 函数。用户空间 ioctl#include <sys/ioctl.h>int ioctl(int fd, int cmd, …) ;参数 描述fd 文件描述符cm.

2020-12-19 15:26:29 439 1

转载 LINUX设备驱动模型之PLATFORM(平台)总线详解

LINUX设备驱动模型之PLATFORM(平台)总线详解/********************************************************/内核版本:2.6.35.7运行平台:三星s5pv210/********************************************************/1、什么是platform(平台)总线?相对于USB、PCI、I2C、SPI等物理总线来说,platform总线是一种虚拟、抽象出来的总线,实际中

2020-12-08 17:16:48 960

转载 消息队列函数四个组成函数:msgget、msgctl、msgsnd、msgrcv

消息队列函数由msgget、msgctl、msgsnd、msgrcv四个函数组成。下面的表格列出了这四个函数的函数原型及其具体说明。1. msgget函数原型 msgget(得到消息队列标识符或创建一个消息队列对象) 所需头文件 #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> 函数说明 .

2020-09-10 14:30:36 4959 1

转载 linux的initcall机制(针对编译进内核的驱动)

initcall机制的由来我们都知道,linux对驱动程序提供静态编译进内核和动态加载两种方式,当我们试图将一个驱动程序编译进内核时,开发者通常提供一个xxx_init()函数接口以启动这个驱动程序同时提供某些服务。那么,根据常识来说,这个xxx_init()函数肯定是要在系统启动的某个时候被调用,才能启动这个驱动程序。最简单直观地做法就是:开发者试图添加一个驱动程序时,在内核启动init程序的某个地方直接添加调用自己驱动程序的xxx_init()函数,在内核启动时自然会调用到这个程序。但是

2020-09-09 10:39:36 351

原创 WiFi模块驱动移植

项目背景 WiFi模块rlt8812au 替换成rlt8812cu,支持rlt8812cu驱动且保持兼容原有模块驱动移植与验证 根据厂家提供的驱动包,修改makefile和Kconfig文件,根据需要修改部分源码,完成驱动移植。移植验证ok之后,rlt8812cu驱动生效。现在考虑兼容问题:1、将两个模块均静态编译进内核。编译时发现报错,提示很多函数重复定义,显然该方法不可行。2、将两个WiFi驱动模块均动态编译。这种方法需要业务将两个模块都加载即可,(不会因...

2020-09-03 15:46:04 1761 1

转载 华为海思系列芯片开发学习中常见缩写详解

1. 系统控制Hi —— HiSilicon 海思半导体公司MPP —— Media Process Platform 媒体处理平台MPI —— MPP Programe Interface MPP程序接口DDR —— Double Data-Rate 双倍速率,DDR SDRAM=双倍速率同步动态随机存储器,人们习惯称为DDR,其中,SDRAM 是Synchronous Dynamic Random Access Memory的缩写,即同步动态随机存取存储器。而DDR SDRAM是Do...

2020-08-01 11:43:00 1216 2

转载 linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解

前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍了模块的一种编译方式——在一个独立的文件夹通过makefile配合内核源码路径完成 那么如何将驱动直接编译进内核呢? 在我们实际内核的移植配置过程中经常听说的内核裁剪又是怎么麽回事呢?我们在进行linux内核配置的时候经常会执行make menuconfig这个命令,然后屏幕上会出现以下界面:这个界面是怎么生成的呢?跟我们经常说的内核配置与与编译又有什么关系呢?下面我们借此来讲解一下l...

2020-08-01 11:26:03 770

转载 虚拟网卡 TUN/TAP 驱动程序设计原理与编程

TUN/TAP虚拟网络设备为用户空间程序提供了网络数据包的发送和接收能力。他既可以当做点对点设备(TUN),也可以当做以太网设备(TAP)。实际上,不仅Linux支持TUN/TAP虚拟网络设备,其他UNIX也是支持的,他们之间只有少许差别。原理简介TUN/TAP 虚拟网络设备的原理比较简单,他在Linux内核中添加了一个TUN/TAP虚拟网络设备的驱动程序和一个与之相关连的字符设备 /dev/net/tun,字符设备tun作为用户空间和内核空间交换数据的接口。当内核将数据包发送到虚拟网络设备时,数据包被.

2020-08-01 10:44:14 2256 1

转载 COPY_FROM_USER 详解

copy_from_user函数的目的是从用户空间拷贝数据到内核空间,失败返回没有被拷贝的字节数,成功返回0.这么简单的一个函数却含盖了许多关于内核方面的知识,比如内核关于异常出错的处理.从用户空间拷贝数据到内核中时必须很小心,假如用户空间的数据地址是个非法的地址,或是超出用户空间的范围,或是那些地址还没有被映射到,都可能对内核产生很大的影响,如oops,或被造成系统安全的影响.所以copy_from_user函数的功能就不只是从用户空间拷贝数据那样简单了,他还要做一些指针检查连同处理这些...

2020-07-31 11:38:03 11899

转载 各种initcall的执行先后顺序(module_init、postcore_initcall、arch_initcall、subsys_initcall、 fs_initcall)

现在以module_init为例分析initcall在内核中的调用顺序在头文件init.h中,有如下定义:#define module_init(x) __initcall(x);很明显,module_init()只是一个面具而已,揭开这个面具,下面藏着的是__initcall()__initcall()又是何方神圣呢?继续揭露真相:#define __initcall(fn) device_initcall(fn)藏得真深,继续看:#define devi.

2020-07-28 19:26:42 578

原创 字符串查找一个字符的函数:strchr和strrchr之比较以及查找任意几个字符

运行程序https://tool.lu/coderunner/?id=73R#include <stdio.h>#include <stdlib.h>#include <string.h>char string[20] = "Hello there, honey";char *ans,*ans2,*ans3;void main(void) {...

2019-08-22 22:42:47 276

原创 C语言--数组与指针--基础易错知识练习笔记01

C语言--数组与指针--基础易错知识练习笔记 https://tool.lu/coderunner/?id=73RNotes:着重关注&ints+4,&ip+4的值。#include <stdio.h>#include <stdlib.h>int ints[20] = { 10,20,30,40,50,60,70,80,90,1...

2019-08-21 23:05:30 143

转载 物理地址、虚拟地址、线性地址以及逻辑地址

物理地址:是内存中的内存单元实际地址,是内存中每个内存单元的编号,这个编号是顺序排好的,物理地址的大小决定了内存中有多少个内存单元,物理地址的大小由地址总线的位宽决定。虚拟地址:虚拟地址是CPU保护模式下的一个概念,保护模式是80286系列和之后的x86兼容CPU操作模式,在CPU引导完操作系统内核后,操作系统内核会进入一种CPU保护模式,也叫虚拟内存管理,在这之后的程序在运行时都处于虚...

2019-04-27 21:42:29 247

转载 上拉电阻与下拉电阻的区别

上拉电阻与下拉电阻的作用 2013-08-12 00:00 上拉电阻就是把不确定的信号通过一个电阻钳位在高电平,此电阻还起到限流的作用。同理,下拉电阻是把不确定的信号钳位在低电平。上拉电阻是指器件的输入电流,而下拉指的是输出电流。 那么在什么时候使用上、下拉电阻呢? 1、当TTL电路驱动CMOS电路时,如果TTL电路输出的高电平低于CMOS电路的最低高电平(一般为3.5V),这时就需要在T

2017-11-29 18:07:11 347

转载 core dump

1、前言  一直在从事linux下后台开发,经常与core文件打交道。还记得刚开始从事linux下开发时,程序突然崩溃了,也没有任何日志。我不知所措,同事叫我看看core,我却问什么是core,怎么看。同事鄙视的眼神,我依然在目。后来学会了从core文件中分析原因,通过gdb看出程序挂再哪里,分析前后的变量,找出问题的原因。当时就觉得很神奇,core文件是怎么产生的呢?难道系统会自动产生,可是我在自

2017-11-28 21:30:08 149

转载 c/c++中int main(int argc,char *argv[])的具体含义

int main(int argc,char * argv[]) argv为指针的指针 argc为整数char **argv or: char *argv[] or: char argv[][] main()括号内是固定的写法。 下面给出一个例子来理解这两个参数的用法: 假设程序的名称为prog, 当只输入prog,则由操作系统传来的参数为: argc=1,表示只有一程序名称。 ar

2017-11-28 21:10:20 308

空空如也

空空如也

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

TA关注的人

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