トップ «前の日記(2011-05-28) 最新 次の日記(2011-05-30)» 編集

ヨタの日々

2001|08|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|12|
2024|01|02|03|04|

2011-05-29 :-)

_ 午前

0300 待機 【とらのあなWebSite】【apricot+】の蒼樹うめ先生がお贈りする、非公式まどかマギカ同人誌がついに再登場!これは決して見逃せない!!

0400 先に進めないなんて、そんなの絶対おかしいよ

0500 力尽きた

0930 起床 || まどか完売

1030 おひる

1100 コーヒー

_ 午後

1300 金曜日の英語でしゃべらナイトを見てみた。カプコンの一井克彦さん 英語でしゃべらナイト 放送内容

1500 Linux

_

1700 お茶

2100 飯。鮭のムニエル

_ [痛デバドラ] /dev/louise_love作ってみた [Linux] - ψ(プサイ)の興味関心空間

写経する

環境

CentOS5 on VMware on Windows 7

準備

git 入れる ( centos5.3でyumを使ってgitをインストールする - Inquisitive! )

/etc/yum.repos.d/CentOS-Base.repo に追加

[dag]
name=Dag RPM Repository for Redhat EL5
baseurl=http://apt.sw.be/redhat/el$releasever/en/$basearch/dag
gpgcheck=1
enabled=1
gpgkey=http://dag.wieers.com/packages/RPM-GPG-KEY.dag.txt

入れる

% yum install git

カーネルヘッダーファイルとソースファイルをインストール HowTos/I need the Kernel Source - CentOS Wiki

% yum install kernel-devel

写経

痛デバドラのソース取得

% git clone git://github.com/ledyba/louise_love_driver.git

おもむろに make

% make
make -C /usr/src/linux-2.6.18-238.9.1.el5 M=`pwd` V=1 modules
make: *** /usr/src/linux-2.6.18-238.9.1.el5: そのようなファイルやディレクトリはありませ

ディレクトリはここにある

% ls /usr/src/kernels/
2.6.18-238.9.1.el5-x86_64

uname -m も必要

% uname -rm
2.6.18-238.9.1.el5 x86_64

これだけだと r と m の間に空白があるので - でつなぐ

% echo `uname -r`-`uname -m`
2.6.18-238.9.1.el5-x86_64

Makefile を変更しとく

% diff -u Makefile.orig  Makefile
--- Makefile.orig       2011-05-29 02:44:22.000000000 +0900
+++ Makefile    2011-05-29 02:44:51.000000000 +0900
@@ -2,7 +2,7 @@
 # こちらのmakefileを元にしました。

 ifndef LINUX_HEADERS
-LINUX_HEADERS:=$(shell if [ -e /usr/src/linux-headers-`uname -r` ] ;   then echo /usr/src/linux-headers-`uname -r` ; else echo /usr/src/linux-`uname -r` ; fi)
+LINUX_HEADERS:=$(shell if [ -e /usr/src/linux-headers-`uname -r` ] ;   then echo /usr/src/linux-headers-`uname -r` ; else echo /usr/src/kernels/`uname -r`-`uname -m` ; fi)
 endif

 TARGET:= louise_love.ko userland_louise_love

make して install する

% make install
sudo mknod /dev/louise_love c 0x0721 0
sudo chmod 0666 /dev/louise_love
sudo insmod louise_love.ko

見る

% lsmod | grep louise
louise_love           321280  0

クンカクンカ

% dmesg | grep louise
louise_love : kunka kunka.    <= init_module()
louise_love : uwaaaaaaaaaaaaaaaaaaaaaaaa    <= louise_open()
louise_love : boku ni ha louise chan ga iru !!    <=  louise_open()

ルイズたん

% cat /dev/louise_love

_ Linux デバイスドライバ読み書き

というかカーネルモジュール的な何か

read/write をたんに使ってみただけ。パイプライン的な使い方とか文字列比較しようとしたけど割りと手間がかかりそうなのでやめ。

ルイズたんの read/write を変更しただけ。strlen() て使えるのね

//fread
static ssize_t louise_read( struct file* filp, char* buf, size_t count, loff_t* pos ){

        int len = message_count;
        if( len == 0 )
                return 0;

        char* msg = "ガッ\n";
        if ( copy_to_user( buf, msg, strlen( msg ) ) ) {
                printk( KERN_INFO "louise_love : copy_to_user failed\n" );
                return -EFAULT;
        }

        message_count = 0;
        return len;
}



//fwrite
static ssize_t louise_write(struct file* filp, const char* buf, size_t count, loff_t* pos ){
        if( count > BUF_MAX )
                return count;

        printk( KERN_INFO "cdev_write count = %d\n", count );

        if( copy_from_user( dev_buf, buf, count ) ){
                printk( KERN_WARNING "copy_from_user failed\n" );
                return -EFAULT;
        }

        dev_buf[ count ] = '\0';
        printk( KERN_INFO "dev_buf = %s\n", dev_buf );
        *pos += count;
        message_count = count;
        return count;
}
% echo ぬるぽ > /dev/louise_love && cat /dev/louise_love
ガッ

ref. 簡単なキャラクタデバイスをつくる