2011-05-29 :-)
_ 午前
0300 待機 【とらのあなWebSite】【apricot+】の蒼樹うめ先生がお贈りする、非公式まどかマギカ同人誌がついに再登場!これは決して見逃せない!!
0400 先に進めないなんて、そんなの絶対おかしいよ
0500 力尽きた
0930 起床 || まどか完売
1030 おひる
1100 コーヒー
_ [痛デバドラ] /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. 簡単なキャラクタデバイスをつくる