靈修分享:亞略巴古的演講

亞略巴古的演說是使徒行傳一篇非常著名的講道。基督徒往往用這段經文來說明上帝的屬性,同時也會參考這段經文作為和外邦人互動的一個參考方式。最近因為團契查經查到這一段,重新思想後看到了以前沒有考慮過的面向,在這邊記錄一下。

徒17:16-34保羅在雅典等候他們的時候,看見滿城都是偶像,就心裏着急;於是在會堂裏與猶太人和虔敬的人,並每日在市上所遇見的人,辯論。還有伊壁鳩魯和斯多亞兩門的學士,與他爭論。有的說:「這胡言亂語的要說甚麼?」有的說:「他似乎是傳說外邦鬼神的。」這話是因保羅傳講耶穌與復活的道。他們就把他帶到亞略‧巴古,說:「你所講的這新道,我們也可以知道嗎?因為你有些奇怪的事傳到我們耳中,我們願意知道這些事是甚麼意思。」(雅典人和住在那裏的客人都不顧別的事,只將新聞說說聽聽。)
保羅站在亞略‧巴古當中,說:「眾位雅典人哪,我看你們凡事很敬畏鬼神。我遊行的時候,觀看你們所敬拜的,遇見一座壇,上面寫着『未識之神』。你們所不認識而敬拜的,我現在告訴你們。創造宇宙和其中萬物的神,既是天地的主,就不住人手所造的殿,也不用人手服事,好像缺少甚麼;自己倒將生命、氣息、萬物,賜給萬人。他從一本本:有古卷是血脈造出萬族的人,住在全地上,並且預先定準他們的年限和所住的疆界,要叫他們尋求神,或者可以揣摩而得,其實他離我們各人不遠;我們生活、動作、存留,都在乎他。就如你們作詩的,有人說:『我們也是他所生的。』我們既是神所生的,就不當以為神的神性像人用手藝、心思所雕刻的金、銀、石。世人蒙昧無知的時候,神並不監察,如今卻吩咐各處的人都要悔改。因為他已經定了日子,要藉着他所設立的人按公義審判天下,並且叫他從死裏復活,給萬人作可信的憑據。」
眾人聽見從死裏復活的話,就有譏誚他的;又有人說:「我們再聽你講這個吧!」於是保羅從他們當中出去了。 但有幾個人貼近他,信了主,其中有亞略‧巴古的官丟尼修,並一個婦人,名叫大馬哩,還有別人一同信從。

對基督徒來說,保羅這篇講道講的真好,不但講出了上帝的超越性(像是不住人手所造的殿、也不是金銀石的彫刻),也帶出了耶穌基督復活的大能。但最近我才注意到眾人的反應:「眾人聽見從死裏復活的話,就有譏誚他的;又有人說:「我們再聽你講這個吧!」」不曉得你看到這一段有什麼感想?可能我是玻璃心吧,如果我是保羅,我大概會非常非常的難過,看起來似乎沒有人理會這個福音、這篇講道。這篇被基督…

Linux UK Communication: Character Device

這是同事 Taco 撰寫的範例,在經過作者同意後厚顏無恥的列在 Blog 上。畢竟人家都寫好了啊,要我自己在寫一份有點懶。為了紀念原作者(明明就還活著,說啥紀念),所以沒有任何地方更動(應該是懶惰吧)

這個範例和我平常的習慣不同,一般來說我只會寫一個範例檔,不喜歡拆成兩個,而且愈簡單愈好。 但這同事和我的習慣不同,也很好,因為可以很簡單的看出兩個檔案的分工,特別是 taco_1.c,可以直接拿來建立各樣的 kernel module 範例,這個習慣值得我學習。

taco_1.c
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>

MODULE_AUTHOR("tacolin");
MODULE_DESCRIPTION("CHARACTOR DEVICEL TEST MODULE 2");
MODULE_LICENSE("GPL");

extern int register_device(int major, int minor);
extern int unregister_device(int major, int minor);

static int __init kernel_module_init(void)
{
 printk("[KERNEL-PART] %s\n", __func__);
 if ( 0 > register_device(125, 0) )
 {
  printk("[KERNEL-PART-ERROR] register device failed\n");
  return -1;
 }
    return 0;
}

static void __exit kernel_module_exit(void)
{
 printk("[KERNEL-PART] %s\n", __func__);
 if ( 0 > unregister_device(125, 0) )
 {
  printk("[KERNEL-PART-ERROR] unregister device failed\n");
  return;
 }
 return;
}

module_init( kernel_module_init );
module_exit( kernel_module_exit );


taco_2.c
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>

#include <linux/cdev.h>
#include <asm/uaccess.h>

#include <linux/device.h>

static int _device_open(struct inode*, struct file*);
static int _device_release(struct inode*, struct file*);
static ssize_t _device_write(struct file*, const char*, size_t, loff_t*);
static ssize_t _device_read(struct file*, char*, size_t, loff_t*);

static struct file_operations _ops = {
 open:  _device_open,
 release: _device_release,
 write:  _device_write,
 read:  _device_read,
};

static struct class*  _p_class = NULL;
static struct cdev   _cdevice;

static unsigned char  _kbuf[128];

static int _device_open(struct inode* p_node, struct file* p_file)
{
 printk("[KERNEL-PART] %s\n", __func__);
 return 0;
}

static int _device_release(struct inode* p_node, struct file* p_file)
{
 printk("[KERNEL-PART] %s\n", __func__);
 return 0;
}

static ssize_t _device_write(struct file* p_file, const char* p_data, size_t count, loff_t* p_position)
{
 printk("[KERNEL-PART] %s\n", __func__);

 count = min( (unsigned long)128, (unsigned long)count );

 if ( 0 > copy_from_user( _kbuf, p_data, count) )
 {
  printk("[KERNEL-PART-ERROR] copy from user failed\n");
  return -EFAULT;
 }

 printk("[KERNEL-PART] %s\n", _kbuf); 

 return count;
}

static ssize_t _device_read(struct file* p_file, char *p_buf, size_t len, loff_t* p_position)
{
 size_t read_len = min( (size_t)128, len );

 printk("[KERNEL-PART] %s\n", __func__);

 if ( 0 > copy_to_user( p_buf, _kbuf, read_len ) )
 {
  printk("[KERNEL-PART-ERROR] copy to user failed\n");
  return -EFAULT;
 }
 
 return read_len;
}


int register_device(int major, int minor)
{
 dev_t device_number;
 int   ret;

 device_number = MKDEV(major, minor);
 if ( !MAJOR(device_number) )
 {
  ret = alloc_chrdev_region( &device_number, MINOR(device_number), 1, "tacobuf");
  printk("[KERNEL-PART] alloc_chrdev_region\n");
 }
 else
 {
  ret = register_chrdev_region(device_number, 1, "tacobuf");
  printk("[KERNEL-PART] register_chrdev_region\n");
 }

 if ( ret < 0 )
 {
  printk("[KERNEL-PART-ERROR] register device failed\n");
  return ret;
 }

 memset(&_kbuf, 0, 128);
 sprintf(_kbuf, "nothing");
 memset(&_cdevice, 0, sizeof(struct cdev));

 cdev_init( &_cdevice, &_ops );

 _cdevice.owner = THIS_MODULE;
 _cdevice.ops   = &_ops;

 ret = cdev_add( &_cdevice, device_number, 1 );
 if ( ret != 0 )
 {
  unregister_chrdev_region( device_number, 1 );
  printk("[KERNEL-PART-ERROR] add device failed\n");
  return ret;
 }
 
 _p_class = class_create(THIS_MODULE, "taco_class");
 if ( _p_class == NULL )
 {
  printk("[KERNEL-PART-ERROR] class create failed\n");
  unregister_chrdev_region( device_number, 1 );
  return -1;
 }

 if ( NULL == device_create(_p_class, NULL, device_number, NULL, "tacobuf") )
 {
  printk("[KERNEL-PART-ERROR] device create failed\n");
  unregister_chrdev_region( device_number, 1 );
  return -1;
 }

 return 0;
}

int unregister_device(int major, int minor)
{
 dev_t device_number;

 device_number = MKDEV(major, minor);

 cdev_del( &_cdevice );

 unregister_chrdev_region(device_number, 1);

 device_destroy(_p_class, device_number);
 
 class_destroy(_p_class);

 return 0;
}


Makefile
ifneq ($(KERNELRELEASE),)

obj-m := taco.o
taco-objs := taco_1.o taco_2.o

else

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD       := $(shell pwd)

default:
 @$(MAKE) -C $(KERNELDIR) M=$(PWD) modules


endif

clean:
 @$(RM) -rf *.o *.ko *~ core .depend *.mod.c .*.cmd .tmp_versions .*.o.d *.symvers *.markers *.order

留言

這個網誌中的熱門文章

如何將Linux打造成OpenFlow Switch:Openvswitch

我弟家的新居感恩禮拜分享:善頌善禱

如何利用 Wireshark 來監聽 IEEE 802.11 的管理封包