<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[afootball的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/afootball</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; afootball]]></copyright><item><title><![CDATA[内核模块——构造与运行模块]]></title><link>https://blog.csdn.net/afootball/article/details/122144545</link><guid>https://blog.csdn.net/afootball/article/details/122144545</guid><author>afootball</author><pubDate>Sat, 25 Dec 2021 17:14:46 +0800</pubDate><description><![CDATA[一、helloword模块示例
1.第一个模块，hello-world模块
源程序
#include &lt;linux/init.h&gt;
#include &lt;linux/module.h&gt;

MODULE_LICENSE("DUAL BSD/GPL");

static int hello_init(void)
{
	printk(KERN_ALERT"hello, world\n");
	return 0;
}

static void hello_exit(void)
{
	print]]></description><category></category></item><item><title><![CDATA[rpm包制作过程]]></title><link>https://blog.csdn.net/afootball/article/details/115282015</link><guid>https://blog.csdn.net/afootball/article/details/115282015</guid><author>afootball</author><pubDate>Sun, 28 Mar 2021 17:26:11 +0800</pubDate><description><![CDATA[一、打包rpm包所需安装工具
1.yum install rpm-build
2.yum install rpmdevtools

二、制作过程
1.创建rpmbuild文件夹
rpmdev-setuptree

实际操作截图

2.打包源码程序到/rpmbuild/SOURCS下
1&gt; 编写一个hello.c的源码
#include&lt;stdio.h&gt;

int main()
{
	printf("hello woeld! My first rpm!\n");
	return 0;
}

]]></description><category></category></item><item><title><![CDATA[vim编辑器的使用]]></title><link>https://blog.csdn.net/afootball/article/details/114936441</link><guid>https://blog.csdn.net/afootball/article/details/114936441</guid><author>afootball</author><pubDate>Wed, 17 Mar 2021 16:59:31 +0800</pubDate><description><![CDATA[一、下载安装
sudo  apt install vim


二、编辑器调试
1.显示行号

1&gt;临时显示行号
在命令行模式下直接输入set number即可显示行号，退出以后再次打开vim编辑器依然没有行号。

2&gt;永久显示行号
使用命令  sudo vim /etc/vim/vimrc，创建一个文件，写入set number保存退出即可



三、vim命令使用
1.dd删除某行
2.yy复制某行
3.p在某处粘贴
4.1，7co7将1到7行复制到第7行后（8行）


5.1，7de删除第一]]></description><category></category></item><item><title><![CDATA[内核数据结构]]></title><link>https://blog.csdn.net/afootball/article/details/114316650</link><guid>https://blog.csdn.net/afootball/article/details/114316650</guid><author>afootball</author><pubDate>Wed, 03 Mar 2021 17:55:03 +0800</pubDate><description><![CDATA[内容参考摘录自 《Linux内核设计与实现 第三版》
Linux内核实现了一些通用数据结构，且提倡开发时重用。
一、链表
链表是Linux内核中最简单、最普通的数据结构。链表是一种存放和操作都可变数量元素的数据结构。链表和静态数组的不同之处在于，它所包含的元素都是动态创建并插入链表的，在编译时不必知道具体需要创建多少个元素。
1Linux内核中实现
链表代码在头文件&lt;linux/list.h&gt;中声明
//双向链表
struct dl_list {
	struct dl_list *next;
	]]></description><category></category></item><item><title><![CDATA[系统调用]]></title><link>https://blog.csdn.net/afootball/article/details/114083379</link><guid>https://blog.csdn.net/afootball/article/details/114083379</guid><author>afootball</author><pubDate>Wed, 03 Mar 2021 15:07:38 +0800</pubDate><description><![CDATA[概念
在操作系统中内核提供了用户进程与内核进行交互的一组接口。这些接口让应用程序受限的访问硬件设备，提供了创建新进程并与已有进程进行通信的机制，也提供了申请操作系统其它资源的能力。这些接口在应用程序和内核之间扮演了角色，应用程序发出各种请求，

...]]></description><category></category></item><item><title><![CDATA[抢占和上下文切换]]></title><link>https://blog.csdn.net/afootball/article/details/114022234</link><guid>https://blog.csdn.net/afootball/article/details/114022234</guid><author>afootball</author><pubDate>Wed, 24 Feb 2021 16:40:55 +0800</pubDate><description><![CDATA[一、上下文切换
上下文切换，也就是从一个可执行进程切换到另一个可执行进程，由函数context_switch()函数负责处理。每当一个新的进程被选择出来准备投入运行的时候，schedule()就会调用该函数。完成两项基本工作。

**·**调用switch_mm(),把虚拟内存从一个进程映射切换到新进程中
· 调用switch_to()，从上一个进程的处理器状态切换到新进程的处理器状态。&lt;包括保存、恢复栈信息和寄存器信息&gt;
因为内核必须知道在什么时候调用schedule()。如果仅靠用户程序代码]]></description><category></category></item><item><title><![CDATA[进程调度的实现]]></title><link>https://blog.csdn.net/afootball/article/details/113868583</link><guid>https://blog.csdn.net/afootball/article/details/113868583</guid><author>afootball</author><pubDate>Wed, 24 Feb 2021 14:17:04 +0800</pubDate><description><![CDATA[内容参考摘录自 《Linux内核设计与实现 第三版》
CFS调度实现的相关代码位于/kernel/sched/fair.c中，接下来重点关注4个部分


时间记账
进程选择
调度器入口
睡眠和唤醒

一、时间记账
所有的调度都必须对进程运行做时间记账。当每次系统时钟节拍发生时，时间片都会被减少一个节拍周期。当一个进程的时间片被减少到0时，它就会被另一个尚未减到0的时间片可运行进程抢占。
1.调度器实体结构
CFS不再有时间片的概念，但是它也必须维护每个进程运行的时间记账，因为它需要确保每个进程只在公平分配给]]></description><category></category></item><item><title><![CDATA[希尔排序]]></title><link>https://blog.csdn.net/afootball/article/details/113941028</link><guid>https://blog.csdn.net/afootball/article/details/113941028</guid><author>afootball</author><pubDate>Mon, 22 Feb 2021 15:50:55 +0800</pubDate><description><![CDATA[#include &lt;stdio.h&gt;

void sort(int a[],int n)
{
	int i,j,increment,temp;
	increment = n/2;//增量

	while(increment &gt;= 1)
	{
		for(i=increment;i&lt;n;i++)
		{
			temp = a [i];
			j =i-increment;
			while(j&gt;=0 &amp;&amp; temp &lt; a[j])//分组进行直排
			{]]></description><category></category></item><item><title><![CDATA[直插排序——C语言]]></title><link>https://blog.csdn.net/afootball/article/details/113931878</link><guid>https://blog.csdn.net/afootball/article/details/113931878</guid><author>afootball</author><pubDate>Mon, 22 Feb 2021 10:55:18 +0800</pubDate><description><![CDATA[#include &lt;stdio.h&gt;

//直插排序，左边依次变为有序排序
void direct_insertion_sort(int value[],int low,int high)
{
	int i,j,temp;
	for(i = 0;i&lt; high; i++)
	{
		j = i;
		temp = value[j];
		while(j &gt; 0 &amp;&amp; value[j] &lt; value[j - 1])
		{
			value[j] = value]]></description><category></category></item><item><title><![CDATA[快排——C语言]]></title><link>https://blog.csdn.net/afootball/article/details/113930331</link><guid>https://blog.csdn.net/afootball/article/details/113930331</guid><author>afootball</author><pubDate>Mon, 22 Feb 2021 10:17:34 +0800</pubDate><description><![CDATA[#include&lt;stdio.h&gt;

void sort(int a[],int low,int high)
{
	int left = low;
	int right = high;
	int key = a[left];

	if(left &gt; right )
		return ;
	
	while(left &lt; right)
	{
		//从右往左找比Key小的值
		while(left &lt; right &amp;&amp; a[right] &gt;= key)
		]]></description><category></category></item><item><title><![CDATA[进程调度——Linux]]></title><link>https://blog.csdn.net/afootball/article/details/113553791</link><guid>https://blog.csdn.net/afootball/article/details/113553791</guid><author>afootball</author><pubDate>Tue, 02 Feb 2021 16:17:55 +0800</pubDate><description><![CDATA[【摘录自Linux内核设计】
进程调度程序
进程调度程序负责决定将那个程序投入运行，何时运行以及运行多长时间。进程调度程序可看做在可运行状态进程之间分配有限的处理器时间资源的内核子系统。调度程序没有太复杂的原理。最大限度的利用处理器时间的原则是，只要有可以执行的进程，那么就总会有进程正在执行。但是只要系统中可运行的进程数目比处理器个数多，就注定某一时刻就会有一些进程不能执行。这些进程在等待运行。在一组处于可运行态的进程中选择一个来执行，是调度程序所需完成的基本工作。
一、多任务
1.多任务操作系统
多任务操]]></description><category></category></item><item><title><![CDATA[分支优化选择——likely()、unlikely()]]></title><link>https://blog.csdn.net/afootball/article/details/113398585</link><guid>https://blog.csdn.net/afootball/article/details/113398585</guid><author>afootball</author><pubDate>Fri, 29 Jan 2021 17:18:11 +0800</pubDate><description><![CDATA[分支优化选择
对于条件选择语句，gcc内建了一条指令用于优化，在一个条件经常出现，或者该条件很少出现的时候，编译器可以根据这条指令对条件分支选择进行优化。内核把这条指令封装成了宏，比如likely()和unlikely()。
使用示例：
先存在如下条件选择语句：
if(error){
	.....
}

如果这个标记大多数为0，可以使用unlikely(error)
if(unlikely(error)){
	......
}

如果，分支条件大多数为满足时，可以使用likely（success）
if(l]]></description><category></category></item><item><title><![CDATA[什么是内核——linux内核解析]]></title><link>https://blog.csdn.net/afootball/article/details/113385400</link><guid>https://blog.csdn.net/afootball/article/details/113385400</guid><author>afootball</author><pubDate>Fri, 29 Jan 2021 16:30:11 +0800</pubDate><description><![CDATA[【本文内容参考自Linux内核设计与实现，仅作笔记】
一、内核介绍
1.什么是内核
	用户操作的界面是操作系统的外在表象，内核才是操作系统的内在核心。系统其它部分
必须依靠内核这部分软件提供的服务，像管理硬件设备、分配系统资源等。
	通常内核由负责响应中断服务程序、负责管理多个进程从而分享处理时间的调度程序、
负责管理进程地址空间的内存管理程序和网络、进程间通信等系统服务程序共同组成。
	对于提供保护机制的现代系统来说，内核独立于普通应用程序，它一般处于系统态，
拥有受保护的内存空间和访问硬件设备的所有权限]]></description><category></category></item><item><title><![CDATA[中断不能睡眠的原因]]></title><link>https://blog.csdn.net/afootball/article/details/113245438</link><guid>https://blog.csdn.net/afootball/article/details/113245438</guid><author>afootball</author><pubDate>Wed, 27 Jan 2021 12:04:40 +0800</pubDate><description><![CDATA[转载地址原文地址
这个说起来有点多,一一来看:
1,中断要根据前后文来说,一般说中断上下文中不能睡眠,这个中断是指硬件事件发生,触发CPU停止当前活动转而去处理硬件请求.
2,根据硬件请求响应处理逻辑的实时紧要与否,将整个中断处理过程分为上半部和下半部.
3,上半部也就是所谓的硬中断处理逻辑,其要求cpu在收到硬件请求后必须马上处理的事情,比如网卡收到数据包了,把数据包从网卡缓存拷贝到主存(可以由DMA完成,但寄存器的修改以及资源设定还是要由cpu去做)的逻辑就需要cpu立即去做,不做的话,网络新来的数据包]]></description><category></category></item><item><title><![CDATA[Linux下串口的配置]]></title><link>https://blog.csdn.net/afootball/article/details/113178234</link><guid>https://blog.csdn.net/afootball/article/details/113178234</guid><author>afootball</author><pubDate>Tue, 26 Jan 2021 17:24:34 +0800</pubDate><description><![CDATA[一、串口属性
（标题一部分内容摘录自原文地址）
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&gt;c_]]></description><category></category></item><item><title><![CDATA[串口通信——mcu单片机]]></title><link>https://blog.csdn.net/afootball/article/details/112655244</link><guid>https://blog.csdn.net/afootball/article/details/112655244</guid><author>afootball</author><pubDate>Mon, 25 Jan 2021 17:31:01 +0800</pubDate><description><![CDATA[一、通信概念

计算机通信指计算机与外部设备或计算机与计算机之间的信息交换。
通信分为并行通信和串行通信两种方式。

1.并行通信
并行通信通常是将数据字节的各位用多条数据线同时并行传输。
并行通信：a.控制简单 b.传输速度快     缺点：传输线多，长距离成本高。

2.串行通信
串行通信是指用一条数据线，将数据一位一位地依次传输，每一位数据占据一个固定的时间长度。
特点：传输线少，长距离传输成本低，数据的传送控制比并行复杂

...]]></description><category></category></item><item><title><![CDATA[数码管显示原理——MCU51]]></title><link>https://blog.csdn.net/afootball/article/details/113062047</link><guid>https://blog.csdn.net/afootball/article/details/113062047</guid><author>afootball</author><pubDate>Sun, 24 Jan 2021 18:18:04 +0800</pubDate><description><![CDATA[以8段数码管为例
一、数码管概念
根据内部的连接进行分类，可以分为共阴极和共阳极。8段数码管内部有8颗LED组成，控制相应的LED亮起，其他熄灭就可以显示出想要的字形。如下图所示，第二幅图是共阴极，第三幅是共阳极。第一幅图中是共阴极，接GND。

原理图

点亮第一个数码管显示2
#include &lt;reg52.h&gt;
#include &lt;intrins.h&gt;

sbit WEI = P2^7; //数码管位选
sbit DU = P2^6;  //数码管段选

int main()
]]></description><category></category></item><item><title><![CDATA[Keil5新建工程项目]]></title><link>https://blog.csdn.net/afootball/article/details/112775306</link><guid>https://blog.csdn.net/afootball/article/details/112775306</guid><author>afootball</author><pubDate>Mon, 18 Jan 2021 13:51:37 +0800</pubDate><description><![CDATA[1.新建project





项目建立完成

2.往project中添加.c文件
1-点File | 2-点击New




3.添加一个自定义的.h文件


按下图选择结束后，点击OK退出即可

最后点击保存，编译，就可以看到头文件出现

到此，基本的工程建立结束

...]]></description><category></category></item><item><title><![CDATA[文件IO]]></title><link>https://blog.csdn.net/afootball/article/details/112605815</link><guid>https://blog.csdn.net/afootball/article/details/112605815</guid><author>afootball</author><pubDate>Thu, 14 Jan 2021 15:36:48 +0800</pubDate><description><![CDATA[一、文件IO概念
Linux一个非常重要的概念，一切皆文件（everything in Linux is file）
1.文件的概念
a.文件分类 7种
{
- 普通文件
d 目录文件
I 符号文件 只保留所指向文件的地址而非文件本身
p 管道文件
c 字符设备 原始的I/O设备文件，每次操作仅操作1个字符（例如键盘）
b 块设备   按块I/O设备文件（例如硬盘）
s 套接字
}


b.文件描述符
{
1&gt;文件描述符是文件IO操作的对象
2&gt;文件描述符是一个**非负整数**，内核以此来标识一]]></description><category></category></item><item><title><![CDATA[标准IO]]></title><link>https://blog.csdn.net/afootball/article/details/112602308</link><guid>https://blog.csdn.net/afootball/article/details/112602308</guid><author>afootball</author><pubDate>Thu, 14 Jan 2021 13:55:57 +0800</pubDate><description><![CDATA[一、标准I/O概念
标准IO是一个标准函数包和stdio.h头文件中定义的，不依赖于系统内核，所以移植性强。
1.流的概念
在c语言中所有的IO操作只是简单的从程序移进或移出字节的工作（可以将数据的输出和输入看作是数据的流入和流出），这中字节流被称为流（stream）。
2.FILE对象
文件IO函数的操作都是依赖文件描述符，打开一个文件时，就返回一个文件描述符，然后该文件描述符用于后续相关的IO操作。标准IO库的操作依赖于流（stream）进行。打开一个文件就会创建一个FILE对象，此对象是一个结构体。
]]></description><category></category></item></channel></rss>