2010-3-8 scullコード読解コンパイルテスト


午前中、私は主にldd本の中でscullのコードを読んでscullディレクトリの下のコードをコンパイルして、そしてinsmodの後で3つの設備scull、scullp、scullaが現れて、その中でscullは最も簡単で、scull設備はリングバッファと読み書きをブロックする技術を使って、scullaはアクセス制御の機能を追加したようで、私は主にscullのコードを見て、そしてscull設備のコードを独立して、それからそれをコンパイルして、モジュールを挿入して、読み書きなどの操作.
scullの全体的な構造は基本的ですが、メモリの処理が煩雑です.以前は文字デバイスドライバの基本フレームワークを大体知っていましたが、lddでのデバッグ技術は見ていません.コードではprocファイルシステムを使用する技術に遭遇しました.scullでは/procファイルシステムを使用する方法が2つ使われています.
1、createを使うproc_read_entry()は/proc/scullmenファイルを作成し、読み出し関数scull_をバインドします.read_procmem;
2、seq_を使うfileインタフェースcreate_を使用proc_entry()は/proc/scullseqファイルを作成し、その後proc_を指定します.fops.
デバイステストではinsmod mknod rm rmmodコマンドを入力するたびに面倒だと思いましたが、shellスクリプトの書き方はほとんど忘れていたので、perlの内容を復習しました(実は当初はあまり勉強していませんでした)


#!/usr/bin/perl



use strict;

use warnings;



system("insmod ./scullm.ko");



for(my $i = 0; $i < 4; $i ++){

if(-e "/dev/scullm$i"){

system("rm /dev/scullm$i");

}

}



my $line;

my $major;

open(DEV, "/proc/devices") || die("Failed to open /proc/devices $!/n");



while($line = <DEV>){

if($line =~ /(/d+)/s+scullm$/){

$major = $1;

}

}



if(defined($major)){

for(my $i = 0; $i < 4; $i ++){

system("mknod /dev/scullm$i c $major $i");

}

}



( , )

#!/usr/bin/perl



use warnings;

use strict;



my $n = 0;



for($n = 0; $n < 4; $n++){

print("open /dev/scullm$n/n");

open(FILE, ">/dev/scullm$n") || die("$!");

print(FILE "dev/scullm$n /n");

close(FILE);

}



print ("now get data out");



for($n = 0; $n < 4; $n++){

open(FILE, "</dev/scullm$n") || die("$!");

my $line = <FILE>;

close(FILE);

print ("$line");

}







#!/usr/bin/perl



use strict;

use warnings;



for(my $i = 0; $i < 4; $i ++){

system("rm /dev/scullm$i");

}



system("rmmod scullm");



( )


午后、私は赵猛先辈に私の新しいカーネルがネットに接続できない问题を教えてもらいました:etc/init.d/network startで「pcnet 32 device eth 0 does not seem to be present delaying initializtion」と間違えて、彼は私に言った.configでPCNET 32を駆動する駆動が選択されていません.夕方、修正しました.configファイル、CONFIG_PCNET 32 is not setをCONFIG_に変更PCNET 32=yes、再コンパイルしてインストールすればいいです.
夜、趙猛先輩は私にrequestのbufferの原理を説明してくれました:新しく来たbio構造ごとに、システムはそれを既存のrequestに統合しようとします.条件はbioの中で指すキャッシュ領域がrequestのbioと連続していることです.そうしないと、request構造が再作成されます.(私がこのように理解しているかどうか分かりません).これにより、各request構造でbioが指すキャッシュは連続するので、bufferポインタを1つ使用すればよい.重要なのは、requestのbioが指すキャッシュアドレスが連続していることを理解することです.
また、コードを読んでいると、cscopeの使用に慣れていないことに気づきましたが、
  cscope-indexer -r cscope -Rbkq ;

vi cscope ( ) , , , , , :

SPACE/d/j: screen/page/line down, b/u/k: up, q: quit

, q , man 。