原来用的主题对宽幅照片支持不好,不得不换一个主题。
把Wordpress.org的主题页面前30页都翻了一遍,就这个比较适合了。
后续的细节修改工作慢慢进行。
原来用的主题对宽幅照片支持不好,不得不换一个主题。
把Wordpress.org的主题页面前30页都翻了一遍,就这个比较适合了。
后续的细节修改工作慢慢进行。
今天自习回来随便拍了几张,明天考数字图像。
晚上数字信号处理上机。
谁能告诉我紫色的花儿叫什么名字?
P1 阳台上的马扎

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

P3 我们的海棠

P4 B楼整齐的窗户

P5 忙碌

P6 簇拥

P7 绽放

P1 交大图书馆后面的广场

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

P3 爬满爬山虎的老楼房

P4 交大图书馆正面

P5 在树下拉小提琴的同学

=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和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。