1220317
Jun's Homepage

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21|


すべての ASCII キャラクタを表示する... 投稿者:maeha 投稿日:2005/02/06(Sun) 11:38 No.345  
こんにちは。

ASCII code表を見てみますと、カラム0 と 1 には、たとえば 0x1の白い顔や0x2の黒い顔など、
いろいろな形のキャラクタが在りますが、私のマシンではそれらをstdoutにwriteしますと
なにも表示せず、0x9のTABや0x7のビープ音などは、その作用をします。

Q1) この作用をとめて、すべての ASCII キャラクタを表示するには、どのようにしますか?

ioctl で GIO_FONT の 0x4B60 をコマンドにしますと、完全な ASCII キャラクタセットの
フォントが取り出せますが、これは使用できませんか?

以上よろしくお願い致します。
maeha



Re: すべての ASCII キャラクタを表示... jun - 2005/02/09(Wed) 00:47 No.347  

ASCII code表というかIBM-PCのフォントセットのことですね。
罫線などのキャラクタは表示できますが、$00-$1Fの部分を
表示したい場合は試したことがないので分かりません。
コンソールの改行やTABなどの機能とコードがかぶってしまうので
普通の方法では使えなさそうです。


Re: すべての ASCII キャラクタを表示... maeha - 2005/02/14(Mon) 10:20 No.349  

ASCII キャラクタセットの 0xB3 から 0xDA には罫線が在りますが、私のマシンでは、
ヨーロッパ語の母音や記号などが表示され、罫線がどこにも見当たりません。
罫線を表示するには、どのようにしますか?

以上よろしくお願い致します。
maeha



Re: すべての ASCII キャラクタを表示... jun - 2005/02/16(Wed) 23:37 No.350  

ncursesなどで表示できるので、できるものだと思ってました。
echo -e "\254" で右上角は出ますが、他は表示できませんね。
ncursesのソースでも調べてください。


玄箱HG 投稿者:jun 投稿日:2005/01/28(Fri) 01:15 No.338  
玄箱がサーバとして非常に便利なので、バックアップ兼テスト環境用として
玄箱HGも購入しました。
ところが、テスト環境用は「同じ機種でないと意味がないかもしれない」
ということに気付いたところです。テストでOKだった環境をそのままメイン
環境にコピーしたいわけです。
玄箱1号機のシステムを玄箱HGで試したりすることにします。

母艦(Athlon64)も玄箱HGもギガビットのNICなので、家庭内LANもそろそろ
ギガビットに移行しようかなと思っています。一昔前では予想もできない事態
になっています。


Re: 玄箱HG jun - 2005/02/04(Fri) 23:10 No.344  

玄箱に httpd-2.0.52 + php-5.0.3 + postgres-8.0.1 をインストール。
そのほか、bind-8.4.5、postfix-2.1.5も動作していて立派なサーバに
なっています。grepのバージョンが低かったためphpのコンパイルに
苦労しました。玄箱と玄箱HGはまったく同じハードディスクイメージで
動作し、テスト、バックアップ環境も完璧です。

さて、なんに使おうか。


ライブラリ ファンクションの中身は? 投稿者:maeha 投稿日:2005/01/01(Sat) 09:51 No.327  

Junさん並びにこの掲示板をご覧の諸兄!

あけまして、オメデトウございます。
今年もよろしく、お願い申し上げます。

ライブラリ ファンクションのひとつである tcgetattr については、Jun さんの
"Linux でアセンブリプログラミング" の中でも詳述されていまして、そこでは
システムコールの ioctl により実行されています。

つまり一般的には、すべてのライブラリ ファンクションは内部では
システムコールで実行されていると言えますか?

以前に私は tcgetattr をアセンブラで実行するため、その内部を知りたいと思っていました。
そこで、

  tcgetattr(0,&stored_settings);

を gcc -S でアセンブル リストにしてみますと、

  pushl $stored_settings
  pushl $0
  call tcgetattr

と出ます。ここから先がわかりませんでした。
call tcgetattr とは、どこをコールしているのでしょう。
そのコール先はどうやって見つけますか?
tcgetattr が ioctl と TCGETS で実行する課程はどのようにして発見されましたか?
source code を解読することは可能ですか?

libc.a を見てみますと
tcgetattr.o:
00000074 t Letext
       U__ioctl
       U__mempcpy
00000000 T__tcgetattr
00000000 W tcgetattr
などと在りますが、なんのことか、サッパリわかりません。

このような問題に関して、何か良い書籍かウエブサイトはありませんか?

以上よろしくお願いいたします。

maeha



Re: ライブラリ ファンクションの中身... jun - 2005/01/01(Sat) 17:15 No.328  

おめでとうございます。

>つまり一般的には、すべてのライブラリ ファンクションは内部では
>システムコールで実行されていると言えますか?

ハードウェアに依存する機能やOSの機能(ファイルシステムなど)は
システムコールを実行しています。ライブラリのすべての機能という
わけではではないです。

libcなどのライブラリは通常はダイナミックリンクされるため、gcc -S
のリスト中には実体はありません。ライブラリをスタティックリンクして
逆アセンブルすると出てきまooてきます。

例えば tcgetattr は glibcのソースの sysdeps/unix/sysv/linux/tcgetattr.c
中で retval = INLINE_SYSCALL (ioctl, 3, fd, TCGETS, &k_termios);
となっていてシステムコールを呼び出しています。

さらに、sysdeps/unix/sysv/linux/i386/sysdep.h では
  333 #define INLINE_SYSCALL(name, nr, args...) \
  334  ({                                     \
  335   unsigned int resultvar = INTERNAL_SYSCALL (name, , nr, args);       \
  336   if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (resultvar, ), 0))     \
  337    {                                    \
  338     __set_errno (INTERNAL_SYSCALL_ERRNO (resultvar, ));          \
  339     resultvar = 0xffffffff;                        \
  340    }                                    \
  341   (int) resultvar; })

  378 # define INTERNAL_SYSCALL(name, err, nr, args...) \
  379  ({                                     \
  380   register unsigned int resultvar;                     \
  381   EXTRAVAR_##nr                               \
  382   asm volatile (                              \
  383   LOADARGS_##nr                               \
  384   "movl %1, %%eax\n\t"                           \
  385   "int $0x80\n\t"                              \
  386   RESTOREARGS_##nr                             \
  387   : "=a" (resultvar)                            \
  388   : "i" (__NR_##name) ASMFMT_##nr(args) : "memory", "cc");         \
  389   (int) resultvar; })

となっていて、int 0x80 を呼び出しています。

>このような問題に関して、何か良い書籍かウエブサイトはありませんか?

まとまった情報はないように思います。カーネルやglibcのソースをgrep -rnで
調べるしかないと思います。


Re: ライブラリ ファンクションの中身... maeha - 2005/01/13(Thu) 13:15 No.333  

いつも迅速にコメントをいただき誠に有難うございます。
それについてフォローしようとしてみましたが、以下のところが判然としません。

1) リブ ファンクションをスタティックリンクする方法。
 gcc -c hello.c
 gcc -o hello hello.o /usr/lib/libc.a
を試みましたが:
 /usr/bin/ld:BFD 2.12.90.0.1 20020307 Debian/GNU Linux assertion fail
 ../../bfd/elf-strtab.c:262
と出て巨大なELFができ実行するとsegmentation fault を起こします。
また、
 ld -lc -o hello hello.o
としてみましたら:
 ld:warning:cannot find entry symbol _start; defaulting to 08048190
と出てELFのfileはできるものの実行できません。

スタティックリンクを正当に行うには、どのようにするものですか?

2) 逆アセンブラーはアセンブラによっては、その機能が備わっているものもあるかと
 思われますが、私のfasm には在りません。

utility のような独立して使用できる逆アセンブラはありますか?

以上よろしくお願いいたします。
maeha



Re: ライブラリ ファンクションの中身... jun - 2005/01/15(Sat) 01:04 No.334  

gcc --static -o hello hello.c でスタティックリンク版のhelloができます。
libc.a は自動的にリンクされます。

逆アセンブラはどれでも「独立して使用」できると思います。
nasmに付属しているndisasmならば次のように実行します。

ndisasm -b 32 hello

また gdb hello でも disassemble でリストを表示できます。


Re: ライブラリ ファンクションの中身... maeha - 2005/01/25(Tue) 15:28 No.335  

お蔭様でスタティックリンクとgdbのdisassemble が理解できました。それにより、
tcgetattr を含むELF executable を main から tcgetattr,ioctl,int $0x80 え
たどることができ、よろこんでいます。有難うございました。

さて次に、
source の中身を調べようと思い、glibc を /home の directory に
ダウンロードしました。

Q1) もし source をコンパイルしてbinary にするような場合でもsource を
  どこの directory にダウンロードしてもコンパイルできるものでしょうか?
  /usr/src と言う directory が在りますがsource はそこにダウンロードすべき
  ものですか?

  source のコンパイルに必要なファイルは、そのダウンロードしたパッケージの中に
  全部揃っているのですか? 既存のファイルには依存しないのですか?

Q2) ダウンロードした glibc を開けてみましたら、ご指摘のように
  /sysdeps/unix/sysv/linux/tcgetattr.c が在りました。
  そこには:

/* Copyright (C) 1992, 1995, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. */
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <kernel_termios.h>

int
__tcgetattr (fd, termios_p)
  int fd;
  struct termios *termios_p;
{
  struct __kernel_termios k_termios;
  int retval;
  retval = __ioctl (fd, TCGETS, &k_termios);

  termios_p->c_iflag = k_termios.c_iflag;
  termios_p->c_oflag = k_termios.c_oflag;
  termios_p->c_cflag = k_termios.c_cflag;
  termios_p->c_lflag = k_termios.c_lflag;
  termios_p->c_line = k_termios.c_line;
   ・
   ・
   ・
  return retval;
}
weak_alias (__tcgetattr, tcgetattr)

  と在り、いきなり __ioctl をコールしています。
  これより先がわからず、 int 0x80 までたどりつけません。
  どうしたものでしょうか?

  ioctl などのファンクション名の前にアンダースコア __ が付いているのは、
  どう言う意味ですか?

以上よろしくお願い致します。
maeha


Re: ライブラリ ファンクションの中身... jun - 2005/01/26(Wed) 00:43 No.336  

A1) ソースはどこでコンパイルしてOKです。
  依存関係はライブラリの種類によってまちまちです。
  README、INSTALLなどの文書に記述しているはずです。

  glibcはコンパイルしていきなりインストールすると危険です。
  最悪の場合、すべてのコマンドが動作しなくなります。

A2) _ioctlはどこかで定義されているはずです。探すしかありません。
  私が調べたglibcは glibc-2.3.3 だったと思います。
  アンダースコアの理由は分かりません。関数名が衝突しないように
  付けているものだと思います。


64ビット版J3W 投稿者:jun 投稿日:2005/01/06(Thu) 00:26 No.332  
大晦日に Athlon64 3000+, ASUS A8V Deluxe, radeon9550 を衝動買いして、
WindowsXP、Fedra Core 3 Linux (x86_64)をインストールしてみました。

Fedra Core 3の64ビット版はディスプレイの検出がうまくいかなくて
解像度をXorg.confの修正で設定したところと、ブートローダ(GRUB)が
不調でGRUBを別にインストールし直した以外は順調です。

J3Wをコンパイルしてみたところ、/j3w-645/source/j3w/Makefile を
次のように変更するだけでビルドできました。

ifeq ($(OS),SOLARIS)
  CFLAGS += -I/usr/openwin/share/include -L/usr/openwin/lib
else
-  CFLAGS += -I/usr/X11R6/include -L/usr/X11R6/lib
+  CFLAGS += -I/usr/X11R6/include -L/usr/X11R6/lib64
endif

Xのライブラリの場所を /usr/X11R6/lib から /usr/X11R6/lib64 に
変更しています。

# file j3w
j3w: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV),
for GNU/Linux 2.4.0, dynamically linked (uses shared libs), stripped
ちゃんと64ビットの実行ファイルになっています。

j3w の strip後のサイズは 32ビット版が 83,824バイト、64ビット版が
97,344バイトで思ったより大きくなっていません。

j3w -f tubo.j3d で速度を比較した結果、32ビット版のj3wで243.5FPS、
64ビット版のj3wで259.4FPSでした。速度の違いは gcc-3.3.4とgcc-3.4.2
の差によるものでしょう。とにかく32ビット版の実行ファイルも64bit
Linuxで問題なく動作しています。

j3c、j3dasm、j3w ともに64ビットでコンパイルしても*ほぼ*動作する
ようです。タコの隣の昆布の表示がおかしいなどの不具合は今後修正する
つもりです。

yasmもインストールしたし、また新しいCPUで遊べそうです。


ご質問「JDU ver.2.01」について 投稿者:けい 投稿日:2004/12/28(Tue) 02:29 No.324  
はじめまして。けいと申します。

「JDU ver.2.01」を使用させていただいています。
ファイル管理が容易に行えるのでとても役立っています。

ところでご質問なのですが、
たまに単一ファイル(圧縮ファイル)に対してのファイルサイズがマイナス表示されることがあります。
私の環境(Win2K)ではこのように表示されます。
プロパティ上のサイズ:「 2,318,524,396bytes」
JDU表示上のサイズ:「-1,976,442,900bytes」

単一2GB以上(1GBはOKぽかったです)のファイルだとマイナス表示されてしまうのでしょうか?

用件のみのカキコで申し訳ありませんが、ご確認願えないでしょうか?


Re: ご質問「JDU ver.2.01」について jun - 2004/12/29(Wed) 00:47 No.325  

けいさん、はじめまして。

jduで扱えるファイルサイズの上限はご指摘のように2GBまでです。
最近のHDDの容量の増加に対応するため2GB以上のファイルに対応する
ように修正する予定です。2-3日時間をください。
こちらに修正版を置きますのでテストしていただけますか?


Re: ご質問「JDU ver.2.01」について けい - 2004/12/29(Wed) 22:57 No.326  

junさんこんばんわ。

迅速な対応をありがとうございます。
上記の件、了解いたしました。
もう年末ですし、いろいろとご用事もあると思いますので
ごゆるりと対応していただけたらと思います。


jdu ver.2.02 jun - 2005/01/03(Mon) 20:38 No.329  

2GB以上のファイルに対応した jdu ver.2.02 です。
http://www.nk.rim.or.jp/~jun/jdu/ に置きました。


Re: ご質問「JDU ver.2.01」について けい - 2005/01/04(Tue) 05:31 No.330  

明けましておめでとうございます。けいです。

Ver2.02を確認させていただきました。
私の環境で単一ファイルサイズが最大5Gまで正当に表示されているのが
確認できました。

迅速な対応をありがとうございました。
月並みな表現で申し訳ありませんが、これからも頑張って下さい。

それでは。


Re: ご質問「JDU ver.2.01」について jun - 2005/01/04(Tue) 13:15 No.331  

手元の環境(FAT32)ではファイルサイズの制限があって4GBまでは
確認しましたが、それ以上は確認できませんでした。
さっそく5GBで確認していただいて、ありがとうございます。

9,223,372,036,854,775,807バイトまでは大丈夫と思います。


フレームバッファのテストプログラム試... 投稿者:maeha 投稿日:2004/12/08(Wed) 14:50 No.319  
こんにちは

お蔭様で Framebuffer Device の使用できることがわかりました。
そこで、テストのため、色の data を表示する program を
作りましたので、ご覧ください。

この program は Framebuffer の端から順に、そこに色の data を
increment しながら書き込み画面上部に表示します。

vga=317 で実行できます。vga=311 でするには、stosw命令の直前の
mov ecx,32 を mov ecx,30 に変更により可能です。
vga=317 では色は 16bit あり、一度に全部は書ききれませんので、
順次、自動にスクロールし、一順で終了します。
私のマシンでは40秒ほどかかります。vga=311 では25秒ほどです。

この source program は fasm の表記ですので、他の assembler には
少し修正が必要になります。

以上よろしくお願いいたします。

maeha

; - - - - - - - - - - - - - - - - - - - - - - -
; Color Rectangles in Framebuffer Device
; vga = 317 single Rectangle scrole

format ELF executable

entry start

section readable writeable

fb db '/dev/fb0',0
mm_start dd 0
mm_length dd 524288 ; 64 * 4 scanLine * 2048
mm_port dd 3 ; PROT_READ|PROT_WRITE
mm_flags dd 1 ; MAP_SHARED
mm_fd dd ?
mm_offset dd 0
ScreenAddr dd ?
ColorPos dd ?
ColorBegin dw ?

start:
lea ebx,[fb]
mov ecx,2 ; O_RDWR
mov eax,5 ; open
int 80h
mov [mm_fd],eax

lea ebx,[mm_start]
mov eax,90 ; mmap
int 80h
mov [ScreenAddr],eax

; - - - - Color Rectangle - - - -
test eax,80000000h
jnz error
mov [ColorBegin],0h ;color starts from 0h
cld
LoopRectangle:
mov bx,[ColorBegin]
add [ColorBegin],32 ;Advance color to next Rectangle
mov edi,[ScreenAddr]
mov ecx,64 ;number of Element Line in Rectangle
LineElement:
push ecx
mov ecx,4 ;number of Scan Line in Element
LineScan:
mov ax,bx ;repeat same color in Element
push ecx
mov ecx,32 ;Number of Element in Scan line
Element:
push ecx
; mov ecx,20 ;Scan Pixels in Element for vga=311
mov ecx,32 ;Scan Pixels in Element for vga=317
rep stosw ;store pixels into scanning line
inc ax ;next color
pop ecx ;Number of Element remaining
loop Element ;right most Element?
pop ecx ;end of scan line?
loop LineScan
pop ecx ;end of Rectangle?
mov bx,ax ;reserve color for next Element Line
loop LineElement
cmp [ColorBegin],0 ;looped all color?
jnz LoopRectangle
error:
mov eax,91 ;munmap
mov ebx,[ScreenAddr]
mov ecx,[mm_length]
int 80h

mov eax,6 ; close
mov ebx,[mm_fd]
int 80h

mov eax, 1
xor ebx, ebx
int 0x80 ; exit
; - - - - - - - - - - - - - - - - - - - - - - - - - -





Re: フレームバッファのテストプログラ... jun - 2004/12/09(Thu) 20:04 No.320  

vga=317 で2-3秒でした。
fasmはよく分からなかったので nasm 用に書き直して実行しました。
この掲示板ではインデントができない(スペースが潰れる)ので
全角空白を使っています。

; - - - - - - - - - - - - - - - - - - - - - - -
; Color Rectangles in Framebuffer Device
; vga = 317 single Rectangle scrole

;format ELF executable

;entry start

section .text

global _start

_start:

  lea   ebx, [fb]
  mov   ecx, 2         ; O_RDWR
  mov   eax, 5         ; open
  int   0x80
  mov   [mm_fd], eax

  lea   ebx, [mm_start]
  mov   eax, 90         ; mmap
  int   0x80
  mov   dword [ScreenAddr], eax

; - - - - Color Rectangle - - - -
  test  eax, 0x80000000
  jnz   error
  mov   word [ColorBegin], 0  ;color starts from 0h
  cld
LoopRectangle:
  mov   bx, [ColorBegin]
  add   word [ColorBegin], 32  ;Advance color to next Rectangle
  mov   edi,[ScreenAddr]
  mov   ecx,64         ;number of Element Line in Rectangle
LineElement:
  push  ecx
  mov   ecx, 4         ;number of Scan Line in Element

LineScan:
  mov   ax, bx         ;repeat same color in Element
  push  ecx
  mov   ecx, 32         ;Number of Element in Scan line

Element:
  push  ecx
  ; mov ecx,20          ;Scan Pixels in Element for vga=311
  mov   ecx, 32         ;Scan Pixels in Element for vga=317
  rep   stosw          ;store pixels into scanning line
  inc   ax           ;next color
  pop   ecx           ;Number of Element remaining
  loop  Element         ;right most Element?
  pop   ecx           ;end of scan line?
  loop  LineScan
  pop   ecx           ;end of Rectangle?
  mov   bx, ax         ;reserve color for next Element Line
  loop  LineElement
  cmp   word [ColorBegin], 0  ;looped all color?
  jnz   LoopRectangle
error:
  mov   eax, 91         ;munmap
  mov   ebx, [ScreenAddr]
  mov   ecx, [mm_length]
  int   0x80

  mov   eax, 6         ; close
  mov   ebx, [mm_fd]
  int   0x80

  mov   eax, 1
  xor   ebx, ebx
  int   0x80          ; exit

section .data
  fb     db "/dev/fb0", 0
  mm_start  dd 0
  mm_length  dd 524288  ; 64 * 4 scanLine * 2048
  mm_port   dd 3    ; PROT_READ|PROT_WRITE
  mm_flags  dd 1    ; MAP_SHARED
  mm_fd    dd 0
  mm_offset  dd 0
  ScreenAddr dd 0
  ColorPos  dd 0
  ColorBegin dw 0
; - - - - - - - - - - - - - - - - - - - - - - - - - -


Re: フレームバッファのテストプログラ... maeha - 2004/12/10(Fri) 20:35 No.321  

全く驚きましたね、vga=317 で2-3秒とは、驚異的スピードですね。
それで青から赤まで全部 32枚スクロールしているのでしょうね。
この速度の相異はどこからくるのでしょう。
単に Hardware の相異によるものでしょうか。
私のは Pentium 4 1.8GHz Ram=128MB ですが、
Ramの容量に関係するものでしょうか。
またもや、頭の中に????印がでてしまいました。

ところで、全角空白とは、どうやって使いますか?

maeha


Re: フレームバッファのテストプログラ... jun - 2004/12/11(Sat) 02:12 No.322  

確認のために、少し簡単にしてみました。
同じ色で1024*768の全画面を塗りつぶすことを10回繰り返し、
これを1000回色を変えて繰り返します。計10000回の全画面を塗りつぶし
になります。

実行すると、
~$ time ./fbtest
real 0m15.664s
user 0m15.664s
sys 0m0.000s
のように15秒程度でした。これを実行した環境は Pentium4 2.25GHz
チップは845GEで、デスクトップとしては古いものです。
メモリは512MBですが、関係あるとは思えません。
15秒は予想より速いのですが、Pentium4は1命令を1ns以下で実行するため
「こんなものかな」とも思います。

;-----------------------------
; fbtest
;-----------------------------
section .text

global _start

_start:
  mov   ebx, fb
  mov   ecx, 2         ; O_RDWR
  mov   eax, 5         ; open
  int   0x80
  mov   [mm_fd], eax
  mov   ebx, mm_start
  mov   eax, 90         ; mmap
  int   0x80
  mov   [ScreenAddr], eax
  cld
  mov   edx, 1000
Loop10:
  add   ax, 0x0821
  mov   ebx, 10
LoopScreen:
  mov   edi, [ScreenAddr]
  mov   ecx, 1024*768
  rep   stosw          ;store pixels into screen
  dec   ebx
  jnz   LoopScreen
  dec   edx
  jnz   Loop10

  mov   eax, 91         ;munmap
  mov   ebx, [ScreenAddr]
  mov   ecx, [mm_length]
  int   0x80

  mov   eax, 6         ; close
  mov   ebx, [mm_fd]
  int   0x80

  mov   eax, 1
  xor   ebx, ebx
  int   0x80          ; exit

section .data
  fb     db "/dev/fb0", 0
  mm_start  dd 0
  mm_length  dd 1572864 ; 768 * 2048
  mm_port   dd 3    ; PROT_READ|PROT_WRITE
  mm_flags  dd 1    ; MAP_SHARED
  mm_fd    dd 0
  mm_offset  dd 0
  ScreenAddr dd 0
;-----------------------------

単にスペース2つを全角空白に置換しているだけです。


Re: フレームバッファのテストプログラ... maeha - 2004/12/13(Mon) 14:19 No.323  

Junさんのfbtest(全面10000枚)をやりましたら、10分かかりました。
私のスクロール式を全面式にするには
   mov ecx,4 ;number of Scan Line in Element
を3倍の
   mov ecx,12
にします。
スクロール式のときは2048枚を描いています。
全面スクロールにすると、私の場合2分かかりました。

このたびは、マシンにより、かくも速度に差があることを理解しました。

maeha



色をつけるには? 投稿者:maeha 投稿日:2004/11/24(Wed) 11:33 No.313  
こんにちは、

Linux を勉強中のmaeha です。
Console programming を習得したいと思っています。

そこで、jun さんの”Linuxでアセンブリプログラミング”にも
あります例の"Hello,World"ですが、これに赤とか緑とか
色をつけるには、どうするのでしょうか?
ls command では出力に色がつきますが。

以上よろしくお願いいたします。
maeha


Re: 色をつけるには? jun - 2004/11/26(Fri) 00:24 No.315  

エスケープシーケンスを使います。
例えば緑にするには、^[[32m と出力します。
^[ は文字コードが27の文字です。

コンソールで簡単にテストできます。ESCキーを<ESC>とした場合、
cat
<ESC>[32m
と入力するとその後の文字は緑になります。
"<ESC>[32m" の部分は表示されません。
32の部分に 30 から 37 に変更すると前景色が変化します。
40 から 47 の場合は背景色が変化します。39、49ではデフォルト
の色に戻ります。


Re: 色をつけるには? maeha - 2004/11/28(Sun) 11:53 No.316  

Escape sequence と言うものを全然知りませんでした。
そこで、何時ものようにGoogleで小さな資料をいくつか集めて参考としました。
その結果:

msg db 27,'[32;45m',27,'[5d',27,'[30G',\
'Hello, World.',\
27,'[37;40m',13,10

これで色がつきました。ついでにCursorも移動しました。

この escape sequence というものは一見 terminal 上の機能のように見えますね。
curses library が必要なものかと思っていました。
curses でも中身はこれでやっているのでしょうか。
とにかく、また一歩前進できて、ありがとうございました。

maeha


Re: 色をつけるには? jun - 2004/11/28(Sun) 23:48 No.317  

エスケープシーケンスは端末の機能です。したがって端末の種類によって
異なる場合があります。とはいってもDECのVT100が事実上の標準です。
LinuxターミナルもVT100とほぼ互換です。
cursesもエスケープシーケンスを使って実現しています。機種の違いを
吸収するため、terminfoなどのDBを使います。


Re: 色をつけるには? maeha - 2004/11/29(Mon) 10:54 No.318  

毎度有難うございます。

先の私のpost では source text を記入しましたが、
行の先頭に space を入れて indent しましたのに、
返信してみると、ご覧のようにspace がなく左詰めになり、
見にくくなってしまいました。

indent した行は表示できませんか?
maeha



初めてのPowerPC 投稿者:jun 投稿日:2004/07/24(Sat) 01:36 No.277  
昨日というか、もう一昨日ですが、玄人志向の玄箱が届きました。
http://www.kuroutoshikou.com/products/kuro-box/kuro-boxfset.html

PowerPC 200MHz, RAM:64MB, 100BASE-TX/10BASE-T, USB2.0 のLinux環境
が15000円程度で入手できます。当面ネットワークストレージとして使う
予定もないので、HDDは余っているIBMの10Gを接続しました。

telnetでログインすると普通のLinuxです。省電力Linuxサーバとして
利用することになると思いますが、まずは初めての PowerPC です。
アセンブラ(GNU as)で遊んでみることにします。ちょっと調べると、MIPSと
ARMの中間のような感じです。

Linuxでは、システムコール番号を r0、引数を r3以降に設定して、sc 命令で
システムコールを実行すれば良いようです。 GNU as の info では PowerPC
の解説が(ほとんど)無いので binutils のソースを調べてみようと思います。
「PowerPC Assembly on 玄箱-Linux」が書けるだけ根性が持つか?


Re: 初めてのPowerPC jun - 2004/08/01(Sun) 00:58 No.280  

ということで、binutils のソースを眺めていますが PowerPCは大変です。

アセンブラで使えるPowerPC系のニーモニックは2362個で、玄箱で使える
と思われるものだけで693個もあります。RISCじゃないの?

アセンブリ言語では整数演算、データ転送、分岐、比較の一部の命令で
普通は十分なはずなので、使いそうな命令を覚えやすいように整理中。


Re: 初めてのPowerPC jun - 2004/08/03(Tue) 01:35 No.285  

PowerPCのニーモニック(命令)が多くて複雑に見える理由が分かったつもりです。

比較命令(cmpXXX)の結果を格納するコントロールレジスタ(ステータスレジスタ)
が8セットあり、比較結果のステータスの保存先を指定可能で、分岐命令でどの
ステータスを使うか指定できるためです。さらに各ステータス間で条件演算できます。
ただし、整数演算の結果はcr0、浮動小数点演算の結果はcr1に返されることが
決まっているようです。

比較の結果(状態)を複数保持できるようにした理由は、実行速度の低下の
原因となる分岐命令を減らすために考えられたアイデアではないでしょうか。
複雑な条件でも、比較の結果を別々のコントロールレジスタに保存し、条件間の
論理演算を行うことで1回の条件分岐で実現できます。ARMの条件実行とは異なる
アプローチです。

15000円ほどで、かなり長い間遊べそうな玄箱はお買い得感満載です。


Re: 初めてのPowerPC jun - 2004/08/09(Mon) 02:30 No.291  

玄箱(ノーマル)の環境で binutils-2.15 をコンパイルしようとしたところ、
/bin/true がないためエラー。せっかくなのでアセンブラで作成。

# true.s
.text
.align 2
.global _start
_start:
li 3, 0
li 0, 1 # sys_exit
sc

次のようにアセンブルして、実行形式を作成。
as -o true.o true.s
ld -o true true.o
su して、/binにコピー
cp true /bin

で、普通にコンパイル。

tar zxf binutils-2.15.tar.gz
cd binutils-2.15
./configure
time make
real 24m25.342s
user 20m44.600s
sys 3m25.480s
1465秒かかりました。

make install
cd /usr/local/bin

root@KURO-BOX:/usr/local/bin# ls -lt
total 24360
-rwxr-xr-x 2 root root 2287606 Aug 9 02:18 ld
-rwxr-xr-x 1 root root 1874872 Aug 9 02:18 gprof
-rwxr-xr-x 2 root root 2153150 Aug 9 02:18 as
-rwxr-xr-x 1 root root 1674660 Aug 9 02:18 c++filt
-rwxr-xr-x 2 root root 2098604 Aug 9 02:18 strip
-rwxr-xr-x 2 root root 1728684 Aug 9 02:18 nm
-rwxr-xr-x 1 root root 594654 Aug 9 02:18 readelf
-rwxr-xr-x 1 root root 1722336 Aug 9 02:18 addr2line
-rwxr-xr-x 1 root root 2098605 Aug 9 02:18 objcopy
-rwxr-xr-x 2 root root 1564580 Aug 9 02:18 ranlib
-rwxr-xr-x 1 root root 1530719 Aug 9 02:18 strings
-rwxr-xr-x 2 root root 1562233 Aug 9 02:18 ar
-rwxr-xr-x 1 root root 2252214 Aug 9 02:18 objdump
-rwxr-xr-x 1 root root 1495208 Aug 9 02:18 size
-rwxr-xr-x 1 root root 215426 Aug 9 01:15 gasp

root@KURO-BOX:/usr/local/bin# strip *
root@KURO-BOX:/usr/local/bin# ls -lt
total 7556
-rwxr-xr-x 1 root root 740880 Aug 9 02:23 objdump
-rwxr-xr-x 2 root root 453496 Aug 9 02:23 ranlib
-rwxr-xr-x 1 root root 217228 Aug 9 02:23 readelf
-rwxr-xr-x 1 root root 429952 Aug 9 02:23 size
-rwxr-xr-x 1 root root 430428 Aug 9 02:23 strings
-rwxr-xr-x 2 root root 651460 Aug 9 02:23 strip
-rwxr-xr-x 1 root root 486504 Aug 9 02:23 addr2line
-rwxr-xr-x 2 root root 453496 Aug 9 02:23 ar
-rwxr-xr-x 2 root root 712584 Aug 9 02:23 as
-rwxr-xr-x 1 root root 485424 Aug 9 02:23 c++filt
-rwxr-xr-x 1 root root 54212 Aug 9 02:23 gasp
-rwxr-xr-x 1 root root 555908 Aug 9 02:23 gprof
-rwxr-xr-x 2 root root 825692 Aug 9 02:23 ld
-rwxr-xr-x 2 root root 499056 Aug 9 02:23 nm
-rwxr-xr-x 1 root root 651460 Aug 9 02:23 objcopy

前にPentium4 2.2Gでコンパイルした時の結果は、
time make
real 3m41.571s
user 2m44.136s
sys 0m37.684s
でしたので、1465s/222s=6.6倍の時間を要しています。

この結果から算出できる Pentium4 2.2G のPCの値段は、
1,5000円x6.6 = 98,900円
となります。玄箱の価格は激安と言うわけではありませんね。

しかし、PowerPC 200MHz は同じクロックのPen4の約2倍の性能ということ
ができます。やっぱり、お買得!


苦労箱にならないことを祈りつつ ODIN - 2004/09/05(Sun) 16:08 No.300  

おひさしぶりです。ODINです。

お話を拝見して、サーバ機として良さそうなので、私も玄箱を購入してしまいました。
開封後1時間も経たずにネットワーク接続可能なLinux機ができあがるのには感動です。
あまりレベルの高いことはできませんが、色々と遊んでみたいと思っています(^-^)


Re: 初めてのPowerPC jun - 2004/09/05(Sun) 20:03 No.301  

ODINさん、おひさしぶりです。

うちの玄箱は、またライブラリをいじっていたら起動しなくなり、
分解したら今度は電源が入らなくなりなってしまいました。
電源スイッチがまったく反応しないので、電源周りを調べてたところ、
ヒューズが切れたようでした。今は応急処置(ヒューズの部分を接続)
で復旧しました。久しぶりにテスターや半田ごてを使いました。
サーバ機として安定して運用する前に壊してしまいそうです。


Re: 初めてのPowerPC 起田(stoc) - 2004/10/10(Sun) 13:29 No.310   <Home>

junさん、お久しぶりです。

以前Webサイトのリンク依頼をしたstocこと起田(okita)です。

玄箱面白そうですね。Celeron300MHz x 2の自作機をバックアップ用
サーバに使っているのですが、結構電気代がかかっているので私も
玄箱に挑戦してみようかと思います。もし購入したら、私もはじめて
のPowerPCになります。





Re: 初めてのPowerPC jun - 2004/10/12(Tue) 23:39 No.311  

起田さん、お久しぶりです。
どんどんコンテンツが充実していますね。私は最近さっぱりです。
中途半端なネタはあるのですが、まとまりがつかないです。
PowerPCもGASでちょっとしたプログラムは作成しましたが、
ページにまとめるほどではありません。

玄箱は家族に知られずにLinuxBoxを増殖させるのに便利です。
ただし、やはりCPUを多く使う仕事には向いていません。
ルートファイルシステムが630MBほどになってきたので、EMモードから
丸ごとtarでバックアップしました。これは数分で終わったのですが、
このファイル(560MB)をgzipで圧縮して157MBのtar.gzにするのに
2時間35分かかりました。転送してからPCで圧縮すべきでした。


Re: 初めてのPowerPC 起田(stoc) - 2004/10/13(Wed) 19:36 No.312   <Home>

junさん こんばんは起田です。

レス有難うございます。

>どんどんコンテンツが充実していますね。私は最近さっぱりです。
そうですね。私の場合調べたメモ書きを即サーバにアップデートしているので
文章や情報が正しくなかったりしますが、最近はどんどん増えています。
数ヵ月後、知識が増えた時に読み返すと間違いに気付いたりするのでそれも勉強に
なっています。


>このファイル(560MB)をgzipで圧縮して157MBのtar.gzにするのに
>2時間35分かかりました。転送してからPCで圧縮すべきでした。
ここまでくると、夜間バッチ処理ですね(笑)。私も購入した際には
いろいろな圧縮ツールで速度検証とかしてみたいと思います。
それと、玄箱で以下の検証もしてみたいです。。

http://www.oklab.org/performance/program_index.html



玄箱のglibc-2.2.5化 投稿者:jun 投稿日:2004/09/08(Wed) 00:57 No.303  
glibbc-2.3.3は、ld-2.3.3.so --list が動作しなかったため、今度は
glibc-2.2.5をセルフコンパイルしてみました。

結構苦労したので、経過をメモしておきます。

1.玄箱に10GBのハードディスクを接続して、普通にインストール。
2.Ver1.02のファームウェアをアップデート。
3.付属CDの binary 以下のファイルを / で展開。
4./bin/true と /bin/pwd がないため、次のように作成。
  ln -s /bin/busybox /bin/true
  ln -s /bin/busybox /bin/pwd
5.binutils-2.15.tarをコンパイル。
6.nohupが使いたいので、coreutils-5.2.1をコンパイル。
7.cpp (Cプリプロセッサ)がglibcのコンパイルに必要なため、
  gcc-2.95.3 をCとC++を指定してコンパイルしてインストール。
8.glibc-2.2.5のコンパイルで、makeinfoで失敗する部分があるため、
  ln -s /bin/true /usr/local/bin/makeinfo
  として一時的にmakeinfoを使わなくする。
9.glibc-2.2.5をコンパイル、インストール。

以上で約5時間でした。


セルフコンパイル所要時間一覧 jun - 2004/09/28(Tue) 00:06 No.309  

玄箱で色々なパッケージをセルフコンパイルしてみました。
make にかかった時間の一覧です。make check や make test で
時間ががかるものもありますが、純粋に「make」の所要時間です。

131分29秒  gcc-2.95.3 (C,C++)
127分32秒  glibc-2.2.5
 61分03秒  gdb-6.2
 44分06秒  perl-5.8.5
 42分08秒  php-5.0.1
 40分18秒  postgresql-7.4.5
 33分57秒  samba-2.2.11
 30分36秒  Python-2.3.4
 27分23秒  libxml2-2.6.10
 21分00秒  openssl-0.9.7d
 17分39秒  httpd-2.0.50
 17分17秒  gettext-0.14
 16分26秒  groff-1.19.1
 14分53秒  bind-8.4.4.
 13分13秒  gmp-4.1.3
 12分30秒  ruby-1.8.1
  9分42秒  e2fsprogs-1.35
  8分47秒  openssh-3.9p1
  8分08秒  bison-1.875
  8分06秒  coreutils-5.2.1
  8分03秒  postfix-2.1.4
  7分49秒  binutils-2.15
  4分48秒  screen-4.0.2
  4分34秒  texinfo-4.7
  4分23秒  bash-3.0
  3分43秒  gawk-3.1.4
  2分29秒  readline-5.0
  2分27秒  flex-2.5.4a
  2分14秒  tar-1.14
  1分56秒  wget-1.9.1
  1分46秒  libpng-1.2.6-config
  1分44秒  make-3.80
  1分43秒  lv451
  1分24秒  ncurses-5.4
  1分17秒  less-382
  1分14秒  man-1.5n
  1分14秒  bzip2-1.0.2
  1分10秒  m4-1.4.2
  1分09秒  Linux-PAM-0.77
  1分05秒  sed-4.1.2
  1分05秒  findutils-4.1.20
  0分59秒  file-4.08
  0分59秒  shtool-2.0.1
  0分57秒  patch-2.5.9
  0分44秒  gzip-1.3.5
  0分43秒  zlib-1.1.4
  0分41秒  lha-114g
  0分32秒  autoconf-2.59b
  0分33秒  libtool-1.5.8
  0分20秒  ntp-4.2.0
  0分12秒  which-2.16
  0分05秒  time-1.7
  0分02秒  automake-1.9.1

どれも普通にコンパイルでき、玄箱も普通のLinuxマシンであることを
再確認。


玄箱経由で日本語ファイル名を使う 投稿者:jun 投稿日:2004/09/22(Wed) 01:48 No.308  
玄箱に USB2-SCSI 変換ケーブル(ロジテック LUB-SC2)で接続した SCSI MO で、
Windows フォーマットの MO に対して samba 経由で日本語ファイル名のファイル
が書けないことに気付きました。

/etc/fstab には次のように記述していました。

/dev/sda /mo vfat user,rw,noauto,codepage=932,iocharset=euc-jp,umask=0 1 1

で、/etc/samba/smb.conf を見ると coding system = sjis になってました。
coding system = euc に変更して、smbd に HUP を送って、ln -s /mo /mnt/share/mo
して、mount /mo することで無事に samba 経由で MO に日本語ファイル名を書くことが
できました。しかし、再起動すると coding system = sjis に戻ってしまうため、
/etc/samba/smb.conf.kuro に以下の行を追加。

[global]
coding system = euc

これで再起動してもファイル名の文字コードは EUC となります。

ついでにDVDの読み込みを試してみました。/etc/fstab に次の行を追加。
/dev/scd0 /cdrom iso9660 user,ro,noauto,iocharset=euc-jp,umask=0 1 1

マウントポイントとして /cdrom を用意。
# mkdir /cdrom

samba で見えるように
# cd /mnt/share
# ln -s /cdrom .

シフトJISとEUCの変換がうまくいかない場合もありますが、玄箱にUSBで接続した
記録デバイスで日本語ファイル名が使えるようになりました。