'Programming'에 해당되는 글 91건

  1. 2009.01.12 Bash 쉘스크립트 배열 9
  2. 2008.12.05 qt, arm 보드에 포팅방법 6
  3. 2008.06.27 리눅스와 윈도우의 fat 파일쓰기 차이??? 8
  4. 2008.06.01 플로피 디스크 이미지를 만들어서 mount하자! 5
  5. 2008.04.15 확실히 다르잖아!! 4

Bash 쉘스크립트 배열

혹시해서 적어두지만

bash쉘스크립트에서는 따로 자료형이 정해지지 않았기 때문에 그냥

아무변수나 배열처럼 쓸수있다.

배열 대입
episode_array[0]="abc"
episode_array[1]="def"

배열출력
echo ${episode_array[0]}
echo ${episode_array[1]}
# 덧> 쿼우팅은 알아서 할것!

배열 삭제
unset 명령어 이용, 한다고 합니다 아직 사용해 보진 않음;;
unset episode_array
unset eposode_array[0]

배열 전체 길이 구하기 (첨자길이)
${#episode_array[@]}
$(#episode_array[1]} # 이게 1번 array 길이 구하는거였나?

배열A를 배열 B로 복사
B=("${A[@]")


배열의 첨자(인덱스) 안에 @,* 들어가는거는 IFS에서 $*와 $@ 와 비슷하다고 한다'

함수를 쓸떄 아규먼트로 보내기

Movie_Choice "${episode_array[@]}"

이렇게 쓰면
function Move_Choice()
{
     echo "$1"      #episode_array[0]
     echo "$2"      #episode_array[1]
     echo "#3"      #episode_array[2]
}
 

이상하게 배열자체를 함수로 넘기질 못하겠네;

이거 아시는분은 댓글을!!!

Movie_Choice ("${A[@]")

이게 안먹히기 때문에

function Movie_Choice()
{
     array2=( "$@" )
}

Movie_Choice ${episode_array[@]}


이렇게 사용하고 있다..;; 이거분명 넘기는 방법이 있을텐데 모르겠음

아나 귀차너 그냥 전역으로 쓰고 때려지우는게 나을듯

qt, arm 보드에 포팅방법

사용자 삽입 이미지

gcc  버전
          (바로 아래건 아니라도 나중을 위해(?) 맞춰야할 필요가 있을것 같다)
libc 버전          (아직까진 이거때문에 고생한일은 없는거 같아서)
qt-x11 버전      (이건 선택사항, 그냥 배포판에서 깔면댄다.. 걍 데탑 X11에서 쓰는 그 QT개발환경을 말하는거 같다)
qtopia 버전을  (안쓸꺼 같다 아직까진; )
arm용 gcc버전 (각 cpu에 맞는 gcc)
qt-embedded 버전
모두 맞출것.
아 참고로 바로 아래의 과정은 타겟보드가 없이 그냥 PC에서 할수 있으니 걱정말자 그리고
arm-linux-gcc 버전은 3.3.2!!
(대부분 make에러가 나는 이유가 컴파일러 버전이 달라서이다!
)
(나는 arm-elf-gcc인가 그거 깔긴했다... 상관 있는지 모르겠다)

그리고 환경설정(~/.bashrc 에 export PATH 설정을 다할것) 한후에

1 다음을 다운로드 한다

ftp.trolltech.com - /qt/source/qt-embedded-free-3.3.8.tar.gz

E2fsprogs Ext2 Filesystem Utilities - e2fsprogs-1.40.2.tar.gz


2 다음과 같이 디렉토리를 생성하고 압축을 해제한다
# mkdir /qt
# cp qt-embedded-free-3.3.8.tar.gz e2fsprogs-1.40.2.tar.gz /qt
# cd /qt
# tar xvzf e2fsprogs-1.40.2.tar.gz
# tar xvzf qt-embedded-free-3.3.8.tar.gz
# mv qt-embedded-free-3.3.8/ qte-3.3.8-arm

3 e2sprogs 설치 - 어쩌면 나는 필요 없었을지도 뭐 일단 깔긴했다.
# cd /qt/e2fsprogs-1.40.2
# ./configure --prefix=/usr/arm-linux --host=i386 --target=arm --enable-elf-shlibs
--with-cc=arm-linux-gcc
# make
# make install
# make install-libs

4 환경파일 생성 / 실행
# cd /qt
# cat > qte
#!/bin/bash
export QTDIR=/qt/qte-3.3.8-arm
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

# . qte

5 uic 파일 복사
# cd $QTDIR/bin
# cp /usr/lib/qt-3.3/bin/uic .
행여나 uie파일이 없다면 (cp가 파일같은거 없다 ㅂㅅ 사용자야! <- 이럴때)
배포판에서 qt3 패키지를 설치하고나서 거기에 깔린 uie 파일을 복사한다
ex>
# pacman -S qt3
# find / -name uic
# cp /qt/bin/uic .

6 qte(qt-embedded) 컴파일
# cd ..
# ./configure -embedded arm -qt-jpeg -shared -thread -no-cups -no-ipv6 -qvfb -depths 16
-qt-mouse-linuxtp
라이선스 ㅈㄹ 하면 yes하고 계속
# make
한 몇십분 정도만 기다리자
"Enjoy! - the Trolltech team"
가 마지막 부분에 나오면 성공이다

7 ARM용으로 되었는지 확인해본다,
(libqte 파일이름은 조금씩 다른거 같은데 libqte*.so.version 만 맞으면 그냥 file해서 확인하면 될것 같다.)
# file lib/libqte-mt.so.3.3.8
lib/libqte-mt.so.3.3.8: ELF 32-bit LSB shared object, ARM, version 1, dynamically linked, not stripped
이런식으로 나오면 성공

8 파일복사 (arm-qpe? 위해서라고 함..)
# cp /usr/arm-linux/lib/libuuid.* .
# cp /usr/arm-linux/lib/libstdc++.so.5 . <- 이녀석이 없다면, find 해서 직접 그 경로로 부터 복사

9 파일을 압축하고 타겟보드에 이걸 푼다.
tar zcvf /qt/qt-arm-lib.tar.gz /qt/qte-3.3.8-arm/lib

그다음에 X11 설치, 이건 그냥 아래페이지에서 볼것
폰트파일 문제생기면 (pacman 으로 qt3까니까 이러네염) 직접 복사해준다
[/qt/qte-3.3.8-x86]# cp lib/fonts /opt/qt/lib/

일단 다 하긴했는데
저거 내일 가서 보드에 올려보면 제대로 작동할지가 의문 걍 안대면 QT안쓸테야.

어쨌던 난 "임베디드 수업(실습 == 자율삽질)","huins(vip아님 공개안하는) " 저주할거임..ㅋㅋ
이수업은 프로그래밍보다 설정 개삽질이 더 많다.. 정말 싫어.

참고; http://forum.falinux.com/zbxe/?mid=graphic&page=2&document_srl=406324
http://www.korone.net/bbs/board.php?bo_table=qt_lecture&wr_id=231&page=4

'Programming' 카테고리의 다른 글

복잡한 프로그래밍  (8) 2009.02.02
nasm include  (0) 2009.01.26
쉘스크립트 하는데  (7) 2008.02.04
간만에 포스팅.. 소스 고치기!  (2) 2007.10.17
Nanika를 써보고 나는 생각들  (5) 2007.06.16

리눅스와 윈도우의 fat 파일쓰기 차이???

<이포스팅은 틀린거 같습니다 일단 무시해주세요>

아주 인기없는거만 골라서 포스팅 ㅋㅋ

근데

왜 접때 만든 fat이미지 만드는거가지고 놀고 있었는데요..

이상하게 윈도에서 플로피에 쓴거랑

리눅스에서 (접때포스팅때 만든 이미지 생성기로) 플로피에 쓴거랑

똑같이 써지는게 아니더군요??

다른건 다 같은데

일단 앞에 썻던것처럼 마운트(또는 삽입) 후 아무 파일인 생성한후

hexedit로 각각 연다음에 확인해보니까

0x200 부분과 0x1400 부분이 다르더군여

리누기에서는 F0 FF FF 00 F0 FF

윈도우에서는 F0 FF FF FF 0F 00

그리고 첫번쨰파일 read하는 위치가 (디스크내)

리누기에서는 0x4400

윈도우에서는 0x4200

아마 윗부분(0x200,0x1400) 이 관장하는것이 첫번째(?)파일의

처음위치와 관련된듯한데.

(저번에 C소스에서는 "이거 뭥미" 라고 적어놨던 부분..좀 이해가 가는군요)

그런데 어째 리눅이랑 윈도우랑 역바이트일까요..

제가 전에 만든거가 틀렸는것도 아닌것 같은것이

파일 쓰는건 운영체제가 알아서 하는거라.. ;음..

일부러 이렇게 만들어놨나 -_- 그냥 윈도우기 시러서?

아닌가?? 내가 어디서 잘못한건가 ㅜ

이건 고정되지 않고, 유동적인값???????????

덧> 사실 제가 "윈도우에서 했다" 라는것 처럼 적어놨는데..

제가 직접해본건 아니고..

책에서 이걸 "윈도우에서 만들기 때문에" 윈도우라고 적은거 뿐입니다
---------------------------------------------------------------
아.. 나는 정말 책의 설명을 보는건지 책을 분석하는건지 -_-...

중간에 이해 안 가는게 있으면 뒤로 진도를 못빼는 스타일 ㅜ

역시 이해력이 딸리면 이렇게 해야 ㅜㅜ

'Programming > Kernel' 카테고리의 다른 글

확실히 다르잖아!!  (4) 2008.04.15
ctags 설정  (4) 2008.03.11
본체 전원키로 시스템 off 시키기  (4) 2007.04.22
운영체제 없이 화면에 A를 찍어보아요...  (6) 2007.04.06
KernelProgramming-printk  (5) 2006.07.24

플로피 디스크 이미지를 만들어서 mount하자!

뭐 찾아보면 이런프로그램 있을거 같지 말입니다..

그것도 아니면 그냥 이미지 자체를 다운 받거나 ㅋ

하지만 그냥 작년에 배운 fat파일 시스템 연습하는겸,

디스켓이미지가 필요한일도 있어서 함 만들어 봤어요 ㅋ
/*
* =====================================================================================
*
* Filename: main.c
*
* Description: 플로피디스크 이미지 만들어주는 프로그램
*
* Version: 1.0
* Created: 2008년 05월 31일 21시 41분 41초
* Revision: none
* Compiler: gcc
*
* Author: first_name last_name (fl), fl@my-company.com
* Company: my-company
*
* =====================================================================================
*/

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

/* define data type */
#define BYTE unsigned char
#define DBYTE unsigned short int
#define DWORD unsigned int /* 음 따지자면 틀린건가? ㅋ */

/* floppy disk spec */
#define FLOPPY_DISK_SIZE 1474560 /* */
#define BASIC_BUFFER_SIZE 1024
#define FLOPPY_INIT_COUNT 1440

/* for dos-table */
#define MSDOS_SIANATURE 0x55,0xAA /* */
#define MSDOS_SIANATURE_LOCAL 0x1fe

/* for fat12 */
#define INT_ETC_VAL 0xF0,0xFF,0xFF /* */

/* floppy disk write */
typedef struct _floppy
{
/* bit write */
unsigned init_jump:8*3;
char ipl_name[8];
DBYTE byte_per_sector;
BYTE sector_per_cluster;
DBYTE reserved_sector_count;
BYTE num_fats;
DBYTE boot_entry_count;
DBYTE total_sector_12;
BYTE media;
DBYTE fat_size12;
DBYTE sector_per_track;
DBYTE number_of_heads;
DWORD hidden_sector;
DWORD total_sector_32;
BYTE drive_number;
BYTE reseved1;
BYTE boot_signature;
DWORD volume_id;
char volume_label[11];
char file_system_type[8];
/* not padding ! */
} __attribute__ ((packed)) Floppy;

void init ( int fd )
{
char buffer[BASIC_BUFFER_SIZE] = {0x00};
int i;

for(i = 0;i < FLOPPY_INIT_COUNT; i ++)
write(fd,buffer,sizeof(buffer));

} /* ----- end of function init ----- */

void write_ipl( int fd )
{
Floppy fda;

memset((void *)&fda,0,sizeof(fda));

fda.init_jump =0x904eeb;
memcpy(&fda.ipl_name,"LowidIPL",8);
fda.byte_per_sector =512;
fda.sector_per_cluster =1;
fda.reserved_sector_count =1;
fda.num_fats =2;
fda.boot_entry_count =224;
fda.total_sector_12 =2880;
fda.media =0xf0;
fda.fat_size12 =9;
fda.sector_per_track =18;
fda.number_of_heads =2;
fda.hidden_sector =0;
fda.total_sector_32 =2880;
fda.drive_number =0x00;
fda.reseved1 =0x00;
fda.boot_signature =0x29;
fda.volume_id =0xffffffff;
memcpy(&fda.volume_label,"LowidFLOPPY",11);
memcpy(&fda.file_system_type,"FAT12 ",8);

lseek(fd,0,SEEK_SET);
write(fd,&fda,sizeof(fda));
} /* ----- end of function write_mdr ----- */

void write_signature ( int fd )
{
char init_byte[3]={INT_ETC_VAL};
char msdos_signature[2]={MSDOS_SIANATURE};

/* for msdos */
lseek(fd,MSDOS_SIANATURE_LOCAL,SEEK_SET);
write(fd,msdos_signature,sizeof(msdos_signature));

/* for fat12 what? 0x200? ,0x1400? */
lseek(fd,0x200,SEEK_SET);
write(fd,init_byte,sizeof(init_byte));
lseek(fd,0x1400,SEEK_SET);
write(fd,init_byte,sizeof(init_byte));
} /* ----- end of function init_000200 ----- */

int main ( int argc, char *argv[] )
{
int fd;

if( argc != 2 ){
fprintf(stderr,"만들 디스크 이미지명을 입력해 주세요\n" \
"Useage : %s create_filename\n",argv[0]);
exit(EXIT_FAILURE);
}

if( ( fd = open(argv[1],O_EXCL | O_CREAT | O_WRONLY,00644)) == -1){
perror("파일 열기 실패");
exit(EXIT_FAILURE);
}

init(fd);
write_ipl(fd);
write_signature(fd);

close(fd);

return EXIT_SUCCESS;
} /* ---------- end of function main ---------- *


별 주석달것도 없습니다..



fat파일 시스템만 안다면 별 문제 없을듯.


이거 자세한 정보는 한빛문화사 홈피에서 fat치면 아마 나올거에요

제가 작년인가 포스팅할때 주소도 적어놨었는데 ㅋㅋ

거기가면 기본값이랑 범위같은게 상세히 공개되어있어요..

그대로 프로그래밍 하면 되니까 정말 어려울것도 없다는..

소스바연.. 값들 넣는거 때문에 그렇지 별 내용은 없는겁니다

이 약간 내용이 있기는 합니다.


구조체에서 bit로 선언하는거 - (ex>unsigned bla:1; ->이건 1bit - one or zero)

bit 선언에서는 int,unsigned 밖에 없지 말입니다....

위에 상황같은데 쓰는거보단 bool형 같은거 쓸때 좋죠..


또 padding 없는 구조체 (물론gcc, 윈도우에선 #progma로 하던가요? )

ex> __attribute__ ((packed)) Name;

다 아시겠지만 구조체를 sizeof하면 원래 크기가 다르죠. 4byte(cpu에 따라 다르겠지만) 마다 할당하니까요

위에 ipl만들때는 바이트수 철저히 따져서 입력해야하기 때문에 저렇게 쓴것이지만요.


사용법 $./filename image_name
마운트법 $mount -o loop image_name
확인 $df -T

그리고 플로피디스크 쓰듯이 쓰면댐



마운트후 디랙토리 만들기 삭제 파일생성.. 잘되네요 ㅋㅋㅋ

리눅스는 디바이스도 파일처럼 다룰수 있어서 편하지 말입니다~
(뭐 지금의 경우는 반대지만)

덧> 요즘에는 시간이 좀 남지 말입니다~ 그래서 학기중에 못했던(중간고사 끝날때부터 딱 저번주 까지 정말 바빳던..ㅋ)
포스팅도 좀 자주(?) 하는데...

다음주부터 또 시험크리때문에 포스팅을 제대로 할수 있을지 의문이에요 ㅜㅜ

추가> qemu -fda 옵션 붙이면 qemu가 죽습니다? 우아아앙~ 왜이래?? boot jump code가 잘못?

확실히 다르잖아!!

EQU 는 C의 #define 과 다르다!

아놔 "인텔프로세서를 위한 시스템 프로그래밍" 책아 님하 맞을래여??

왜 

"상수를 정의할때는 EQU나 = 를 사용한다. 여기서 EQU로 정의된 상수는 재정의가 불가능하다.

이는 고급언어에서 상수로 정의한것 (C언어에서는 #define PI) 3.141592) 와 같은 의미로 쓰이며...."

명백히 따지면 이거 틀렸자나........ 어째서 EQU가 c의 #define이랑 같냐??
그런식으로 하면

ABC EQU "Hello world"
ABC EQU 0x0a,0x0b

db ABC

이런것도 되야지... 않나?? 언되자나???앙??

(문자열이랑 숫자들 연속은 안되드만 뭐., 나도 어셈블러 초짜니까 잘 모름...)

인터넷 찾아보니까 #define,#include(어떤놈은 %include,%define)

같은 전처리기가 어셈에도 있드만?? 이거랑 같다고 해줘야할거 아냐!

오히려, =(참고:이건 EQU와 비슷하지만 값이 변동될수 있다 즉 상수가 아니라는것임 maybe)랑 EQU랑 비교할려면

차라리 const변수랑 일반변수랑 구별해서 적어놓는게 더 나을거 같다고 생각하는데.......

아냐 아냐! 설마 masm은 다른거냐!!!
그럼 쪽팔리는데........ 아마 nasm이 저렇기 때문에 별 다른 차이가 없을거라고
여기긴하는데....... -_-;;;;;;

nasm 의 pre-processor에 대한건 다음 링크를 참조하세요!
http://web.mit.edu/nasm_v0.98/doc/nasm/html/nasmdoc4.html

그런데.........전 시험기간데 대체 지금 무슨짓을 하는걸까요 -_-;;;;;;;;
prev 1 ··· 5 6 7 8 9 10 11 ··· 19 next