自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(139)
  • 资源 (1)
  • 收藏
  • 关注

原创 内核模块——构造与运行模块

一、helloword模块示例1.第一个模块,hello-world模块源程序#include <linux/init.h>#include <linux/module.h>MODULE_LICENSE("DUAL BSD/GPL");static int hello_init(void){ printk(KERN_ALERT"hello, world\n"); return 0;}static void hello_exit(void){ print

2021-12-25 17:14:46 1071

原创 rpm包制作过程

一、打包rpm包所需安装工具1.yum install rpm-build2.yum install rpmdevtools二、制作过程1.创建rpmbuild文件夹rpmdev-setuptree实际操作截图2.打包源码程序到/rpmbuild/SOURCS下1> 编写一个hello.c的源码#include<stdio.h>int main(){ printf("hello woeld! My first rpm!\n"); return 0;}

2021-03-28 17:26:11 2895 1

原创 vim编辑器的使用

一、下载安装sudo apt install vim二、编辑器调试1.显示行号1>临时显示行号在命令行模式下直接输入set number即可显示行号,退出以后再次打开vim编辑器依然没有行号。2>永久显示行号使用命令 sudo vim /etc/vim/vimrc,创建一个文件,写入set number保存退出即可三、vim命令使用1.dd删除某行2.yy复制某行3.p在某处粘贴4.1,7co7将1到7行复制到第7行后(8行)5.1,7de删除第一

2021-03-17 16:59:31 261

原创 内核数据结构

内容参考摘录自 《Linux内核设计与实现 第三版》Linux内核实现了一些通用数据结构,且提倡开发时重用。一、链表链表是Linux内核中最简单、最普通的数据结构。链表是一种存放和操作都可变数量元素的数据结构。链表和静态数组的不同之处在于,它所包含的元素都是动态创建并插入链表的,在编译时不必知道具体需要创建多少个元素。1Linux内核中实现链表代码在头文件<linux/list.h>中声明//双向链表struct dl_list { struct dl_list *next;

2021-03-03 17:55:03 293 1

原创 系统调用

概念在操作系统中内核提供了用户进程与内核进行交互的一组接口。这些接口让应用程序受限的访问硬件设备,提供了创建新进程并与已有进程进行通信的机制,也提供了申请操作系统其它资源的能力。这些接口在应用程序和内核之间扮演了角色,应用程序发出各种请求,...

2021-03-03 15:07:38 432 1

原创 抢占和上下文切换

一、上下文切换上下文切换,也就是从一个可执行进程切换到另一个可执行进程,由函数context_switch()函数负责处理。每当一个新的进程被选择出来准备投入运行的时候,schedule()就会调用该函数。完成两项基本工作。**·**调用switch_mm(),把虚拟内存从一个进程映射切换到新进程中· 调用switch_to(),从上一个进程的处理器状态切换到新进程的处理器状态。<包括保存、恢复栈信息和寄存器信息>因为内核必须知道在什么时候调用schedule()。如果仅靠用户程序代码

2021-02-24 16:40:55 161

原创 进程调度的实现

内容参考摘录自 《Linux内核设计与实现 第三版》CFS调度实现的相关代码位于/kernel/sched/fair.c中,接下来重点关注4个部分时间记账进程选择调度器入口睡眠和唤醒一、时间记账所有的调度都必须对进程运行做时间记账。当每次系统时钟节拍发生时,时间片都会被减少一个节拍周期。当一个进程的时间片被减少到0时,它就会被另一个尚未减到0的时间片可运行进程抢占。1.调度器实体结构CFS不再有时间片的概念,但是它也必须维护每个进程运行的时间记账,因为它需要确保每个进程只在公平分配给

2021-02-24 14:17:04 532

原创 希尔排序

#include <stdio.h>void sort(int a[],int n){ int i,j,increment,temp; increment = n/2;//增量 while(increment >= 1) { for(i=increment;i<n;i++) { temp = a [i]; j =i-increment; while(j>=0 && temp < a[j])//分组进行直排 {

2021-02-22 15:50:55 89

原创 直插排序——C语言

#include <stdio.h>//直插排序,左边依次变为有序排序void direct_insertion_sort(int value[],int low,int high){ int i,j,temp; for(i = 0;i< high; i++) { j = i; temp = value[j]; while(j > 0 && value[j] < value[j - 1]) { value[j] = value

2021-02-22 10:55:18 110

原创 快排——C语言

#include<stdio.h>void sort(int a[],int low,int high){ int left = low; int right = high; int key = a[left]; if(left > right ) return ; while(left < right) { //从右往左找比Key小的值 while(left < right && a[right] >= key)

2021-02-22 10:17:34 108

原创 进程调度——Linux

【摘录自Linux内核设计】进程调度程序进程调度程序负责决定将那个程序投入运行,何时运行以及运行多长时间。进程调度程序可看做在可运行状态进程之间分配有限的处理器时间资源的内核子系统。调度程序没有太复杂的原理。最大限度的利用处理器时间的原则是,只要有可以执行的进程,那么就总会有进程正在执行。但是只要系统中可运行的进程数目比处理器个数多,就注定某一时刻就会有一些进程不能执行。这些进程在等待运行。在一组处于可运行态的进程中选择一个来执行,是调度程序所需完成的基本工作。一、多任务1.多任务操作系统多任务操

2021-02-02 16:17:55 240

原创 分支优化选择——likely()、unlikely()

分支优化选择对于条件选择语句,gcc内建了一条指令用于优化,在一个条件经常出现,或者该条件很少出现的时候,编译器可以根据这条指令对条件分支选择进行优化。内核把这条指令封装成了宏,比如likely()和unlikely()。使用示例:先存在如下条件选择语句:if(error){ .....}如果这个标记大多数为0,可以使用unlikely(error)if(unlikely(error)){ ......}如果,分支条件大多数为满足时,可以使用likely(success)if(l

2021-01-29 17:18:11 348

原创 什么是内核——linux内核解析

【本文内容参考自Linux内核设计与实现,仅作笔记】一、内核介绍1.什么是内核 用户操作的界面是操作系统的外在表象,内核才是操作系统的内在核心。系统其它部分必须依靠内核这部分软件提供的服务,像管理硬件设备、分配系统资源等。 通常内核由负责响应中断服务程序、负责管理多个进程从而分享处理时间的调度程序、负责管理进程地址空间的内存管理程序和网络、进程间通信等系统服务程序共同组成。 对于提供保护机制的现代系统来说,内核独立于普通应用程序,它一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限

2021-01-29 16:30:11 2953

转载 中断不能睡眠的原因

转载地址原文地址这个说起来有点多,一一来看:1,中断要根据前后文来说,一般说中断上下文中不能睡眠,这个中断是指硬件事件发生,触发CPU停止当前活动转而去处理硬件请求.2,根据硬件请求响应处理逻辑的实时紧要与否,将整个中断处理过程分为上半部和下半部.3,上半部也就是所谓的硬中断处理逻辑,其要求cpu在收到硬件请求后必须马上处理的事情,比如网卡收到数据包了,把数据包从网卡缓存拷贝到主存(可以由DMA完成,但寄存器的修改以及资源设定还是要由cpu去做)的逻辑就需要cpu立即去做,不做的话,网络新来的数据包

2021-01-27 12:04:40 736

原创 Linux下串口的配置

一、串口属性(标题一部分内容摘录自原文地址)1.termios结构体串口属于终端设备,其接口属性用termios结构体来描述struct termios { tcflag_t c_cflag/* 控制标志*/ tcflag_t c_iflag;/* 输入标志*/ tcflag_t c_oflag;/* 输出标志*/ tcflag_t c_lflag;/* 本地标志*/ tcflag_t c_cc[NCCS];/* 控制字符*/};1>c_

2021-01-26 17:24:34 2228

原创 串口通信——mcu单片机

一、通信概念计算机通信指计算机与外部设备或计算机与计算机之间的信息交换。通信分为并行通信和串行通信两种方式。1.并行通信并行通信通常是将数据字节的各位用多条数据线同时并行传输。并行通信:a.控制简单 b.传输速度快 缺点:传输线多,长距离成本高。2.串行通信串行通信是指用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。特点:传输线少,长距离传输成本低,数据的传送控制比并行复杂...

2021-01-25 17:31:01 2504

原创 数码管显示原理——MCU51

以8段数码管为例一、数码管概念根据内部的连接进行分类,可以分为共阴极和共阳极。8段数码管内部有8颗LED组成,控制相应的LED亮起,其他熄灭就可以显示出想要的字形。如下图所示,第二幅图是共阴极,第三幅是共阳极。第一幅图中是共阴极,接GND。原理图点亮第一个数码管显示2#include <reg52.h>#include <intrins.h>sbit WEI = P2^7; //数码管位选sbit DU = P2^6; //数码管段选int main()

2021-01-24 18:18:04 3139

原创 Keil5新建工程项目

1.新建project项目建立完成2.往project中添加.c文件1-点File | 2-点击New3.添加一个自定义的.h文件按下图选择结束后,点击OK退出即可最后点击保存,编译,就可以看到头文件出现到此,基本的工程建立结束...

2021-01-18 13:51:37 4209 2

原创 文件IO

一、文件IO概念Linux一个非常重要的概念,一切皆文件(everything in Linux is file)1.文件的概念a.文件分类 7种{- 普通文件d 目录文件I 符号文件 只保留所指向文件的地址而非文件本身p 管道文件c 字符设备 原始的I/O设备文件,每次操作仅操作1个字符(例如键盘)b 块设备 按块I/O设备文件(例如硬盘)s 套接字}b.文件描述符{1>文件描述符是文件IO操作的对象2>文件描述符是一个**非负整数**,内核以此来标识一

2021-01-14 15:36:48 110

原创 标准IO

一、标准I/O概念标准IO是一个标准函数包和stdio.h头文件中定义的,不依赖于系统内核,所以移植性强。1.流的概念在c语言中所有的IO操作只是简单的从程序移进或移出字节的工作(可以将数据的输出和输入看作是数据的流入和流出),这中字节流被称为流(stream)。2.FILE对象文件IO函数的操作都是依赖文件描述符,打开一个文件时,就返回一个文件描述符,然后该文件描述符用于后续相关的IO操作。标准IO库的操作依赖于流(stream)进行。打开一个文件就会创建一个FILE对象,此对象是一个结构体。

2021-01-14 13:55:57 962

原创 进程相关概念知识

一、进程的定义进程是操作系统的概念,每当执行一个程序时,对于操作系统来讲就创建了一个进程。可以认为进程是一个程序的一次执行过程,这个过程中伴随着资源的分配和释放。1.进程和程序的区别1>程序是静态的,它是一些保存在磁盘上的指令的有序集合,没有所谓的执行概念。2>进程是一个动态的概念,它是程序执行的过程,包括创建、调度和消亡。在这个过程中伴随着资源的分配和释放。【注】进程是资源分配管理的最小单位,进程结束时所有的资源都会被系统自动回收。2.进程的内存分配Linux操作系统采用虚拟内

2021-01-13 18:26:06 331

原创 Linux下6种进程通信方式

linux下提供了6种进程间通信方式:信号、管道、消息队列、共享内存、套接字、信号量一、共享内存的实现共享内存的实现二、套接字套接字实现进程间通信三、消息队列四、管道

2021-01-13 16:11:05 227

原创 管道——进程间通信

一、概念1.管道是什么?管道是一种特殊的文件,它不属于某一种文件系统,而是一种独立的文件系统,是只存在于内存中的文件,本质是内核的一块缓冲。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。【注】管道是单向的、先进先出的、无结构的、固定大小字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。二、无名管道1.概念知识总结1>无名管道只能用于具有亲缘关系的进程之间的通信,通常一个管道由一个进程创建,然后实现两个进程间的通信时必须通过**fork**创建子进

2021-01-13 16:06:47 617

原创 消息队列——进程间通信方式

一、概念消息队列是由存放在内核中由消息组成的链表,由IPC id标识。用户可以在消息队列中添加和读取消息。特点:1.消息队列提供的是一种带有数据标识的特殊管道,因此可以选择性的读取信息;2.如果消息队列中有多条类型一样的消息,接收的时候只能按照先后顺序接收(队列特点);3.如果你接收的消息类型不存在,接收会阻塞。1.创建IPC键值创建IPC之前必须获取一个未使用的IPC键值(key);#include<sys/types.h>#include<sys/ipc.h>

2021-01-12 18:03:30 412

原创 信号量——pv操作

一、信号量概念信号量是用来解决进程/线程之间的同步互斥问题的一种通信机制,它表示代表某一类资源。1.信号量的类型a.无名信号量:无名信号量只能存在于内存中,要求使用信号量的进程必须能访问信号量所在的这一块内存,所以无名信号量只能应用在同一进程间的线程或者共享内存间的进程。b.有名信号量:用于进程(线程)间同步互斥1>有名信号量必须指定一个相关联的文件名称,名称通常是文件系统中的某个文件,无名信号量不需要指定2>有名信号量既可以用于线程间的同步,也可以用于进程间的同步;无名信号量通过s

2021-01-12 15:06:02 8616 1

原创 IIC工作原理——MCU单片机

一、常用的串行总线协议目前常用的微机与外设之间进行数据传输的串行总线主要有UART、1-write、I2C和SPI总线。1.UART:异步方式进行通信(一条数据输入线、一条数据输出线)。2.1-write:单线总线,又称为单总线(只有一条数据输出线)。3.I2C:同步串行2线方式(一条时总线,一条数据线)。4.SPI:同步串行3线方式通信(一条时钟线,一条数据输入线,一条数据输出线)。【注】I2C总线是phlips公司推出的一种串行总线,它只有两根双向信号线,一根数据线SDA(serial da

2021-01-11 23:04:30 867

原创 make menuconfig错误——make[2]: *** [scripts/kconfig/lexer.lex.c] 错误 127

下载linux内核编译报如下错误分析:相关文件缺失,下载既可sudo apt-get install bisonsudo apt-get install flex下载更新后编译可进入菜单栏配置界面:

2021-01-11 12:14:58 5091 2

原创 c语言实现两个大数相乘

实现两个不限位数十进制整数的乘法函数,demon#include<stdio.h>#include<string.h>int main(){ int i,j,z,k; int f_m1,f_m2,f_k; int carry; int result_int_len; int x_len,y_len; int x[101], y[101]; char multiplier_x[101]; char multiplier_y[101]; char resul

2021-01-07 17:15:10 2241

原创 next_permutation算法——c++

next_permutation算法:将区间内容转换为下一种排列方式,对于字符串,排列按照字母递增的顺序进行程序示例,对输入的字母进行排序#include<iostream>#include<string>#include<algorithm>int main(){ using namespace std; string letters; cout << "Enter the letter grouping (quit to quit):

2021-01-06 15:11:36 98

原创 函数对象——c++

一、函数符概念1.生成器(generator)是不用参数就可以调用的函数符。2.一元函数(unary function)是用一个参数可以调用的函数符。3.二元函数(binary function)是用两个参数可以调用的函数符。4.返回bool值的一元函数是谓词(predicate) 返回bool值的二元函数是二元谓词(binary predicate)。demon#include<iostream>#include<list>#include<iterat

2021-01-06 14:21:29 68

原创 make解析Makefile的过程

一、make的执行过程第一阶段:读取所有的makefile文件(包括“MAKEFILES”变量指定的、指示符“include”指定的、以及命令行选项“-f(–file)”指定的makefile文件),内建所有的变量、明确规则和隐含规则,并建立所有目标和依赖之间的依赖关系结构链表。第二阶段:根据第一阶段已经建立的依赖关系结构链表决定哪些目标需要更新,并使用对应的规则来重新建这些目标。【注】在make执行的第一阶段中如果变量和函数被展开,那么称此展开是“立即”的,此时所有的变量和函数被展开在需要构建的结

2021-01-05 15:55:57 655

原创 关联容器——c++

关联容器关联容器将值与键关联在一起,并使用键来查找值。关联容器的优点在于,它提供了对元素的快速访问。1.关联容器允许插入新元素,但不能指定元素插入的位置。2.关联容器使用某种树实现的。STL(标准模板库)提供了四种关联容器:set、multiset、map和multimap一、set关联容器demon#include<iostream>#include<string>#include<set>#include<algorithm>#inc

2021-01-04 17:56:13 97

原创 list容器——c++

list模板1.list模板表示双向链表,除了第一个和最后一个元素外,每个元素都与前后的元素相连接,这意味着可以双向遍历链表2.list是可反转容器3.list容器不支持数组表示法和随机访问一、list成员函数1.void merage(list<T,Alloc> & x)//将链表x与调用链表合并,两个链表必须已经排序。合并后的经过排序的链表保存在调用链表中,x为空。2.void remove(const T & val)//从链表中删除所有的val。3

2021-01-04 15:46:05 66

原创 vectore类——c++

一、模板类vectore类创建:创建vector模板对象,可使用通常的<type>表示法来指出要使用的类型。另外,vector模板使用**动态内存分配**,因此,初始化时可以指出需要的矢量值#include<vector> //头文件//初始化vector<int> number(10); //这个vector类存储10个int类型vector<double> scores(9);//存储9个double//访问number[0] = 1;

2021-01-04 11:44:06 203

原创 c++——类型转换符

c++包含4个类型转换运算符:`dynamic_cast、const_cast、static_cast、reinterpret_cast`一、dynamic_cast:dynamic_cast函数讲解二、const_castconst_cast运算符用于执行只有一种用途的类型转换,即改变值为const或volatile,const_cast<type-name> (expression)class A{ ...};class B{ ...};B pb;const

2020-12-25 11:35:19 202

原创 c++——dynamic_cast < type-id > ( expression)函数用法

一、dynamic_cast运算符dynamic_cast运算符是最常用的RTTI的组件,它不能回答“指针指向的是那类对象”这样的问题,但能够回答“是否可以安全地将对象的地址赋给特定类型的指针”这样的问题。class A {...};class B :public A {...};class C :public B {...};B *p = dynamoc_cast<B *>(q);//上述语句描述了指针q的类型是否可以安全的被转换为B*?如果可以,运算符将返回对象q的地址,否则

2020-12-24 11:37:08 217

原创 c++——异常相关操作

一、abort函数abort:向标准错误流发送消息abnormal program termination(程序异常终止),然后终止程序。调用abort函数实现异常终止的demon#include<iostream>#include<cstdlib>double average(double a,double b);int main(){ double x,y,z; std::cout << "输入俩个数字:"; while (std::cin &

2020-12-23 11:32:50 179

原创 c++——类的嵌套

c++类的嵌套模板1.作用域 如果一个嵌套类在另一个类的私有部分声明的,嵌套类对于这个类是可见的,对于外界是不可见的。 如果一个嵌套类在另一个类的公有部分声明的,则允许在这个类和外界使用这个嵌套类。2.访问权限 嵌套类的私有部分不允许在声明嵌套类中的这个类访问queuetp.h类的初始#ifndef _QUEUETP_H_#define _QUEUETP_H_#include <iostream>using std::string;using std::cin;us

2020-12-22 17:11:21 4293

原创 c++——友元类

代码摘自c++primer plus【注】:友元类的声明的声明可以调用另一个类的私有成员tv.h头文件初始化类的声明#ifndef _TV_H_#define _TV_H_class Tv{private: int state; //开关机状态 int volume; //音量 int maxchannel;//最大频道数 int channel; //频道数 int mode; //广播或有线电视 int input; //public:

2020-12-21 18:30:04 285

原创 Makefile——基础(一)

一、Makefile的基本规则1.target:规则的目标,通常是要生成的文件名或者是为了实现这个目标而必须的中间过程文件名2.command:规则的命令行,是规则所要执行的动作(包含shell命令和在shell下可执行的程序),限定了make执行时所需要的动作【注】clean就是一个command二、demonhello:main.o printf_hello.o printf_world.o cc -o hello main.o printf_hello.o printf_world.om

2020-12-18 14:00:06 159

数据库插入速度提升的demon

此程序demon验证了sqlit3数据插入速度的提升方法,使用事务操作大幅度提升了数据插入的效率,可以下载参考,程序可以编译运行,gcc -sqlite_master.c -lsqlite3

2020-08-26

空空如也

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

TA关注的人

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