linux
文章平均质量分 78
笑看江湖路6
这个作者很懒,什么都没留下…
展开
-
write和fwrite
这就是我们常见的文件IO调用read/write函数。内核的这个page cache有很多好处,比如你的程序对io还没到需要自己做用户态的读写缓存,那内核的这个机制就帮你省去了很多工作,毕竟page cache是在内存里的,而且可以拿来做read hit,相比于每次read/write都要访问磁盘,带来的性能优势还是很不错的,算是惠及大部分普通程序。所以fwrite的好处是对于小量的写,减少syscall的次数,毕竟如果你每写一个字节都要发起一个syscall,然后特权级切换到内核,这是比较耗性能的。原创 2023-01-08 14:17:05 · 3355 阅读 · 1 评论 -
【Linux 内核 内存管理】物理内存组织结构
所有节点中的处理器都可以访问全部的系统物理存储器,但是访问本节点内的存储器所需要的时间,比访问某些远程节点内的存储器所花的时间要少得多。在 NUMA 非一致内存访问架构 中, 将 CPU 划分为多个节点 , 每个节点都有自己的 " 内存控制器 " 和 " 内存插槽 " , CPU 访问自己的节点上的 内存 很快 , 但是访问其它 CPU 的内存 很慢;内存节点的pglist_data实例的成员node_mem_map指向该内存节点包含的所有物理页的页描述符组成的数组。体系结构不同,支持的页大小也相同。原创 2022-12-21 23:31:19 · 706 阅读 · 0 评论 -
linux的内存映射(二)
我们先来看幅图:Linux内存管理的最底层是buddy内存管理方案,即伙伴算法,管理伙伴算法我们不做详诉,有兴趣的可以自行学习,我们这里只要知道buddy内存池中只能分配2^n个page的内存,比如1,2,4,8……个pages,然而正常使用的时候不会碰巧就需要1,2,4,8……个pages。所以基于buddy内存池,还需要有上一级的内存管理系统,内核里面采用的是slab,slub,slob;而用户空间也有自己的内存管理方案,比如基于glibc的malloc/free内存管理方案。关于glibc的ma原创 2022-12-08 00:24:34 · 557 阅读 · 0 评论 -
linux的内存映射(一)
进程间要实现通信,可以通过函数创建一块内存映射区,和管道不同的是,内存映射区对应的内存空间在进程的用户区(用于加载动态库的那个区域)。也就是说进程间通信使用的内存映射区不是一块,而是在每个进程内部都有一块。由于每个进程的地址空间是独立的,各个进程之间也不能直接访问对方的内存映射区,需要通信的进程需要将各自的内存映射区和同一个磁盘文件进行映射,这样进程之间就可以通过磁盘文件这个唯一的桥梁完成数据的交互了。...原创 2022-08-25 23:38:06 · 1564 阅读 · 0 评论 -
在vs中创建linux项目
编译还是在远程linux上编译),在工具->选项->跨平台->连接管理器->远程标头IntelliSense管理器,点击更新。5.建立连接后,本地编写的代码就会被推送到远程环境中去。可以右键项目->属性(远程根目录),可以看到~/projects/目录,即为推送目录。3.创建一个t项目后,进入项目界面,点击如图添加一个连接,连接linux环境。注意:要是没有这个选项就要去下载对应的安装包,如下,点击进去下载linux。也可以在工具->选项->跨平台->连接管理器中去添加。原创 2022-08-24 22:06:41 · 3178 阅读 · 2 评论 -
linux共享内存介绍
由于进程通信的本质是要让两个不同的进程看到同一份资源,我们可以在物理内存上开辟一块空间,这块空间被称为共享内存,然后让这两个进程通过某种方式都能访问到这块内存,这样的话,两个进程之间就可以通信了。...原创 2022-08-17 00:10:47 · 5148 阅读 · 0 评论 -
Ubuntu硬盘空间不足时,添加硬盘的方法
先查看本地磁盘情况:进入根目录,查看本地磁盘情况:只有sda和sdb两块硬盘本地有两个磁盘,一个是/dev/sda5,大小14G,作为系统盘;另一个是/dev/sdb1,大小是197G,这个是工作盘。下面我们新增一个100G的磁盘。方法如下:1 、在Vmware中关闭Ubuntu虚拟机,在设置中,添加新的硬件设备,选择Hard Disk。(这里如果不关闭Ubuntu系统就不能增加新的硬件设备) 之后点击下一步,选择硬盘类型,可以选择IDE,或是SCSI,这里选择SCSI这里选择创建新磁盘,并原创 2022-04-05 16:35:26 · 9940 阅读 · 0 评论 -
C++的编译链接原理
编译的过程可以分解为四个步骤,分别是预编译、编译、汇编和链接。预编译是将源代码文件如拓展名为.c、.cpp或.cxx预编译成一个.i或.ii的文件。预编译过程主要处理那些源代码中的“#”开始的预编译指令。比如“#include”、“#define”等,主要的处理规则如下:(1)删除#define并进行文本替换(2)处理#if、#endif、#elif(3)递归展开#include(4)删除注释(5)添加行号和文件标识(6)保留#program经过预编译后的.i文件不包含任何宏定义,因为所有的原创 2021-12-28 00:20:12 · 818 阅读 · 0 评论 -
修改驱动程序支持电源管理
在上上篇文章中,我们梳理过流程,休眠前后和驱动打交道主要就这两个函数:a. 通知notifier:在冻结APP之前,使用pm_notifier_call_chain(PM_SUSPEND_PREPARE)来通知驱动程序在重启APP之后,使用pm_notifier_call_chain(PM_POST_SUSPEND)来通知驱动程序如果驱动程序有事情在上述时机要处理,可以使用register_pm_notifier注册一个notifier。int pm_notifier_call_chain(uns原创 2021-07-25 23:10:54 · 366 阅读 · 0 评论 -
电源管理-配置唤醒源
由上一次的分析可知,在suspend_ops->enter(state);中会进行唤醒源的配置。下面分析平台代码://位于linux-3.18\arch\arm\plat-samsung\pm.cstatic int s3c_pm_enter(suspend_state_t state){ int ret; /* ensure the debug is initialised (if enabled) */ s3c_pm_debug_init(); S3C_PMDBG("%s(%d)原创 2021-07-25 18:53:54 · 814 阅读 · 0 评论 -
电源管理休眠流程梳理
1.Linux 描述的电源状态On(on) S0 - WorkingStandby (standby) S1 - CPU and RAM are powered but not executedSuspend to RAM(mem) S3 - RAM is powered and the runn原创 2021-07-25 11:59:27 · 1711 阅读 · 0 评论 -
linux中的PCB(进程控制块) task_struct(进程描述符)
进程就是处于执行期的程序,线程是进程中的活动的对象。每个线程都拥有一个独立的程序计数器(PC)、栈、和一组寄存器。内核调用的对象是线程而不是进程。在Linux中,线程的实现非常独特,从内核的角度讲,linux并没有线程的概念。Linux把所有的线程都当成进程来实现,内核没有准备特别的调度算法或是定义特别的数据结构来表征线程。相反,线程仅仅被视为一个与其他进程共享某些资源的进程,每个线程都拥有自己的task_struct。进程和线程都是通过系统调用clone()创建的,只不过传给系统调用的参数不同而已,我们原创 2021-06-27 19:39:49 · 2048 阅读 · 1 评论 -
虚拟内存和物理内存
一、从程序到进程:我们都知道Linux下一个C程序的生成分为4个阶段:预编译(.i) --> 编译(.s) --> 汇编成目标文件(.o) --> 链接(可执行文件)1.在预编译阶段,它会修改原始的C程序,将源程序翻译成一个ASCII码的以.i结尾的中间文件。它会读取系统头文件stdio.h的内容,并把它直接插入到程序文本中。2.在编译阶段,编译器将以.i为扩展名的文本文件翻译成以.s作为扩展名的文本文件,它包含一个汇编语言程序。3.在汇编阶段,汇编器将以.s为扩展名的文本文件原创 2021-06-18 00:55:08 · 4975 阅读 · 3 评论 -
三级流水线
注:程序计数器(PC)保存下一次要取的指令地址。除非有其他情况,否则处理器在每次取指令后总是递增PC,使得它能够按顺序取得下一条指令。 3级流水线如上图所示(PC为程序计数器),流水线使用3个阶段,因此指令分3个阶段执行。 ⑴ 取指从存储器装载一条指令(取指是由程序计数器的内容决定的) ⑵ 译码识别将要被执行的指令 ⑶ 执行处理指令并将结果写会寄存器 ARM正在执行第1条指令的同时...原创 2018-07-02 09:33:43 · 6850 阅读 · 0 评论 -
浮点数的二进制表示
了解:目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格: 符号位 ...原创 2018-07-28 17:06:36 · 4505 阅读 · 0 评论 -
c和c++区别
编程的学习学无止境,只掌握一门语言是远远不够的,现在我们开始C++的学习之路,下面先看下C++ 与C 的区别一、C++概述1、发展历史 1980年,Bjarne Stroustrup博士...转载 2018-07-29 10:13:37 · 250 阅读 · 0 评论 -
tslib 的 API 接口
作者的想法是通过 tslib 来构建 MiniGUI 的输入引擎。tslib 是一个用于触摸屏设备的函数库。通过这样一个函数库,可以将编程者从繁琐的数据处理中解脱出来。为什么会出现这样的情况呢?因为触摸屏的坐标和液晶显示屏 之间的坐...转载 2018-07-26 16:01:54 · 638 阅读 · 0 评论 -
libjpeg的简单使用
解压步骤如下: /* Allocate and initialize a JPEG decompression object // 分配和初始化一个decompression结构体 Specify the source of the compressed data (eg, a file) // 指定源文件 Call jpeg_read_header() to obtain imag...原创 2018-07-15 23:48:24 · 12492 阅读 · 0 评论 -
Linux静态库和动态库区别
我们通常把一些公用函数制作成函数库,供其它程序使用。 函数库分为静态库和动态库两种。 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。 动态库在程序编译...转载 2018-07-27 14:20:55 · 218 阅读 · 0 评论 -
linux用户态、内核态的切换,SWI指令的理解
内核态的代码可以直接操作寄存器,把自己切向用户态,但是用户态想切换进入内核态,就需要费一番周折了参考本博客的另一篇文章《STM32/ARM术语:处理者模式/线程模式、特权级/用户级》总体思路是这样的:异常服务函数和中断服务函数都是运行在内核态的,在...转载 2018-08-04 09:37:09 · 688 阅读 · 0 评论 -
UNICODE,GBK,UTF-8区别
一、编码历史与区别 一直对字符的各种编码方式懵懵懂懂,什么ANSI UNICODE UTF-8 GB2312 GBK DBCS UCS……是不是看的很晕,假如您细细的阅读本文你一定可以清晰的理解他们。Let’s go! 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成...转载 2018-07-31 09:23:38 · 2961 阅读 · 1 评论 -
uboot之位置无关代码解析(推荐)
我们都知道我们写的代码最后是运行在内存(SDRAM或者SRAM,通常是SDRAM)中的,但是在运行之前他们是保存在诸如nand、flash等非易失存储设备中的,而这些存储设备的地址要映射到CPU能够寻找的地址上(一般映射在0X0地址上,这个后面详细解释),这样才能得到要运行的代码。而代码要运行的内存(这里就假设是SDRAM)也要映射到CPU上(肯定是和nand那些存储器不一样的地址,例如三星的24...原创 2018-08-09 17:25:35 · 887 阅读 · 0 评论 -
使用mmap()和使用read()write()实现文件拷贝的对比
最近上课老师说了这样一句话:mmap()内存映射可以实现文件的拷贝,并且速度明显快于一般的文件拷贝,于是 我试着实现了两种文件拷贝所花费时间的比较,首先看代码:includeincludeincludeincludeincludeincludeincludeincludeincludeincludedefin...原创 2018-08-05 20:22:37 · 1394 阅读 · 0 评论 -
Linux内核驱动之read和write
搜索公众号:itxxgh (IT学习干货),全公益,免费,定期,提供,《IT学习教程》。不会骚扰大家,只需轻点关注,也会传播《中华传统文化》传播正能量,扫码关注读和写方法都进行类似的任务, 可以同时介绍它们:ssize_t read(struct fi...转载 2018-08-06 09:55:53 · 4773 阅读 · 0 评论 -
usb_bulk_msg 说明
usb_bulk_msg接口函数的定义如下: int usb_bulk_msg(struct usb_device *usb_dev,unsigned int pipe, void *data,int len,int *actual_length,int...转载 2018-08-07 21:09:44 · 1606 阅读 · 0 评论 -
分离线程
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/youngyoungla/article/details/51645349 ...转载 2018-09-01 16:00:40 · 224 阅读 · 0 评论 -
可重入函数和不可重入函数
printf()经常有重入解释 不可重入函数不可以在它还没有返回就再次被调用。例如printf,malloc,free等都是不可重入函数。因为中断可能在任何时候发生,例如在printf执行过程中,因此不能在中断处理函数里调用printf,否则printf将会被重入...转载 2018-07-19 23:52:43 · 246 阅读 · 0 评论 -
用户级线程和内核级线程的区别
转载于http://col1.blog.163.com/blog/static/1909775192012719114033352/1 .内核级线程:切换由内核控制,当线程进行切换的时候,由用户态转化为内核态。切换完毕要从内核态返回用户态;可以很好的利用smp,...转载 2018-07-14 00:02:02 · 578 阅读 · 0 评论 -
V4L2 API详解3 Buffer的准备和数据读取
前面主要介绍的是:V4L2 的一些设置接口,如亮度,饱和度,曝光时间,帧数,增益,白平衡等。今天看看V4L2得到数据的几个关键ioctl,Buffer的申请和数据的抓取。1. 初始化 MemoryMapping 或 User Pointer I/O.申请数据Buffer。intioctl(int fd, int requestbuf, structv4l...原创 2018-07-13 22:20:58 · 1216 阅读 · 0 评论 -
深入理解l内核v4l2框架之video for linux 2(二)
续。。。3、video_devicestruct video_device{#if defined(CONFIG_MEDIA_CONTROLLER)struct media_entity entity;#endifconst struct v4l2_f...转载 2018-07-10 10:44:55 · 273 阅读 · 0 评论 -
深入理解l内核v4l2框架之video for linux 2(一)
在看了很多关于v4l2驱动的例程之后,想深入研究下linux内核的v4l2框架,顺便把这些记录下来,以备查用。Video for Linux 2 随着一些视频或者图像硬件的复杂化,V4L...转载 2018-07-10 10:02:18 · 266 阅读 · 0 评论 -
V4L2框架分析学习
Author:CJOKContact:cjok.liao#gmail.comSinaWeibo:@廖野cjok 1、概述Video4Linux2是Linux内核中关于视频设备的内核驱动框架,为上层的访问底层的视频设备提供了统一的接口。凡是...转载 2018-07-09 21:46:20 · 251 阅读 · 0 评论 -
Linux内存映射——mmap
一 mmap系统调用1.内存映射所谓的内存映射就是把物理内存映射到进程的地址空间之内,这些应用程序就可以直接使用输入输出的地址空间,从而提高读写的效率。Linux提供了mmap()函数,用来映射物理内存。在驱动程序中,应用程序以设备文件为对象,调用mmap()函数,内核进行内存...转载 2018-07-09 21:15:24 · 618 阅读 · 0 评论 -
usb驱动介绍
现象:把USB设备接到PC 1. 右下角弹出”发现android phone” 2. 跳出一个对话框,提示你安装驱动程序问1. 既然还没有”驱动程序”,为何能知道是”android phone” 答1. windows里已经有了USB的总线驱动程序,接入USB设备后,是”总线驱动程序”知道你是”android phone” 提示你安装的是”设备驱动程序” USB总线驱动程...原创 2018-07-03 09:57:42 · 290 阅读 · 0 评论 -
图像缩放算法
缩放原理和公式图示: 缩放后图片 原图片 (宽DW,高DH) (宽SW,高SH) (Sx-0)/(SW-0)=(Dx-0)/(DW-0) (Sy-0)/(SH-0)=(Dy-0)/(DH-0) => Sx=Dx*SW/DW Sy=Dy*SH/DH 每一行的缩放比例是固定的;那么可以...原创 2018-07-02 09:53:59 · 5348 阅读 · 0 评论 -
详解驱动中的设备dev
mknod命令用于创建一个设备文件,即特殊文件 首先要明白什么是设备文件,简单的我们说 操作系统与外部设备(入磁盘驱动器,打印机,modern,终端 等等)都是通过设备文件来进行通信的,在Unix/Linux系统与外部设备通讯之前,这个设备必须首先要有一个设备文件,设备文件均放在/dev目录下 我们的linux操作系统跟外部设备(如磁盘、光盘等)的通信都是通过设备文件进行的,应用程序可以打开、...原创 2018-07-02 09:32:13 · 1309 阅读 · 0 评论 -
位置有关码和位置无关码
搞ARM开发时,在连接目标代码会提到运行地址和加载地址。这两者有什么区别呢?其次,网上也有说链接地址和存储地址,那么这四个地址之间有什么区别? 1、运行地址<—>链接地址:他们两个是等价的,只是两种不同的说法。 2、加载地址<—>存储地址:他们两个是等价的,也是两种不同的说法。运行地址:程序在SRAM、SDRAM中执行时的地址。就是执行这条指令时,PC应该等于这个地...原创 2018-07-02 09:31:02 · 1696 阅读 · 0 评论 -
vmware虚拟机ubantu安装vmware tools
1.现在再开始进入系统后,在VMware菜单栏找到安装虚拟工具的时候,它会弹出一个文件夹,里面就有VMware Tools的安装包。 2. 然后我们把WMwareTools拷贝出来放到别的文件夹,再解压。 注意一定要拷贝出来,否则解压会出问题。 解压命令: tar -xzf VMwareTools-10.0.6-3595377.tar.gz 3.进入解压后的目录,执行:sudo ...原创 2018-07-02 09:10:26 · 486 阅读 · 0 评论 -
nand flash和nor flash启动区别
1) 接口区别: NOR FLASH地址线和数据线分开,来了地址和控制信号,数据就出来。 NAND Flash地址线和数据线在一起,需要用程序来控制,才能出数据。 通俗的说,就是光给地址不行,要先命令,再给地址,才能读到NAND的数据。而且都是在一个总线完成的。 结论是:ARM无法从NAND直接启动。除非装载完程序,才能使用NAND Flash.S3c2440的nand flash ...原创 2018-07-01 10:01:28 · 1669 阅读 · 0 评论 -
jz2440的时钟分析
S3C2440有两个PLL(phase locked loop)一个是MPLL,一个是UPLL。MPLL用于CPU及其他外围器件,UPLL用于USB。用于产生FCLK, HCLK, PCLK三种频率,这三种频率分别有不同的用途: FCLK是CPU提供的时钟信号。 HCLK是为AHB总线提供的时钟信号, Advanced High-performance Bus,主要用于高速外设,比如内存控...原创 2018-07-01 09:56:55 · 151 阅读 · 0 评论