摘要: 硬件访问技术 我们前面点亮led就是使用动态的虚拟地址: 看了动态映射,接下来就是静态映射: 该结构有四个成员:第一个参数是我们的虚拟地址,第二个参数才是我们实际的物理地址,只不过我们现在使用页桢号来表示。假如物理地址是50008000,一页的大小为4K,用物理地址除以4K,就得到页桢号了。它现在是 阅读全文
posted @ 2016-02-13 23:49 cestlavie 阅读(235) 评论(0) 推荐(0) 编辑
摘要: Led的设备驱动程序实例 写字符驱动的顺序是:首先是搭建内核模块框架,接着是写字符驱动,最后是写open和ioctl函数,实现led灯的控制驱动程序。 首先是led.c的代码: Makefile的实现: Make之后生成的文件: 接着是我们的应用程序:led_app.c: 编译生成led_app程序 阅读全文
posted @ 2016-02-13 23:48 cestlavie 阅读(396) 评论(0) 推荐(0) 编辑
摘要: 字符设备控制技术 前面的学习,我们学习了驱动程序,实现程序的读写功能。现在设备还有一项更重要的功能--控制。 控制设备的函数:ioctl。 Cmd:参数是我们发送的命令,例如重启。 第三个参数:是依赖第二个,例如我们要修改波特率的值,我们就会在第三个参数传上波特率的值。当第二个不需要参数,就是空值。 阅读全文
posted @ 2016-02-13 23:47 cestlavie 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 应用程序主要是通过系统调用来访问驱动程序图。 接下来我们以read.c应用程序来分析: 我们知道read.c是个系统调用,系统调用之前,他是在我们的应用程序当中。实现是在内核当中,但是read.c是怎么找到内核的实现代码的呢?接下来就是这内容: 这是read.c的代码: 我们现在静态编译和反汇编: 阅读全文
posted @ 2016-02-13 23:46 cestlavie 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 字符驱动编程模型 上面就是内核的cdev的结构。他只有6个成员。有一些是内核自己回去用的,有一些是我们程序员要去用的。例如:count,表明设备有几个可以用。例如,我的开发板支持三个串口。所以count=3.还有设备号:查看设备文件: 我们从前面知道,我们是通过字符设备文件来访问我们的字符设备驱动的 阅读全文
posted @ 2016-02-13 23:44 cestlavie 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 编译和安装驱动 下面是通过一个例子来学会使用驱动程序: 1---驱动程序: Memdev.c #include <linux/module.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/cdev.h> #includ 阅读全文
posted @ 2016-02-13 23:42 cestlavie 阅读(392) 评论(0) 推荐(0) 编辑
摘要: 上面是六个进程重要的状态。 上面的意思是:把当前正在运行的状态设置成阻塞态。放弃cpu资源。 阅读全文
posted @ 2016-02-13 23:39 cestlavie 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 首先是创建内核模块。 按照上面的那张图,我们知道,我们创建链是使用INIT_LIST_HEAD这个函数。现在我们来使用source insight查看该函数的结构。 该函数是对我们的链表头进行初始化的。我们把链表头做一个参数传进来之后。我们分别用next和prev指针同时指向他本身。 可以看到,该函 阅读全文
posted @ 2016-02-13 23:36 cestlavie 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 管理模型 右边是虚拟地址,左下角是虚拟地址到物理地址的转换。 在linux系统程序中都是用虚拟地址。虚拟地址空间是由硬件来决定的。例如32位的系统,虚拟地址空间是4G=2的32次方。0-3G是用户空间,3G-4G是内核空间。而内核空间又被分为了四个部分:直接映射区(896M),vmalloc区,永久 阅读全文
posted @ 2016-02-13 23:34 cestlavie 阅读(421) 评论(0) 推荐(0) 编辑
摘要: 根文件系统其实包含两个含义:1.是根。2.是文件系统。 根:就是第一个的意思。必须有的。 文件系统:就是我们在编译linux内核看到的: 上面的目录和文件就是文件系统的。 接下来我们就来创建文件系统: 这里我们需要下面文件: 把它解压开,在把它的内容拷贝到/rootfs/etc: 接着是添加内核模块 阅读全文
posted @ 2016-02-13 23:33 cestlavie 阅读(147) 评论(0) 推荐(0) 编辑
摘要: 前面我们已经制作了uboot,接下来是制作kernel。 首先进入内核源码,执行make distclean.清除先前编译产生的文件。 注意配置内核的时候多了一个ARCH=arm的条件。 回车之后会进入arm的配置菜单: 就像我们前面配置linux内核一样,我们也会去找一个配置好的配置文件: 把co 阅读全文
posted @ 2016-02-13 23:31 cestlavie 阅读(206) 评论(0) 推荐(0) 编辑
摘要: Uboot的使用 解压uboot的压缩包得到uboot的工程文件uboot,进入uboot,打开Makefile文件,搜索自己的开发板的类型。我的是OK6410 256的。 然后执行配置文件: 接着执行一下的命令进行编译: 编译完成的截图: 完成之后,我们会在我们的uboot的目录看待生成uboot 阅读全文
posted @ 2016-02-13 23:29 cestlavie 阅读(1209) 评论(0) 推荐(0) 编辑
摘要: Linux的模块驱动 接下来写个最简单的驱动程序,就像程序语言的hello world程序。 首先是:hello.c的代码: 这是个最简单的驱动程序。就是打印hello的信息。驱动程序和我们的程序语言结果有点不大一样。驱动模块的入口是倒数第二行的module_init()的函数。驱动模块的出口是mo 阅读全文
posted @ 2016-02-13 23:26 cestlavie 阅读(907) 评论(0) 推荐(0) 编辑
摘要: Linux内核的配置和编译 之所以要对内核进行配置,这是很多都是硬件的需求,和软件的需求。就是选择自己需要的,去掉自己不要的。 上面有两种配置方法,但是make config是几乎不用的。他是一问一答的配置方法。很费时间。所以,都是采用make menuconfig来配置内核的。 接下来是配置的简单 阅读全文
posted @ 2016-02-13 23:24 cestlavie 阅读(314) 评论(0) 推荐(0) 编辑
摘要: Q:内核中的如何描述设备号? A:Struct kdev_t Q:如何从kdev_t结构中分解出主设备号? A:MAJOR(kdev_t dev) Q:如何从kdev_t结构中分解出次设备号? A:MINOR(kdev_t dev) 创建设备文件: 使用mknod命令手工创建。 使用devis提供的 阅读全文
posted @ 2016-02-13 23:23 cestlavie 阅读(233) 评论(0) 推荐(0) 编辑
摘要: 菜鸟的2013 阅读全文
posted @ 2016-02-13 23:10 cestlavie 阅读(132) 评论(0) 推荐(0) 编辑
摘要: 2015年 2015,我很早的来到学校,就是因为所谓的攀登计划项目。 这是在2014年末,回家的路上,柯老师叫我申请的。然后我回家,把申请当做注册,一天的时间就"搞定",交了。后来知道,老师已经注册了,我回家是完成申请工作。我也是呵呵了。过了一个安静的年。快开学的时候,柯老师在群里催促同学,赶紧完成 阅读全文
posted @ 2016-02-13 22:28 cestlavie 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 2014 这就是拯救我电脑的命令!netsh winsock reset 和catalognetsh int ip reset reset.log hit。神一样的命令。 今天是2015年农历的第三天了,看着别人的回忆录,我也敲起了键盘。 2014年我就是一个水桶(水果桶)。这一年上火的次数比201 阅读全文
posted @ 2016-02-13 21:05 cestlavie 阅读(157) 评论(0) 推荐(0) 编辑