随笔分类 - Linux
摘要:// 在Linux内核中增加程序需要完成以下3项工作1.源代码复制到Linux相应目录下2.在目录的Kconfig文件中增加新源代码对应项目的编译选项3.在目录的Makefile文件中增加对新源代码的编译条目以下以LED驱动为例说明:1.将led.c源代码复制到内核\drivers\char目录2.在目录的Kconfig文件中添加LED的编译配置选项config LED bool "LED driver" depends on ARCH_S3C6410 help LED driver for the samsung s3c6410上述Kconfig文件意味着只有在...
阅读全文
摘要:老婆去逛街了,不知道是不是给我省电话费呢,最近几天通话时间都很少,也不知道她在那边生活费够不够,也不让我给她打点钱,估计饿瘦了都,老婆……她去逛街了,我只好继续奋斗喽,为了将来好好照顾她,hehe:) 买tiny6410时,虽然说什么东西都给我们弄好了,但也是这什么都弄好了,以至于可以让我们弄得东西没有了,比如上面的LED驱动啊等等,都不是模块形式的,或者说是没法卸载的,所以我想自己学习移植一套Linux上去,自己写驱动会不会学得多一点,这几天一直在纠结学习的方法论的问题,最后还是实践派打败了理论派,于是,开始………… 首先是开发环境的搭建,不用多说,arm-gcc交叉编译器应该都会装...
阅读全文
摘要:内核开发者使用的C语言涵盖了ISO C99标准和GNU C扩展特性。这里简单介绍一下GNU C的扩展特性。 1.内联(inline)函数 GNU的C编译器支持内联函数,也是C++的一个特性之一。就是函数会在所调用的位置上展开,这样做虽然会导致代码量的增加,会占用更多的内存空间或者占用更多的指令缓存,但是确可以消除函数调用和返回所带来的开销,对于那些代码量少又需要经常调用的函数来说还是必须的。所以很显然对于一个很长的程序是不建议定义为内联函数的。 定义一个内联函数的时候,需要使用static作为关键字,并且用inline限定它: static inline void Set_Bit(...
阅读全文
摘要:1.1 什么是UNIX操作系统1.2 什么是Linux操作系统Linux Tovalds在赫尔辛基大学开发出来的 1.3 发行版本1.4 GNU项目和自由软件基金会1.5 为Linux系统设计程序1.6 UNIX程序 unix下应用程序:可执行文件 和 脚本文件 注:脚本文件的指令需要由另外一个程序(如解释器)来执行unix不要求可执行文件或脚本程序具备某种特定的文件名或者某种特定的扩展名,而是由文件的系统属性决定的。PATH环境变量,正如很多人所知道的$PATH环境变量里存着一张目录列表,当用户要执行某一程序时,Unix系统就会按照列表中的内容去查找该程序的位置。当程序名前不带点斜线 . .
阅读全文
摘要:2.1 什么是shell解释型语言,不适合用来完成对执行时间比较挑剔或者处理器符合比较大的工作shell是一个做为用户与UNIX系统之间的操作接口的程序,文件的重定向只要使用"<"和"》"就行,管道用一个"|"就能代表,子进程的输出是"$(...)",所有这些的具体细节都早已为用户准备好了。 2.2 管道和重定向2.2.1 对输出数据进行重定向$ls -l > lsoutput.txt,这条命令将ls命令的输出保存到一个名为lsoutput.txt的文件里去$ps >> lsoutput.t
阅读全文
摘要:前些天,写了篇博客( 最后一年的时间,应该做些什么呢? )发誓要好好学一下《UNIX环境高级编译》(下面简称APUE),可一个小小的编译问题就悲剧了我好几天,比如APUE书上的第一个程序是这样的: #include "apue.h" #include <dirent.h> int main(int argc, char *argv[]) { DIR *dp; struct dirent *dirp; if(argc != 2) { err_quit...
阅读全文
摘要:对于很多初学 《UNIX环境高级编程》(AdvancedProgramming in the UNIX Environment,简称APUE,以下使用简称)的朋友 ,第一个遇到的问题可能就是该书中的源代码编译的问题。此书中差不多每个例程中,都会有这样一行源码: #include "ourhdr.h" 在第二版中改为: #include "apue.h"这个头文件是作者把把每个例程中常用的标准头文件,一些常用的出错处理函数(err_**()之类的函数)和一些常用的宏定义给整理在一个头文件中。这个可以省去在每个例程中录入较多的重复代码,这样可以减少每个例程的
阅读全文
摘要:一直在看代码,今天准备真正去试试,就拿tiny6410的LED灯开刀,虽说是自己写,但实际上也是参考例程来的。不过还好基本的思路还是蛮清晰的。 定义本次驱动为misc device(杂项设备驱动),包含头文件miscdevice.h,其实所谓的杂项驱动程序就是主设备号为10的字符设备驱动,其实就是用主设备号10调用了函数register_chrdev()。且misc device会自动在/dev目录下建立设备节点,而不需用mkmod手动建立。开发板IO定义:S3C6410 GPK口:#include <linux/miscdevice.h> #include <linux/f
阅读全文
摘要:#include <linux/module.h>#include <linux/moduleparam.h>#include <linux/init.h>#include <linux/kernel.h> /* printk() */#include <linux/slab.h> /* kmalloc() */#include <linux/fs.h> /* everything... */#include <linux/errno.h> /* error codes */#include <linux
阅读全文
摘要:1. 获取内核版本当设备驱动需要同时支持不同版本内核时,在编译阶段,内核模块需要知道当前使用的内核源码的版本,从而使用相应的内核 API。2.4 与 2.6 内核下,源码头文件 linux/version.h 定义有:LINUX_VERSION_CODE ― 内核版本的二进制表示,主、从、修订版本号各对应一个字节;KERNEL_VERSION(major, minor, release) - 由主、从、修订版本号构造二进制版本号。在同时支持2.4与2.6 内核的设备驱动程序中,经常可以看到以下代码段:清单1:判断内核版本的代码段。#include <linux/version.h>
阅读全文
摘要:因为本身从事存储行业,在工作中多次碰到用户有这样的要求:我的linux系统中原来有一块SCSI硬盘,系统分配的设备文件是/dev/sda。现在新增加了一个外置的磁盘阵列,通过SCSI卡连接。但接上这个磁盘阵列后,/dev/sda变成了磁盘阵列的硬盘了,原来内置的SCSI硬盘变成了 /dev/sdb,我希望将设备文件固定下来。 过去,我总是对用户说,这个比较麻烦,因为/dev/sda等文件都是linux内核自动分配的。很难固定下来,除非你更改加载SCSI卡驱动程序的顺序,让内置硬盘连接的SCSI卡比外接磁盘阵列连接的SCSI卡的驱动模块先加载到内核,这样就能保证/dev/sda总是指向内置的硬盘
阅读全文
摘要:刚刚make好scull,非常的兴奋,立即使用了一下,本想总结在写一篇文章,不够偶尔发现了一篇很不错的文章,于是就转载过来,偷偷懒,不自己写了,嘿嘿。By: 吴垠1.写在前面: a. 在进行下面的工作之前请先阅读我 的文章《在 Linux 2.6内核下编译可以加载的内核模块》,配 置好可加载内核模块的Linux环境b. 下载《Linux设备设备驱动程序(第三版)》配套的源代 码,在这里可 以下载到,如果无法下载的话可以留言或者给我发邮件索取。c. 本文的工作环境是Fedora ...
阅读全文
摘要:这两天一直看LDD3,看的很爽,似懂非懂的样子,今天开始编译例程代码scull的时候,悲剧很大,折腾了很久,主要是我Ubuntu11.04的内核版本是2.6.38,而例程编译的内核版本是2.6.10,这中间内核本身已经发生了翻天覆地的变化。说白了,能make过去,那才出鬼了,好吧,一个错误一个错误来,不急。 直接make,第一个问题来了。。。。 根据提示把Makefile里的CFLAGS改成EXTRA_CFLAGS即可,继续……提示: 如果您使用的是vi,可以和我一样一道命令解决:0,$s/CFLAGS/EXTRA_CFLAGS/g 别忘了保存,继续make…… 第二个问题来了。。。。 ...
阅读全文
摘要:Ubuntu11.04在28号如期发布,为了抢鲜,我也在当天晚上在线升级了一下版本。整个过程下来发现安装的时间达一小时之多,比下载软件包还要久。悲剧也就在此刻上演,据安装结束还剩十多分钟时,学校断电了(学校23点准时熄灯)。第二天开机,虽然内核已经更新到2.6.38,但没法进入系统,甚至无法加载任何系统文件,一直黑屏。只好重启进入旧内核版本2.6.37,发现旧内核也无法正常进入桌面,只能停留在命令模式。解决方法 当意外出现这种情况时,推荐下载离线iso镜像包更新。 首先切换到其他系统下载ubuntu-11.04-alternate-i386.iso,注意这里的发行版是alternate,而不.
阅读全文
摘要:下午一直在找一个合适的Linux下的超级终端,我百度来一下,常用的有文本界面的minicom和图形界面的cutecom和gtkterm,毕竟是刚开始在Linux下工作,所以还是倾向于图形界面下的软件。但是经过下午的试用,果断淘汰了所有的图形界面软件,应该都不完美,主要没有了Linux下的tab命令补齐功能,这令我很是不爽,还是minicom吧,用用感觉还是非常舒服的。 首先是安装,输入命令:配置上网上说的很多,我不多说啥了。这是我的配置:因为我用的是USB转串口,所以是ttyUSB0,当然这个还要用命令 dmesg | grep usb查看一下需要注意的是进行配置的时候需要注意一下权限是否拥.
阅读全文
摘要:在Linux下的串口调试一直使用minicom,虽说Linux的精髓不崇尚图形界面,但有时候图形界面下确实有着不少的好处,而Linux下minicom最好的替代品就算cutecom了。首先在电脑上安装 cutecom:$sudo apt-get install cutecom运行$sudo cutecom而USB转串口线推荐大家使用pl2303,这个Linux是自带驱动的,使用会方便的多。插入usb转串口后,使用dmesg | grep usb,可以查看若有pl2303 converter now attached to ttyUSB0显示表示其已安装成功。这时的设备Device下拉菜单是没.
阅读全文
摘要:试着总结一下,学习一下,至少现在的我对于设备模型这个概念,几乎完全不懂。 Linux设备模型中三个很重要的概念就是总线、设备和驱动,即bus、device、driver,而实际上内核中也定义了这么一些数据结构,分别为struct bus_type,struct device,struct device_driver,原型定义均在include/linux/device.h中。而struct bus_type结构中两个非常重要的成员就是kset和kobject这两个结构体。于是乎,Linux设备模型概念中重要的5个概念都引出来了,即设备模型在具体实现方面分两个层次:一是底层数据结构来实现基本对象
阅读全文
摘要:1.简单概念 学习U盘驱动,不仅仅是去关注drivers/usb/storage目录下那相关的3000行代码。毕竟,作为U盘,她需要与usb core打交道,需要与scsi core打交道,需要与内存管理单元打交道,还有内核中许多其它模块打交道。什么是usb core?她负责实现一些核心的功能,为别的设备驱动程序提供服务,比如申请内存,比如实现一些所以的设备都会需要的一些公函数。还有就是host controller和root hub的概念,现实中经常是让一个usb控制器和一个hub绑定在一起,专业一点说是集成,而这个hub被称为root hub,换言之,和usb控制器绑定在一起的hub就是系
阅读全文
摘要:参考一下这个:http://blogold.chinaunix.net/u3/111072/showart_2298170.htmlprintk是内核态信息打印函数,功能和比准C库的printf类似。printk还有信息打印级别。函数原型:int printk(const char *fmt, ...需要的头文件:#include<linux/kernel.h消息打印级别:fmt----消息级别:#defineKERN_EMERG"<0>"#defineKERN_ALERT"<1>"#defineKERN_CRIT"
阅读全文