- 博客(106)
- 资源 (2)
- 收藏
- 关注
原创 进程fork和vfork的区别
#include <stdio.h>#include <stdlib.h>#include <sys/type.h>int main(){ int count = 1; int child = fork(); if(child < 0) { perror("fork error"); } else if(child == 0) { ...
2019-04-15 10:07:35 457
原创 const成员函数
const成员函数const只能放在函数声明的尾部,大概是因为其它地方都已经被占用了。这个声明表示任这个函数不会修改类中的数据成员。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。以下程序中,类stack的成员函数GetCount仅用于计数,从逻辑上讲GetCount应当为const函数。编译器将指出GetCo...
2018-11-11 20:18:59 1017
原创 c++智能指针
静态内存和栈内存。静态内存用来保存局部的static对象、类的static数据成员以及定义在任何函数之外的变量。栈内存用来保存定义在函数内的非static的对象。分配在静态或者栈内存中的对象由编译器自动创建和销毁。对于栈对象,仅在其定义的程序运行时才存在;static对象在使用之前分配,在程序结束时销毁。除了静态内存和栈内存之外,每个程序还拥有一个内存池。这部分内存被称作自由空间或堆。程序用堆...
2018-11-11 19:14:27 367
原创 linux gcc链接选项详解
-I(大写i) -L(大写L) -l(小写l)(1)-l -I(大写i)显示指定头文件的搜索路径。 -I/home/myinclude/ 表示/home/myinclude目录作为第一个寻找头文件的目录,寻找的顺序是: /home/m...
2018-11-04 09:11:17 7914 1
原创 程序编译过程分析
1.概述一个C语言程序从源代码文件变成最后的可执行程序文件,需要经历预处理、编译、汇编、链接四个过程。预处理:条件编译、头文件包含、宏替换,生成.i文件编译:将预处理后的文件转换成汇编语言,生成.s文件汇编:汇编变为目标代码(机器代码)生成.o文件链接:链接目标代码,生成可执行程序。日常使用GCC编译器完成上述过程,需要以下选项:-E P...
2018-10-20 18:59:11 660
原创 linux no space left on device
寻找原因 从字面上理解,这个问题是说磁盘上没有多余的空间。 那么到底是什么地方将空间?先用df命令查看当前计算器磁盘空闲情况df -a我这边执行完后可以看到/dev/vda1被完全占用从根目录下开始使用du命令查找出空间占用最大的文件查看当前目录下每个文件夹所占用的空间du -sh *通过一层一层的比较文件所占用空间,发现是jenkins的运行日志文件占用最大,...
2018-08-17 10:50:20 349
原创 cached和buffer
有资料认为:free命令里面的buffers是为了写而产生,而cached是为了读而产生。 真实情况下,cached和buffers与读写没有半毛钱关系,它们都是缓存,唯一的区别是,如果你cat /dev/sda1 > /dev/null,这样/dev/sda1内容进入buffers,如果你cat /mnt/aaa/bbb.c > /dev/null,则/mnt/aaa/bbb.c的...
2018-03-23 15:35:50 437
原创 cpu如何通过MMU访问到物理地址
cpu的MMU开启后,cpu的寻址过程如下:CPU任何时候发出的地址都是虚拟地址,这个虚拟地址发给MMU后,MMU通过页表在页表里面查出这个虚拟地址对应的物理地址是什么,从而去访问外面的内存条。MMU里面的页表地址寄存器,记录了页表本身存放的位置。现在我们假设每一页的大小是4KB,而且假设页表只有一级。这个页表长成下面这个样子,页表的每一行是32bit。当CPU访问虚拟地址0的时候,MMU...
2018-03-19 09:52:23 2039
原创 linux下载edk2链接文件
在文章的开始之前首先推荐一个微软相关系统,软件免费下载的良心网站:https://msdn.itellyou.cn/ 该网站上可以获得所以版本windows,office,vs,SQL 等全部版本的软件.所以软件下载链接以edk2链接提供. 若在windows下,可以使用迅雷轻松下载. 但在linux下就有点麻烦了,若是thunder://链接,还可以echo url|base64 -d解析...
2018-03-15 10:36:40 63876 6
原创 GNU/Linux下的/proc/[pid]目录下的文件分析
一、相关文件目录/proc/[pid]/auxv/proc/[pid]/cmdline/proc/[pid]/comm/proc/[pid]/cwd/proc/[pid]/environ/proc/[pid]/exe/proc/[pid]/fd/proc/[pid]/latency/proc/[pid]/limits/proc/[pid]/maps/proc/[pid]...
2018-02-09 11:11:01 553
原创 指针加常数的计算结果
#include <stdio.h> struct BBB { long num; char *name; short int data; char ha; short ba[5]; }*p; int main() { p = 0x1000000; printf(" p+0x200=0x%08x\n
2017-07-20 13:31:42 1421
原创 c语言之强制类型转换
C语言中,任何一个变量必须有一个地址,而这个地址空间内的0-1代码就是这个变量的值。不同的数据类型占用的空间代码不一样,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给程序员的一种记住这个地址的方便一点的方法。但是,不同的变量在机器中都是0-1代码,所以不能简单的通过检查一个值的位来判断它的类型。 例如:定义如下: int a; float b; double c;
2017-07-17 13:22:22 1442 1
原创 C语言之指针的初始化和赋值
1.指针的初始化指针初始化时,“=”的右操作数必须为内存中数据的地址,不可以是变量,也不可以用整型的地址值(但是int *p=0;除外,该语句表示指针为空)此时,*p=只是表示定义的是个指针变量,并没有间接取值的意思。Example 1:int a=25;int *ptr=&a;int b[10];int *point=b;int *p=&b[0];如果:int *p;*p=7;//编
2017-07-17 11:26:53 1870
原创 C语言判断大小端存储
用C语言写程序时需要知道是大端模式还是小端模式。 所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中; 所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。 为什么会有大小端模式之分呢? 这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在c语言中除了8bit的char之
2017-07-17 10:37:50 634
原创 linux驱动之DMA驱动
DMA是一种无需CPU的参加就可以让外设与系统内存之间进行双向数据传输的硬件机制。它可以使系统CPU从实际的I/O数据传输过程中摆脱出来,大大提高系统的吞吐率,并且在传输期间,CPU还可以并发执行其他任务。#include<linux/module.h>#include<linux/kernel.h>#include<linux/fs.h>#include<linux/init.h>#inc
2017-06-06 15:14:31 1092 1
原创 块设备驱动再次剖析
假设对flash:1.写扇区0,2.写扇区1 1. 读出整块到buffer, 修改buffer里扇区0 擦除整块 烧写整块 2.读出整块到buffer 修改buffer里扇区1 擦除整块 烧写整块 框架: app:open,read,write “1.txt” ——————————————文件的读写 文件系统:vfat,ext2,ext3,yaffs(把文件的读写转换成扇区
2017-05-29 17:00:05 349
原创 网卡驱动
完成网卡驱动程序流程: 1.分配一个net_device结构体 2.设置 2.1发包函数:hard_start_xmit 2.2收到数据时(在中断处理函数里)用netif_rx上报数据 2.3其他设置 3.注册:register_netdevlinux3.0内核下虚拟网卡#include <linux/errno.h>#include <linux/netdevice.h>#incl
2017-05-29 16:53:08 795
原创 抽象类
纯虚函数是指被标明为不具体实现的虚成员函数,它不具备函数的功能,许多情况下,在基类中不能给虚函数一个有意义的定义,这时可以在基类中将它说明为纯虚函数。其实现留给派生类去做。 包含纯虚函数的类称为抽象类,一个抽象类中至少具有一个纯虚函数。抽象类只能作为基类派生出新的子类,而不能在程序中被实例化。#include <iostream>using namespace std;class CFigur
2017-04-06 22:31:04 528
原创 多态与虚继承
多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数调用不同内容的函数。多态主要通过联编实现。 静态联编:在编译时一定确定要调用哪个函数。 动态联编:一个类如果有虚函数,它的对象有个指针,指向虚函数表,通过指针调用里面的虚函数。 虚函数表8个字节。 在类的继承的不同层次中,在不同的层次中可以出现名字、参数个数和类型相同而功能不同的函数。编译器按照向自己后父类的顺序进行覆盖查找
2017-04-06 20:44:48 1096
原创 继承
继承在子类的外部只能访问父类的public成员, 在子类的内部可以访问类的protected和public。 protected成员可以被基类的所有的派生类使用,这一性质可以沿继承树无限循环#include<iostream>#include<string.h>using namespace std;class Father{private: int money;protect
2017-04-06 20:17:57 269
原创 友元与运算符重载
友元对于类的私有方法,只有该类中可以访问,其他类中不能访问。C++语言提供了友元类和友元方法来实现访问其他类的私有成员,当用户希望访问当前类的私有成员时,可以在当前类中将另一个作为自己的有元类,这样另一类中就可以访问当前类的私有成员。class Cltem{private:char name[128];void OutputName(){printf("%s\n",name);}}pub
2017-04-06 20:11:27 363
原创 字符数组
昨天在写c和指针的课后题时候总是编译不通过,是一个叫 incompatible assignment types 什么的错误,我将一个数组char a[100] 赋值一个字符串常量a=”HUNDRED “; 会报错 如果改为 a[0]=”HUNDRED “; 不会报错,但是运行结果打印字符串打不出任何东东 如果把a改成动态数组就像char a=(char )malloc(100);
2017-03-13 12:34:05 385
原创 笔试算法题
1.输入一串字符串,统计输入大小写英文字母、数字、空格、其他字符的数量#include<stdio.h>int main(){ int letter,num,space,other; letter=num=space=other=0; char ch; while((ch=getchar())!='\n') { if(ch>='A'&&ch
2017-03-12 15:41:57 372
原创 C++基础复习
C++引用int add(int &b){b=b+1;return b;}int main(){int a=99;printf("%d\n",add(a));}构造函数#include<iostream>using namespace std;class Person{private: char *name; int age; char *work;
2017-03-09 19:18:31 443
原创 Linux笔试题
1.建立动态路由需要用到的文件有 /etc/hosts 设定用户自已的IP与名字的对应表 /etc/HOSTNAME 设定用户的节点名 /etc/resolv.conf 设置DNS /etc/gateways 设定路由器 2.linux修改路由的命令是? A,route命令用来显示目前本机路由表的内容,并且还可以针对路由表中的记录来进行相应的添加、删除或修改等操作。 B
2017-03-06 15:08:21 958
原创 二叉树的遍历
二叉树的定义二叉树是个结点的有限集合,该集合或者空集(称为空二叉树),或者由一个根节点和两棵互不相交的、分别称为根节点的坐子树和右子树的二叉树组成。二叉树特点每个节点最多有两棵树,所以二叉树中不存在度大于2的结点。 左子树和右子树是有顺序的,次序不能任意颠倒。 即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。二叉树的五种形式1.空二叉树 2.只有一个根节点3.根节点只有左子树 4.
2017-03-04 17:00:41 423
原创 大话数据结构之数据结构绪论
1.基本概念和术语数据:数据描述客观事物的符号,是计算机中可以操作的对象,是被计算机识别,并输入给计算机的符号集合。 数据元素:是组成数据结构的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。如人类的数据元素是人。 数据项:一个数据元素可以由若干个数据项组成。人这样的数据元素由眼、耳、鼻这些数据项组成。数据项是数据不可分割的最小单位。 数据对象:是性质相同的数据元素的集合,是
2017-02-23 20:04:58 308
原创 SPI设备驱动学习BUG问题记录
在17.2.20日的问题进行长达一天多的反复调试,终于在22日得到了解决。 以及oled的驱动的编写,在进行驱动的调试过程中, spi_register_board_info注册硬件信息遇到了无法创建设备。 spi_register_board_info spi_match_master_to_boardinfo spi_new_device spi_add_device /* Chi
2017-02-22 14:53:01 1683
原创 LINUX设备驱动之SPI总线驱动分析
1.内核SPI主要结构2.SPI驱动框架2.1枚举过程driver/spi/spi.c 2.2数据收发过程spi_write spi_message_init(); 初始化一个spi_message/一个不可打断的SPI传输过程:CS=0,传数据,cs=1/ /一个spi_message由多个spi_transfer组成/ spi_message_add_tail(&t, &m);/spi
2017-02-22 14:50:27 623
原创 LINUX USB驱动(4)-鼠标驱动实例
1怎么写USB设备驱动程序?1.1分配/设置USB_driver结构体 .id_table .probe .disconnect 1.2.注册2.实例代码*参考:\itop4412_kernel_3.0\drivers\hid\usbhid\Usbmouse.c*/#include <linux/kernel.h>#include <linux/slab.h>#include <li
2017-02-13 11:25:24 595
原创 LINUX USB驱动分析(3)-USB驱动分析
前面学习了USB驱动的一些基础概念与重要的数据结构,那么究竟如何编写一个USB 驱动程序呢?编写与一个USB设备驱动程序的方法和其他总线驱动方式类似,驱动程序把驱动程序对象注册到USB子系统中,稍后再使用制造商和设备标识来判断是否安装了硬件。当然,这些制造商和设备标识需要我们编写进USB 驱动程序中。 USB 驱动程序依然遵循设备模型 —— 总线、设备、驱动。和I2C 总线设备驱动编写一样,所
2017-02-13 11:21:23 1268
原创 LINUX USB驱动开发(2)-USB驱动体系分析
一.日常USB现象:1.将USB设备接入电脑上,右下角弹出“发现android phone” 2.跳出对话框。提示你安装驱动程序问题1:既然没有安装驱动,为何能知道设备是“Android phone”答1:windows里已经有了USB的“总线驱动程序”,接入USB设备后,是“总线驱动程序”知道你是“android phone”,提示按安装“设备驱动程序” USB总线驱动程序:识别USB设备,给
2017-02-12 20:41:35 655
原创 LINUX USB驱动开发(1)-USB驱动重要数据结构
USB设备为主机提供了多种多样的附加功能,如文件传输,声音播放等,但对USB主机来说,它与所有USB设备的接口都是一致的。一个USB设备由3个功能模块组成:USB总线接口、USB逻辑设备和功能单元: a – 这里的USB总线接口指的是USB设备中的串行接口引擎(SIE); b – USB逻辑设备被USB系统软件看作是一个端点的集合; c – 功能单元被客户软件看作是一个接口的集合。SIE、端点
2017-02-12 20:21:09 538
原创 Linux驱动之I2C设备驱动完全解析
上一节介绍了I2C的相关协议,本节主要讲I2C的设备驱动的创建 在内核iTop4412_Kernel_3.0\Documentation\i2c\instantiating-devices这个文档介绍了4种创建I2C设备的方法 1设备的4种构建方法 1.1定义一个i2c_board_info,里面有名字,地址 然后i2c_register_board_info(busnum,……)(把他们放
2017-02-11 10:47:17 5059 1
原创 Linux驱动之I2C总线驱动开发
一、IIC 基础概念1.I2C 基础概念IIC(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线 ###1.IC总线的特点 IIC总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持4
2017-01-16 21:07:47 981 1
原创 iTop4412之I2C裸机操作
在进行I2C任何操作之前的前提工作: 1.写操作的I2C从机的地址在I2CADD寄存器 2.设置I2CCON寄存器,包括使能中断,确定时钟周期 3.设置I2CSTAT去使能串口输出 参照exynos4412的datasheet写出了exynos4412的I2C的write和read数据的操作void I2C_read(unsigned int slave_addr,unsigned char
2017-01-16 17:21:55 1305
原创 linux设备驱动之VFS虚拟文件系统
1.VFS虚拟文件系统 Linux 允许众多不同的文件系统共存,并支持跨文件系统的文件操作,这是因为有虚拟文件系统的存在。虚拟文件系统,即VFS(Virtual File System)是 Linux 内核中的一个软件抽象层。它通过一些数据结构及其方法向实际的文件系统如 ext2,vfat 提供接口机制。 Linux 有两个特性: a – 跨文件系统的文件操作 Lin
2017-01-16 15:44:51 1219
原创 linux字符设备驱动之file_operations结构体知识详解
struct file_operations在fs.h这个文件里面被定义的struct super_operations { struct inode *(*alloc_inode)(struct super_block *sb); void (*destroy_inode)(struct inode *); void (*dirty_inode) (struct inode
2017-01-15 20:27:45 937
原创 linux驱动之自动创建设备节点
利用cat /proc/devices查看申请到的设备名,设备号。 创建设备节点 1.使用mknod手工创建:mknod filename type major minor 2.自动创建设备节点:利用udev(mdev)来实现设备文件的自动创建,首先应保证支持udev(mdev),由busybox配置。在驱动用加入对udev 的支持主要做的就是:在驱动初始化的代码里调用class_create
2017-01-15 19:41:55 504
原创 Linux驱动之模块传参
一、module_param() 定义 通常在用户态下编程,即应用程序,可以通过main()的来传递命令行参数,而编写一个内核模块,则通过module_param() 来传参。 module_param()宏是Linux 2.6内核中新增的,该宏被定义在include/linux/moduleparam.h文件中,具体定义如下:#define module_param(name,
2017-01-15 19:14:07 463
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人