'Programming'에 해당되는 글 58건

  1. 2007.10.17 간만에 포스팅.. 소스 고치기! 2
  2. 2007.07.21 부트섹터에서 프로그램 실행시키기. 14
  3. 2007.07.01 메모리 직접 접근의 유용성 (memcpy) 3
  4. 2007.06.28 리눅스에서 2기가 이상인 파일에 접근하기 4
  5. 2007.06.18 압축플때 쓰는 쉘 스크립트 4

간만에 포스팅.. 소스 고치기!


한 이틀전에 한거지만..

그래도 기록상 남겨야지 ㅋ

전에 KLDP에 글을 올려서 물어본적이 있었다 screen에서 토글하는거에 대해서,

그런데 other를 써서 바로전에 세션만 토글이 가능하다고 하네...

그래서 결국 오늘

screen소스 수정을 해서.. 정해진 세션 번호대로 토글이 가능해게 해놨다..

어떻게 고쳤냐면.;
~/.screenrc 파일에

bindkey -k F3 other 1 3
이런식으로 적어노으면 1 <-> 3 간에 토글이 가능하게 하는것이닷!!..

현재세션이랑 이동할려는 세션이렇게 할려고 했느데 단축키가 부족해서 ㅋ

소스파일 열라게 뒤져가지고 (process.c, comm.c) 겨우해결..

comm.c에서 other의 인수 숫자를 몇개 더 받게 늘린다음 (이거 안맞치면 아예

other 기능이 안되더라..;;)

process.c파일에서 각인수를 받게한거 가지고 SwitchWindow였나 그 함수를 적절히

if문써가지고 나타 내면 되었다...

그래서 고친건 한 열줄정도 되서 별거 아닌거 같은데...

"그 기능을 하게 할수 있는 define 이나 구조체를 찾는데 애먹었다는거.."

만세!! 인제 screen도 토글된다..ㅋ


그리고 w3m을 컴파일하는데 이번는 이상하게

Can't find termcap entry TERM 이렇게 에러메세지를 뿌리는데..

terms.c파일에 보니까 tgetent라는 함수에서 ERR나던것..

그래서 임시로 파일하나만들고 이함수를 써가지고 테스트로 한번 해봤는데..

잘되네..이상하네.. 그럼 소스 문제가 아닌데.. 하고 있었는데.. 아 컴파일 옵션이 좀

수상쩍다 싶에서 Makefile안에(in) LIB= 에 -lncursesw 를 추가해주니까


정상적이게 그림도 잘나오네...

글다썻다 쟈야지 ㅋ

'Programming' 카테고리의 다른 글

qt, arm 보드에 포팅방법  (6) 2008.12.05
쉘스크립트 하는데  (7) 2008.02.04
Nanika를 써보고 나는 생각들  (5) 2007.06.16
X!!- key_grab  (2) 2007.02.26
c로 cp 프로그램 작성  (5) 2006.05.14

부트섹터에서 프로그램 실행시키기.

;파일 시스템을 배운 보람(?) 이 있습니다..
;저기 FAT12다루는 부분.. FAT16이랑 비슷합니다..
;파일시스템도 fat만 거의 다 끝내놓고 더이상 진적이 없는..
;과연 스터디는 할수 있을지..
;모책을 보고 있는 예제를 혼자서 비스므리 하게 짜봤습니다
;모르는 부분은 상당히 보고 했으므로 비슷한 부분이 많을듯.
;nask라는 이상한(?) 어셈블러로 해서 nasm이랑 약간 문법이 틀린데가 있습니다
;resb는 nasm의 times로 어떻게 대체 가능한합니다.
;부트섹터에서 부트섹터 외에 있는 프로그램으로 이동시켜서 실행하게 해주는 프로그램이
;부트로더인모양? 초보라 잘 모르겠네요.
;개인 기억용, 틀려도 절대 책임같은건 지지 않음..(아마 틀린거 많을걸?)
;영어에 태클 걸지 말것!

부연설명 (잊어버릴까봐..)
mov ax,0 ; ax = 0
int 0x10  ;번호에 해당하는 인터럽트 발생
(쉽게 말해 ax,bx,cx,dx,같은게 인자고 이걸사용하면 함수를 부르는거라 생각하면 될듯)

inc  ax   ; ax ++
dec ax    ; ax--
add ax,3  ; ax = ax + 3
sub ax,3  ; ax = ax - 3

cmp ax,3  ; if문, ax가 (뒤에 따라 점프)
jmp lable; goto label
jc        : jump carry,에러가 난다면.. 점프
je        ; jump equal 같으면 점프
jb        ; jemp below 작으면 점프
jbe       ; jemp below equal 작거나 같으면 점프
jnc       ; jemp not carry

db        ; byte (db 0x00 이면 현재위치에 1byte 만큼 0을 쓴다 라는 뜻인듯)
dw        ;word  (마찬가지)
dd        ; double word (마찬가지)

[]         ; c와 같다(배열과 포인터에 나오는 그거임... *(변수))
$          ; 현재 위치
resb      ; 0로 범위까지 채운다 (nasm에는 없음 times로 대체)

;main
;Program start place
ORG 0x7c00

;#define READ_CYRINDERS 10
READ_CYLINDER EQU 10

;FAT12 Boot record setting
jmp init_register       ;Jump boot code (3byte)
db  0x90                 ;padding (jump boot code)
db  "Lowid   "           ;OEM Name (8byte)
dw  512                  ;Bytes per secter
db  1                     ;Secter per Cluster
dw  1                     ;Reserved Secter count
db  2                     ;Number of fats
dw  224                  ;Boot entry count
dw  2880                ;Total secter 16
db  0xf0                 ;Media(now,floppy disk)
dw  9                    ;Fat size 16
dw  18                   ;Sector per track
dw  2                    ;Number of heads
dd  0                    ;Hidden secter    (no use partition)
dd  2280                ;Total secter32?? (drive size)
db  0                    ;Drive Number
db  0                    ;Reseved1
db  0x29                ;Boot signature(must 0x29?)
dd  0xffffffff        ;Volume serial num??
db  "Lowid_vol  "       ;Volume label (11byte)
db  "FAT12   "          ;Filesystem Type (8byte)
resb 18

init_register:
    mov ax,0
    mov sp,0x7c00
    mov ds,ax
    mov ss,ax

;(Read)Segment + offset
    mov ax,0x0820
    mov es,ax
    mov bx,0

;init_CHS
    mov ch,0    ;Cyrinder
    mov dh,0    ;Head
    mov cl,2    ;Sector

init_di_register:
    mov di,0    ;error count

read_disk:
    mov ah,0x02 ;read_mode
    mov al,1    ;read secter size
    mov dl,0    ;drive
    int 0x13    ;disk nterrupt

    jnc succeed ;no error.. jump (read)succeed

    ;error
    inc di      ;di ++
    cmp di,5    ;if 5
    je error    ;equal.. goto error

    jmp read_disk

print:
    mov al,[si] ;print character
    mov ah,0x0e ;mode
    mov bh,0x15 ;color
    int 0x10    ;video interrupt

    inc si
    cmp al,0
    je finish

    jmp print

error:
    mov si,error_string
    jmp print

;MAX(floppy disk?) - cylinder:40, head:2 sector:18
;cylinder:0 head:0 sector:1
;cylinder:0 head:0 sector:2
;cylinder:0 head:0 sector:3
;         .......
;cylinder:0 head:0 sector:17
;cylinder:0 head:0 sector:18
;cylinder:0 head:1 sector:1
;cylinder:0 head:1 secter:2
;         .......
;cylinder:0 head:1 secter:17
;cylinder:0 head:1 secter:18
;cylinder:1 head:0 secter:1

succeed:
;Move Segment and offset
    mov ax,es
    add ax,512/16
    mov es,ax
;Read 18 secter
    inc cl
    cmp cl,18
    jbe init_di_register
;Read 2 head
    mov cl,0    ;init secter
    inc dh
    cmp dh,2
    jb  init_di_register
;Read 10 cylinder
    mov dh,0    ;init head
    inc ch
    cmp ch,READ_CYLINDER
    jb  init_di_register
;All compleate!.. print succeed
    mov si,succeed_string
    jmp print

;jemp! (video file)
finish:
    jmp 0xc200

error_string:
    db "Read Failed - Check please!!"
    db 0x0a,0x00

succeed_string:
    db "Read Succeed - Check OK !!"
    db 0x0a,0x00

    ;for Dos Table Signature
    resb 0x7dfe - $ ;padding(0)
    db 0x55,0xaa    ;Dos Table Signature

;video
ORG 0xc200

;VGA 320x200x8bit
mov al,0x13
mov ah,0x00
int 0x10

finish:
    hlt
    jmp finish

메모리 직접 접근의 유용성 (memcpy)


Before
전형적인 막장짓..
초기화 -> 거꾸로 값 받아서 배열에 삽입 -> 포맷에 맞게 sprintf를 써서 -> 문자열로 만들고
-> 그걸다시 sscanf써서 -> 정수로 변환후 -> 리턴..
unsigned int  atox(char *string)

     unsigned int ret;

     sscanf(string,"%x",&ret);

    return ret;
}

 unsigned int get_value(unsigned char *segment,int offset,int size)
{
    int i;
    char temp[size * 2 + 1];
    unsigned char dt[size];
    temp[size * 2] = '\0';

    for(i = 0;i < size;i ++)
        /* 리틀 엔디언 */
        dt[size - i - 1] = *(segment + offset + i);

    if(size == 1)
        sprintf(temp,"%02x",dt[0]);
    else if(size == 2)
        sprintf(temp,"%02x%02x",dt[0],dt[1]);
    else if(size == 3)
        sprintf(temp,"%02x%02x%02x",dt[0],dt[1],dt[2]);
    else if(size == 4)
        sprintf(temp,"%02x%02x%02x%02x",dt[0],dt[1],dt[2],dt[3]);

    return atox(temp);
}

After
몰라 걍 직접 집어넣어 버려....; 왜 진작 이걸 생각 못했을까?
역시 메모리에 직접 접근해서 하는게 더 편하다.
unsigned int get_value(unsigned char *segment,int offset,int size)
{
    int ts = 0;
  
    memcpy(&ts,segment + offset,size);

    return ts;
}

비슷하게 잘 작동하는듯 하다.... 좀 이상한가... 바꾸고 나니 왠지 불안하다...
값은 제대로 찍히는거 같은데.................

아 size가 클경우 overflow가 일어날수도 있을거 같은데.. 그거 처리도 해야하나?
근데...귀차나연...ㅋ

리눅스에서 2기가 이상인 파일에 접근하기


도스 테이블을 만지작거리는중.

이상하게 값들이 제대로 안들어가는거 같아서.. long long 의 형까지 써보면서 삽질을 해봤지만

안되길래 구글링.... 한 결과

"open,lseek,fopen같은 함수는 2G정도의 파일만 접근이 가능하다.."

는 걸 알아냈다..............

아마도  off_t 값의 범위 때문에 그럴지도?

해결방법은

open64,lseek64처럼 직접소스에 64를 추가시켜주거나

(이때는 따로 인클루드파일을 추가시켜주거나 OR   DEFINE을 해줘야하는듯)

D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64

를 Gcc컴파일할때 추가해주면 된다  (gcc 버전 3.4부터 된다는 말이 있는데?)

이리하면

/dev/hda같은 대용량 파일(?) 도 잘 처리가 된다..

압축플때 쓰는 쉘 스크립트

 1 #!/bin/bash
 2
 3 # 지원하는 파일들은 다음과 같습니다
 4 # zip,alz,rar,tar.gz,tar,tar.bz2,gz,tgz
 5 # 물론 unalz,unzip,unrar,tar등이 설치되어 있어야 합니다
 6 # (첫번째 인자의)파일의 확장자를 찾아내서 처리합니다..
 7
 8 # IFS 인자를 백업후 .을 IFS인자로 설정
 9 OLD_IFS=$IFS
10 IFS='.'
11
12 # 첫번째 인자를 변수에 넣고 .을 간격자로한 갯수를 구한다
13 ARG1=($1)
14 ARRAY_SIZE=$(expr ${#ARG1[*]} - 1)
15
16 if (( $ARRAY_SIZE == -1));then
17     echo "인자가 부족합니다.."
18     echo "사용법 : $0 파일명 (압축을 )경로"
19     exit 1
20 fi
21
22 # 파일의 확장자를 정한다 (맨뒤에꺼만 아면 된다
23 # tar.gz같은경우도 gz면 되기때문에 맨마지막만 검사한다
24 if [ "${ARG1[$ARRAY_SIZE]}" = "zip" ];then
25     EXTENSION="zip"
26 elif [ "${ARG1[$ARRAY_SIZE]}" = "rar" ];then
27     EXTENSION="rar"
28 elif [ "${ARG1[$ARRAY_SIZE]}" = "alz" ];then
29     EXTENSION="alz"
30 elif [ "${ARG1[$ARRAY_SIZE]}" = "tar" ];then
31     EXTENSION="tar"
32 elif [ "${ARG1[$ARRAY_SIZE]}" = "gz" ];then
33     EXTENSION="gz"
34 elif [ "${ARG1[$ARRAY_SIZE]}" = "tgz" ];then
35     EXTENSION="tgz"
36 elif [ "${ARG1[$ARRAY_SIZE]}" = "bz2" ];then
37     EXTENSION="bz2"
38 else
39     echo "지원되지 않는 압축파일입니다 확장자를 확인해 주세요!"
40     echo "지원되는 압축파일 : ZIP,RAR,ALZ,TAR,GZ(or tar.gz),BZ2(or tar.bz2)"
41     exit 1
42 fi
43
44 # IFS를 복원
45 IFS=$OLDIFS
46
47 # IFS를 복원했기때문에 원래 인자들이 대입된다
48 # 그리고 전체 인자 갯수를 구해서, 압축을 풀
49 # 장소가 command 에 있는지 검사하고 실행한다
50 ARG1=($1)
51 ARG2=($2)
52 ARG_NUM=$#
53
54 # (경로)인자가 존재하지 않는다면
55 if(($ARG_NUM == 1));then
56     if [ "$EXTENSION" = "zip" ];then
57         unzip $ARG1
58     elif [ "$EXTENSION" = "rar" ];then
59         unrar e -d $ARG1
60     elif [ "$EXTENSION" = "alz" ];then
61         unalz $ARG1
62     elif [ "$EXTENSION" = "tar" ];then
63         tar -xvf $ARG1
64     elif [ "$EXTENSION" = "gz" ];then
65         tar -xvzf $ARG1
66     elif [ "$EXTENSION" = "tgz" ];then
67         tar -xvzf $ARG1
68     elif [ "$EXTENSION" = "bz2" ];then
69         tar -xvjf $ARG1
70     fi
71 # 존재한다면 경로대로 압축을 해제시킨다
72 elif(($ARG_NUM == 2));then
73     if [ "$EXTENSION" = "zip" ];then
74         unzip $ARG1 -d $ARG2
75     elif [ "$EXTENSION" = "rar" ];then
76         unrar x $ARG1
77     elif [ "$EXTENSION" = "alz" ];then
78         unalz $ARG1 $ARG2
79     elif [ "$EXTENSION" = "tar" ];then
80         tar -xvf $ARG1 -C $ARG2
81     elif [ "$EXTENSION" = "gz" ];then
82         tar -xvzf $ARG1 -C $ARG2
83     elif [ "$EXTENSION" = "tgz" ];then
84         tar -xvzf $ARG1 -C $ARG2
85     elif [ "$EXTENSION" = "bz2" ];then
86         tar -xvjf $ARG1 -C $ARG2
87     fi
88 fi

간단한(?) 스크립트.
여러 압축파일을 풀때 사용합니다
제가 워낙 다운족이다보니 압축은 안하고 풀기만 합니다...
리눅스인만큼 tar.gz 같은 파일 도 많이 풀지만
애니 자막을 풀기도 하기 때문에 zip,rar,같은것두 사용해서 적어 놨습니다

사실 그냥  alias로 해결하곤 했는데 인제 ut uz ur 쓰는것도 귀찮아져서 그냥
한번에 할려구 그냥 쉘 스크립트를 하나 만든거에요..

tar.gz tar.bz2같은거 때문에 확장자 뻘짓고생을 했것만.. 어짜피 마지막 확장자로
압축을 푸니까 별로 중요하지 않더라는..

음.. 일단 그리고 인자가 없을때만 한번 테스트 해봤더니 그건 잘 돌아가는군요
.. 압축풀 경로를 정했을때는 테스트를 안해봐서 잘 모르겠습니다만.........;;;;
잘되겠져멀~~~~~~~(무책임 =3=3)
오랜만에 쉘스크립트를 만들다보니까 잘 적응이 안되서 또 해멨지만..( 무지하게)
prev 1 ··· 5 6 7 8 9 10 11 12 next