<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[从零开始]]></title><description><![CDATA[Inch by Inch & Day by Day]]></description><link>https://blog.youkuaiyun.com/CheerMoon2009</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; CheerMoon2009]]></copyright><item><title><![CDATA[tslib编译及使用方法]]></title><link>https://blog.youkuaiyun.com/CheerMoon2009/article/details/41144499</link><guid>https://blog.youkuaiyun.com/CheerMoon2009/article/details/41144499</guid><author>CheerMoon2009</author><pubDate>Sat, 15 Nov 2014 11:50:48 +0800</pubDate><description><![CDATA[1.      在编译tslib之前请先确认下面的软件是否安装
sudo apt-getinstall autoconf
sudo apt-getinstall automake
sudo apt-get install libtool
 
2.      编译：
tar xzftslib-1.4.tar.gz 
cd tslib
./autogen.sh 
mkdir tmp]]></description><category></category></item><item><title><![CDATA[Linux设备驱动程序学习笔记14：中断的初始化流程]]></title><link>https://blog.youkuaiyun.com/CheerMoon2009/article/details/41073721</link><guid>https://blog.youkuaiyun.com/CheerMoon2009/article/details/41073721</guid><author>CheerMoon2009</author><pubDate>Thu, 13 Nov 2014 09:19:37 +0800</pubDate><description><![CDATA[init是Linux内核启动的第一个用户级进程，系统的很多初始化工作都是由它开始的，当然也包括中断的初始化工作。其主要函数在init/main.c中，汇编程序会跳到该文件的start_kernel函数执行，我们就由这个函数开始分析Linux中断初始化相关的主要流程。
asmlinkage void __init start_kernel(void)
{    … …
    setup_arch]]></description><category></category></item><item><title><![CDATA[创建简单的samba服务器]]></title><link>https://blog.youkuaiyun.com/CheerMoon2009/article/details/41046249</link><guid>https://blog.youkuaiyun.com/CheerMoon2009/article/details/41046249</guid><author>CheerMoon2009</author><pubDate>Wed, 12 Nov 2014 16:48:16 +0800</pubDate><description><![CDATA[Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件，由服务器及客户端程序构成。
创建简单的samba服务器
1. 在Linux中安装samba软件，试验环境为Ubuntu：
sudo apt-get install samba
2.增加新的samba用户
sudo smbpasswd -a name【增加samba用户】
还有一些其它常用的用户操作选项：
sudo ]]></description><category></category></item><item><title><![CDATA[Linux设备驱动程序学习笔记13：中断的注册流程]]></title><link>https://blog.youkuaiyun.com/CheerMoon2009/article/details/40743493</link><guid>https://blog.youkuaiyun.com/CheerMoon2009/article/details/40743493</guid><author>CheerMoon2009</author><pubDate>Mon, 03 Nov 2014 17:08:10 +0800</pubDate><description><![CDATA[在中断的调用流程中讲到Linux中对中断的处理最终会调用到在驱动程序中注册的中断处理函数。中断处理函数(interrupt handle /  interruptservice routine)是设备驱动程序的一部分，内核通过它来回应特定的中断。中断处理函数同普通的函数并无太大的区别，但由于它是运行在中断上下文(interrupt context)中的，所以他不能休眠和引起阻塞。
中断处理函数的]]></description><category></category></item><item><title><![CDATA[Linux设备驱动程序学习笔记12：中断调用流程]]></title><link>https://blog.youkuaiyun.com/CheerMoon2009/article/details/39639201</link><guid>https://blog.youkuaiyun.com/CheerMoon2009/article/details/39639201</guid><author>CheerMoon2009</author><pubDate>Sun, 28 Sep 2014 11:44:58 +0800</pubDate><description><![CDATA[通过轮询的方式去查询各个硬件的状态显得有的低效，一种更好的机制是当硬件状态准备好之后能够主动地报告给CPU。中断就是这样的一种机制，它允许硬件发信号给CPU。
下面就先分析一下当一个中断发生时，Linux系统的处理流程。
首CPU在收到中断线上的中断信号后，会跳到某个固定的地址去执行代码，这个地址被称为中断向量。这部分代码是同体系结构相关，主要是汇编代码，其中的主要工作有保存中断现场，切换到中]]></description><category></category></item><item><title><![CDATA[Linux设备驱动程序学习笔记11：输入设备子系统]]></title><link>https://blog.youkuaiyun.com/CheerMoon2009/article/details/39524675</link><guid>https://blog.youkuaiyun.com/CheerMoon2009/article/details/39524675</guid><author>CheerMoon2009</author><pubDate>Wed, 24 Sep 2014 16:16:48 +0800</pubDate><description><![CDATA[各种不同的输入设备(如按键，鼠标，触摸屏等)都是字符设备。这些设备文件操作接口等基本是通用的，只是他们底部的硬件操作方式有所不同。Linux内核中采用了一种分层的思想，将这些上层相同的东西分类出来单独开发了一个输入子系统(input subsystem)。输入子系统已经完成了字符驱动的文件操作接口，所以编写驱动的核心工作是完成输入系统留出的接口，在很大程度上简化输入设备的驱动开发。
Linux的]]></description><category></category></item><item><title><![CDATA[Linux设备驱动程序学习笔记10：轮询]]></title><link>https://blog.youkuaiyun.com/CheerMoon2009/article/details/39397829</link><guid>https://blog.youkuaiyun.com/CheerMoon2009/article/details/39397829</guid><author>CheerMoon2009</author><pubDate>Fri, 19 Sep 2014 14:35:12 +0800</pubDate><description><![CDATA[在应用程序中可以通过select或poll系统调用来查询多个文件描述符。它们都允许进程一直阻塞，直到一个或多个文件描述符成为就绪状态或者在调用时指定一个超时时间。poll执行的任务同select很类似，两者的主要区别在于如何指定待检查的文件描述符，通常select的应用更广泛一些。
select调用的原型为：]]></description><category></category></item><item><title><![CDATA[vim常用配置]]></title><link>https://blog.youkuaiyun.com/CheerMoon2009/article/details/38765695</link><guid>https://blog.youkuaiyun.com/CheerMoon2009/article/details/38765695</guid><author>CheerMoon2009</author><pubDate>Fri, 22 Aug 2014 23:20:20 +0800</pubDate><description><![CDATA[Vim默认的配置文件是/etc/vim/vimrc，这是一个全局配置。在不影响其他用户的情况下我们可以再自己的用户目录下新建一个.vimrc文件，这个文件中的配置会覆盖全局配置。
我在使用vim时的几个常用的配置有：
"语法高亮
if has("syntax")
 syntax on
endif
"设置Tab键的宽度
set tabstop=4
set softtabstop=4]]></description><category></category></item><item><title><![CDATA[Linux设备驱动程序学习笔记09：等待队列]]></title><link>https://blog.youkuaiyun.com/CheerMoon2009/article/details/38758671</link><guid>https://blog.youkuaiyun.com/CheerMoon2009/article/details/38758671</guid><author>CheerMoon2009</author><pubDate>Fri, 22 Aug 2014 16:33:07 +0800</pubDate><description><![CDATA[应用程序通过read/write等系统接口对设备进行操作而不关心设备是否准备好。如果应用程序在对设备进行操作时设备未准备好，就必须在驱动程序中进行处理。
在打开一个设备文件时，可以指定打开方式为阻塞或者非阻塞型的。这两种不同的方式决定了再驱动程序中如何处理设备未准备好时的情况。
在通过open打开一个(设备)文件时通过是否设置O_NONBLOCK位来决定是以哪种方式打开文件的：
/*以只读非]]></description><category></category></item><item><title><![CDATA[Linux设备驱动程序学习笔记08：自旋锁和信号量]]></title><link>https://blog.youkuaiyun.com/CheerMoon2009/article/details/38559367</link><guid>https://blog.youkuaiyun.com/CheerMoon2009/article/details/38559367</guid><author>CheerMoon2009</author><pubDate>Thu, 14 Aug 2014 15:41:54 +0800</pubDate><description><![CDATA[并发与竞态
在写驱动程序的时候，必须要考虑的一个问题是对共享资源(硬件资源、全局变量以及静态变量等)的并发访问。而并发访问则很容易导致竞态(对资源的非控制访问)的产生。
假设驱动程序中有类似下面的一段代码：
...
static char *p;
...
void func(void) {
	if (!p) {
		p = kmalloc(size, GPF_KERNEL);
		if (!]]></description><category></category></item><item><title><![CDATA[Linux设备驱动程序学习笔记07：字符设备驱动程序V]]></title><link>https://blog.youkuaiyun.com/CheerMoon2009/article/details/38388195</link><guid>https://blog.youkuaiyun.com/CheerMoon2009/article/details/38388195</guid><author>CheerMoon2009</author><pubDate>Tue, 05 Aug 2014 17:22:22 +0800</pubDate><description><![CDATA[我们的字符设备的驱动程序源码如下：
/*  
 memdev.c : ldd

	Author : moon.cheng.2014@gmail.com  
	Date   : 2014-08-05
	Version: 1.0
	
	This program is a demo program for linux device drivers created by moon. 
	It is a ]]></description><category></category></item><item><title><![CDATA[Linux设备驱动程序学习笔记06：字符设备驱动程序IV]]></title><link>https://blog.youkuaiyun.com/CheerMoon2009/article/details/38386075</link><guid>https://blog.youkuaiyun.com/CheerMoon2009/article/details/38386075</guid><author>CheerMoon2009</author><pubDate>Tue, 05 Aug 2014 15:24:14 +0800</pubDate><description><![CDATA[本文将一块内存当做一个字符设备，并为它写一个驱动程序。
字符设备结构体
我们可以用一个cdev结构体来表示一个设备。鼠标、键盘、触摸屏等都可以被当做一个字符设备，这些设备都有一些自己独有的属性。比如我们将要用到的这块内存，它有一个属性是这块内存的大小，这个属性对于鼠标键盘来说是没有的。要如何通过一个通用的cdev结构体来表示包含有各种不同属性的结构体呢？
内核虽然是用C和汇编语言编写的，如果]]></description><category></category></item><item><title><![CDATA[GCC头文件及库文件路径的配置]]></title><link>https://blog.youkuaiyun.com/CheerMoon2009/article/details/38331095</link><guid>https://blog.youkuaiyun.com/CheerMoon2009/article/details/38331095</guid><author>CheerMoon2009</author><pubDate>Fri, 01 Aug 2014 09:04:49 +0800</pubDate><description><![CDATA[加载头文件路径配置
在实际编程时经常会涉及到包含头文件的问题。
采用#include ”xxx.h”的方式包含头文件编译器会先在工作目录中查找如果没找到则会继续查找系统目录。
采用#include 的方式包含头文件编译器则只会查找系统目录。
在实际项目中通常不会将.h文件直接放在工作目录或是系统目录下，所以经常会在编译的过程中遇到找不到头文件的情况。
如果是在linux环境下的话可以通过]]></description><category></category></item><item><title><![CDATA[Linux设备驱动程序学习笔记05：字符设备驱动程序III]]></title><link>https://blog.youkuaiyun.com/CheerMoon2009/article/details/38293235</link><guid>https://blog.youkuaiyun.com/CheerMoon2009/article/details/38293235</guid><author>CheerMoon2009</author><pubDate>Wed, 30 Jul 2014 09:32:05 +0800</pubDate><description><![CDATA[本文将简要分析cdev结构剩下的几个成员:]]></description><category></category></item><item><title><![CDATA[Linux设备驱动程序学习笔记04：字符设备驱动程序II]]></title><link>https://blog.youkuaiyun.com/CheerMoon2009/article/details/38293123</link><guid>https://blog.youkuaiyun.com/CheerMoon2009/article/details/38293123</guid><author>CheerMoon2009</author><pubDate>Wed, 30 Jul 2014 09:26:01 +0800</pubDate><description><![CDATA[对上层用户来说linux是将设备当做一个文件来使用的，cdev中是的const struct file_operations *ops;成员定义了驱动程序的文件操作表。讲到这部分就不得不提其它两个数据结构了：file 和 inode。大部分的驱动程序操作都涉及到这三个内核数据结构。现在我们就一起来学习一下这几个数据结构。
file_operation
file_operation结构体中的成员]]></description><category></category></item><item><title><![CDATA[Linux设备驱动程序学习笔记03：字符设备驱动程序I]]></title><link>https://blog.youkuaiyun.com/CheerMoon2009/article/details/38235525</link><guid>https://blog.youkuaiyun.com/CheerMoon2009/article/details/38235525</guid><author>CheerMoon2009</author><pubDate>Mon, 28 Jul 2014 18:47:30 +0800</pubDate><description><![CDATA[在Linux内核中用cdev结构体来表示一个字符设备，cdev的定义在linux/Cdev.h中：
struct cdev {
	struct kobject kobj; //内嵌的kobject
	struct module *owner; //指向实现驱动程序的模块(如果有的话)
	const struct file_operations *ops; //指向驱动程序的文件操作表
	stru]]></description><category></category></item><item><title><![CDATA[Linux设备驱动程序学习笔记02：编写编译并运行驱动程序]]></title><link>https://blog.youkuaiyun.com/CheerMoon2009/article/details/37969593</link><guid>https://blog.youkuaiyun.com/CheerMoon2009/article/details/37969593</guid><author>CheerMoon2009</author><pubDate>Sat, 19 Jul 2014 22:10:53 +0800</pubDate><description><![CDATA[学习一个新东西最好的方式就是去实践它。在实践的过程中会不断遇到问题、产生疑问。解决这些问题的过程就是我们进步成长的过程。
一、如何写驱动程序
在学习C语言的时候有一个著名的hello world程序。在学习驱动程序的时候我们也可以写一个类似的小程序，它的源码如下：
//file name module_ts.c
#include 
#include 

static int __init m]]></description><category></category></item><item><title><![CDATA[Linux设备驱动程序学习笔记01：设备驱动程序简介]]></title><link>https://blog.youkuaiyun.com/CheerMoon2009/article/details/37941629</link><guid>https://blog.youkuaiyun.com/CheerMoon2009/article/details/37941629</guid><author>CheerMoon2009</author><pubDate>Sat, 19 Jul 2014 00:14:12 +0800</pubDate><description><![CDATA[设备驱动程序(Device Driver)是一种可以使操作系统和设备通信的特殊程序。驱动程序硬件设备提供接口。操作系统只有通过这个接口，才能使用硬件设备且应用程序必须通过操作系统来使用硬件设备。他们之间的关系可以用下面的图来表示：]]></description><category></category></item><item><title><![CDATA[僵尸进程]]></title><link>https://blog.youkuaiyun.com/CheerMoon2009/article/details/34441375</link><guid>https://blog.youkuaiyun.com/CheerMoon2009/article/details/34441375</guid><author>CheerMoon2009</author><pubDate>Wed, 25 Jun 2014 15:54:35 +0800</pubDate><description><![CDATA[僵尸进程是指那些已经停止运行(调用exit系统函数)，但是其entry仍然保存在进程表中的进程。
 
僵尸进程是如何产生的？
当一个进程结束后，它在进程表中的entry并不会被立即删除。因为它的父进程需要通过这个entry来读取它的exit status。只有当它的父进程通过wait系统调用读取了它的exit status之后。该进程在进程表中的entry才会被删除。如果系统中存在太多僵尸进]]></description><category></category></item><item><title><![CDATA[写linux命令程序who的几点总结]]></title><link>https://blog.youkuaiyun.com/CheerMoon2009/article/details/28869635</link><guid>https://blog.youkuaiyun.com/CheerMoon2009/article/details/28869635</guid><author>CheerMoon2009</author><pubDate>Fri, 06 Jun 2014 11:55:46 +0800</pubDate><description><![CDATA[写linux命令程序who的几点总结  最近在一边学习C一边看《Unix-Linux编程实践教程》。这本书在去年就已经看过一遍了，其中的例子当时也跟着编过。本来是最近是准备看《UNIX环境高级编程》这本书的，突然发现《Unix-Linux编程实践教程》的内容都已忘的差不多了，就决定先再把它看一遍。  既然要拿起来在学，就好好学一下吧。决定自己先不看书，自己动手先再重写一遍。根据书中的套路（这个现在]]></description><category></category></item></channel></rss>