Archive for 六月, 2009

用一个新主题

原来用的主题对宽幅照片支持不好,不得不换一个主题。

把Wordpress.org的主题页面前30页都翻了一遍,就这个比较适合了。

后续的细节修改工作慢慢进行。

宽幅的力量

今天自习回来随便拍了几张,明天考数字图像。

晚上数字信号处理上机。

谁能告诉我紫色的花儿叫什么名字?

P1 阳台上的马扎

11

P2 舍友放在电视机上的洗漱工具

21

P3 我们的海棠

8

P4 B楼整齐的窗户

41

P5 忙碌

51

P6 簇拥

6

P7 绽放

7

一组交大照片

P1 交大图书馆后面的广场

5

P2 喜欢交大林荫古老的味道

4

P3 爬满爬山虎的老楼房

3

P4 交大图书馆正面

2

P5 在树下拉小提琴的同学

1

=END=

实现一个虚拟设备“自增器”,该设备把写入的数据自增1。

ganquan@debian:~/Driver/01$ cat Add.h

#ifndef _MYDRIVER_H
#define _MYDRIVER_H

#include <linux/cdev.h>       /*cdev*/
#include <linux/types.h>    /*ssize_t*/

/*设备对象*/
struct Add
{
struct cdev MyChrDevice;    /*Char device structure*/
};

/*驱动程序要实现的函数*/
ssize_t Add_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos);
ssize_t Add_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos);

#endif    /*_MYDRIVER_H*/

ganquan@debian:~/Driver/01$ cat Add.c

#include <linux/init.h>			/*包含用于声明装载模块初始化和清除函数的宏*/
#include <linux/module.h>		/*包含装载模块需要的符号和函数定义*/
#include <linux/kernel.h>		/*printk()*/
#include <linux/fs.h>			/*申请设备号函数和数据结构,file_operation*/
#include <linux/types.h>		/*dev_t*/
#include <linux/kdev_t.h>		/*包含获取主设备号和次设备号的宏*/
#include <linux/slab.h>			/*kmalloc()*/
#include <linux/cdev.h>			/*cdev,cdev_init(),cdev_add()*/
#include <asm/uaccess.h>		/*copy_to_user(),copy_from_user()*/

#include "Add.h"

static int global_var = 0;
int Add_major = 0;	/*主设备号*/
int Add_minor = 0;	/*次设备号*/

struct Add *mydev;

struct file_operations Add_fops = {
	.owner = THIS_MODULE,
	.read = Add_read,
	.write = Add_write,
};

ssize_t Add_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
{
	if(copy_to_user(buf,&global_var,sizeof(int)))
	{
		return -EFAULT;
	}

	return sizeof(int);
}
ssize_t Add_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
{
	if(copy_from_user(&global_var,buf,sizeof(int)))
	{
		return -EFAULT;
	}
	if(global_var != 0)
		global_var++;

	return sizeof(int);
}

static int MyDriver_init(void)
{
	int ret;
	int devno;
	dev_t dev;

	/*申请设备号*/
	ret = alloc_chrdev_region(&dev,0,1,"Add");
	if(ret < 0)
	{
		printk(KERN_ALERT "Can not get dev_t\n");
	}
	else
	{
		Add_major = MAJOR(dev);		/*MAJOR in <linux/kdev_t.h>*/
		Add_minor = MINOR(dev);		/*MINOR in <linux/kdev_t.h>*/
	}
	/*申请设备号结束*/

	/*分配设备内存空间*/
	mydev = kmalloc(sizeof(struct Add),GFP_KERNEL);
	if(!mydev)
	{
		printk(KERN_ALERT "kmalloc error\n");
	}
	/*分配内存空间结束*/

	/*初始化内存空间*/
	memset(mydev,0,sizeof(struct Add));

	/*注册字符设备*/
	devno = MKDEV(Add_major,Add_minor);
	cdev_init(&mydev->MyChrDevice,&Add_fops);
	mydev->MyChrDevice.owner = THIS_MODULE;
	mydev->MyChrDevice.ops = &Add_fops;
	ret = cdev_add(&mydev->MyChrDevice,devno,1);
	if(ret)
		printk(KERN_ALERT "Error %d adding Add\n",ret);
	/*注册字符设备结束*/
	return 0;
}

static void MyDriver_exit(void)
{
	dev_t devno;

    devno = MKDEV(Add_major,Add_minor);
	cdev_del(&mydev->MyChrDevice);
	unregister_chrdev_region(devno,1);
	kfree(mydev);
}

module_init(MyDriver_init);	/*声明模块加载初始化函数*/
module_exit(MyDriver_exit);	/*声明模块卸载清除函数*/

MODULE_LICENSE("GPL");		/*驱动许可证协议*/
MODULE_AUTHOR("GanQuan");	/*作者*/
MODULE_VERSION("0.0.1");	/*版本号*/

不变的Makefile:
ganquan@debian:~/Driver/01$ cat Makefile

obj-m := Add.o
	KDIR ?= /lib/modules/$(shell uname -r)/build
	PWD := $(shell pwd)
all:
	    $(MAKE) -C $(KDIR) M=$(PWD)

.PHONY:clean
clean:
	    rm -f *.mod.c *.mod.o *.ko *.o *.tmp_versions

驱动加载脚本:
ganquan@debian:~/Driver/01$ cat addload

#!/bin/bash
#author ganqan
#	imganquan@gmail.com
#load a module

module="Add"
device="Add"
mode="777"

/sbin/insmod ./${module}.ko || exit 1

major=$(awk "\$2==\"$module\" {print \$1}" /proc/devices)

mknod /dev/${module} c $major 0
chmod $mode /dev/${device}

devinfo=`ls -l /dev/${device}`

echo "insmod	:$module.ko"
echo "major	:$major"
echo "devinfo	:$devinfo"

驱动卸载脚本:
ganquan@debian:~/Driver/01$ cat addunload

#!/bin/bash
#author ganquan
#	imganquan@gmail.com
#unload a module

module="Add"
device="Add"
/sbin/rmmod $module || exit 1
rm -f /dev/${device}

很简单的测试程序:
ganquan@debian:~/Driver/01$ cat test.c

#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
int main()
{
	int fd,num;
	fd = open("/dev/Add", O_RDWR, S_IRUSR | S_IWUSR);
	if (fd != -1)
	{
		read(fd, &num, sizeof(int));
		printf("The MyDevice is %d\n", num);

		printf("Please input the num written to MyDevice\n");
		scanf("%d", &num);
		write(fd, &num, sizeof(int));
		read(fd, &num, sizeof(int));
		printf("The MyDevice is %d\n", num);
		close(fd);
	}
	else
		printf("Device open failure\n");
		return 0;
}

测试结果:

ganquan@debian:~/Driver/01$ sudo ./addload
insmod	:Add.ko
major	:249
devinfo	:crwxrwxrwx 1 root root 249, 0 2009-06-09 22:55 /dev/Add
ganquan@debian:~/Driver/01$ ./test
The MyDevice is 0
Please input the num written to MyDevice
7
The MyDevice is 8
ganquan@debian:~/Driver/01$ sudo ./addunload

Debian VS Ubuntu

今天又看到了关于Debian和Ubuntu的不休争论,我也说说自己的感觉。
两个发行版我都用过,结果是Debian胜出,现在我更多的感觉到Debian的优秀,不是其他发行版可以比拟的。从以下几个方面来说明我选择的理由:

一、稳定性
Debian的稳定性远远超过Ubuntu,这是经过我切身体会的结论。我是用Debian来做桌面系统,只要不使用网银,基本上就不用Windows,既然用作桌面系统,就要保证软件不要太老,所以我用Debian只用testing,然而testing的Debian一直都没有崩溃过,可是在Ubuntu的好几个版本里面都出现过突然崩溃的现象。一个操作系统,如果不能给用户以稳定的印象,势必导致用户的抛弃。

二、可定制性
Debian的可定制性非常强,爱怎么搞就怎么搞,我曾经定制了一个瘦小的Debian,很有成就感,同时运行也很快。我喜欢可以定制的东西,当然这是一种病,爱好折腾的病。使用Debian的感觉就像是自己在做一盘菜,自己怎么喜欢吃,就怎么做。但是Ubuntu却大包大揽,臃肿无比,就像在餐厅点菜吃饭,厨师怎么做,顾客就怎么吃,不管是否和口味。
Ubuntu把很多地方都隐藏或者叫做封装起来,让用户感受到易用性,这点我却不大领情。它越来越像M$ Windows,我不知道这个系统背后的东西,只知道怎么用。例如在Ubuntu上安装显卡驱动,已经完全傻瓜化了,但是却使得我不知道Linux的驱动程序机制,以及如何手动安装一个驱动。这样不利于我学习Linux,不能接触底层和后台,怎么了解这个系统。当然,这是和用户特点有关的,如果只是一个单纯想用Linux的用户,那么就觉得Ubuntu这点非常好。可定制性其实是一种自由,可以随心地对系统进行配置,我不愿意失去这样的自由。

三、心理感受
Debian最大的特色是纯,像一匹纯血宝马那样给人高贵和优秀的感觉,没有像Ubuntu那样默认装入很多有版权争议的包,这一点,说Ubuntu违法是一点也不为过,例如w32codecs那种明显是侵权的包,Ubuntu也装入其中。Debian给我更多的开源与自由软件的感受,而Ubuntu却给我感觉越来越远,不止一个人说Ubuntu从Debian这里拿走的远远超过它回报Debian的。从个人心理感受来说,我更喜欢Debian一点,低调和沉稳,就像一个身怀绝技却毫不张扬的勇士,而Ubuntu则更像一个浅薄聒噪的年轻小伙。

四、适用人群
Ubuntu花费了太多的时间在美化和易用,甚至不惜侵犯他人版权。Ubuntu没有让用户真正高效的利用Linux来工作,更多的是为用Linux来用Linux。Debian则是提供给用户一个稳定快速的系统去学习高效地使用Linux。Ubuntu的宣传工作做得非常好,这对Linux的普及是非常有帮助的,在我个人看来,Ubuntu对Linux的最大贡献目前来说就在这里。它让更多不懂Linux的人可以使用Linux,使得更多的人可以接触到Linux。我感觉,Ubuntu更适合新手或刚接触Linux的人使用,如果要学习Linux则不要使用它,Debian更加适合。因为在配置Debian的过程中,每一步都可以学到关于Linux的知识,全部走下来之后,学到的东西不是用Ubuntu用几个月就能明白的。没接触过Linux的同学问我怎么入门我都推荐Ubuntu,而不是Debian,我想,当他们用了一定时间,想知道Ubuntu背后的东西时,就是换Debian的时候了。

五、总结一下
Ubuntu出色的宣传工作是它对开源界和GNU/Linux的贡献,值得肯定。Debian的贡献不好说,因为太大。如果说GNU/Linux,开源和自由软件是一个理想,那么至今能够承载这个梦想的,只有Debian。Debian在慢慢的发展,“集市的开发方式”并不比“大教堂的开放方式”差,它会逐渐的强大起来。Ubuntu在商业支持下看起来强劲有力,希望在以后它能为开源和自由软件贡献更多,而不是只有索取。Ubuntu更加适合新手使用,Debian则适合愿意折腾的人用,我是一个喜欢折腾的家伙,所以我力荐Debian。