Embedded 1
Embedded 1
• Imbedded system : computer system fixed for only a specific purpose different to general PC, but it is
operated under simple OS environment such as imbedded LINUX, or imbedded RTOS. It is small and
compact type micro-controller operating with OS since the many functions such as multimedia contents,
network, various I/O drivers are needed within one micro-controller.
• LINUX host PC and target imbedded system (ARM family processor Xscale PXA255)
• ARM chip is very popular in imbedded system because it is RISC type processor
• Hyper-terminal function (minicom exec-file on LINUX) to show communication between host and target
- thru serial port
- initial display by boot-loader of target system
• Boot-loader : it is similar to Monitor program.
- this program code is located at Xscale start address.
- initialize all of peripheral chips.
- load Kernel from Flash to the RAM.
- Provides several commands.
Porting Imbedded System (1)
• bootloader, kernel, ramdisk, user file system are located in flash ROM
• When the imbedded system is booted by power-on, boot-loader is accessed at first. Bootloader
initializes the all peripheral devices, and transfer kernel, ramdisk, userfile from flash ROM to RAM, and
give the control to kernel finally.
Install Linux & Win2000 on Host PC (1)
• 13GB primary mater IDE HDD( C: , D:) and 4GB primary slave IDE HDD (E:)
• 1.3GB HDD consists of 8GB(C: drive) and 4 GB(D: drive) partitions having NTFS and FAT32 file
systems, respectively.
• Partitions of HDD :
- capacity = Cylinder > track > sector > bytes : 1024 >255>63>512
- head, cylinder, track, sector, cluster.
- primary and extended logic area.
- At most, 4 primary areas(C, D, E, F drives) in one physical HDD.
- Main boot sector is located in primary drive.
- In LINUX, two physical IDE(or SCSI) HDD’s are expressed as “hda” and “hdb”(or “sda” and “sdb”).
- “hda1” and “hda2” are two primary drives in one physical HDD. “hda5” and “hda6” are logical extended
drives.
Install Linux & Win2000 on Host PC (3)
• Mirror 및 Bit Torrent 로부터 다운로드 , Bit Torrent 는 P2P 와 같이 같은 그룹의 인접한 relay 분산 다운
로드 방식으로 여러 컴퓨터들이 동시에 나눠서 다운 받아 전달하는 식이다 . Bit Torrent 의 경우 client 프
로그램을 설치할 필요가 있음 .
• i386 은 Intel, AMD 사 프로세서 , x86_64 는 Intel ATOM 230, Core 2 Duo, Xeon, AMD 사의 Athlon 64,
Sempron 64, Opteron 와 같은 병렬프로세서 급 , ppc 는 Macintosh 를 비롯해서 다른 프로세서들은 ppc
• Live, DVD, CD 의 형태로 다운 받을 수 있는데 Live 는 작은 용량으로 일단 부팅시켜 사용해 볼 수 있고
이를 인스톨할 수 있다 . ISO 의 확장자를 가진 미디어 DVD, CD 이미지를 그대로 burning 해서 그것으로
부팅시켜 인스톨한다 . 인터넷 상에서 다운 받으면서 인스톨할 수 있는 최소 부트 CD 가 있다 . 다음은
mirror 에서 다운받을 수 있는 파일들이다 . 여기서 arch 는 인스톨할 컴퓨터의 프로세서 타입 즉 i386,
x86_64, ppc
Full distribution on DVD : fedora/linux/releases/10/Fedora/arch/iso/F-10-arch-DVD.iso
Live image : fedora/linux/releases/10/Live/arch/iso/F-10-arch-Live.iso,
fedora/linux/releases/10/Live/arch/iso/F-10-KDE-arch-Live.iso
Minimal CD boot media : fedora/linux/releases/10/Fedora/arch/os/images/boot.iso
• 다운받을 때 파일 에러 검증을 위해 http://lists.gnupg.org/pipermail/gnupg-
announce/2004q4/000184.html. 에서 SHA1SUM.EXE 를 다운 받아 CMD 창에서 실행함으로써 다운 받
은 ISO 파일에 대해 에러 검색
• 다운 받은 Fedora iso 파일을 CD 또는 DVD, USB flash memory 가 있는데 roxio easy media creator,
nero burning ROM5, Nero express 6, ISO recorder V2 power toy 를 시용하여 구울 수 있다 .
• Fedora 인스톨 도움말 문서 관련 사이트는 http://docs.fedoraproject.org/install-guide/f10/en_US/
• 전반적인 리눅스 관련 사이트 www.linux.co.kr
• 실시간 원격지원 , 이메일 , 포럼 , 문서들을 통해 지원 받을 수 있다 . fedoraproject.org,
docs.fedoraproject.org, forum.fedoraproject.org
Getting Fedora 10
http://www.linux.co.kr/에서 멀티 부팅 검색해서
“ 두개의 하드에서의 멀티부팅”
http://www.linux.co.kr/home/lecture/?leccode=10237
Primary master HDD, dev/hda Primary slave HDD, dev/hdb secondary master CD, dev/hdc
IDE1 IDE0
Primary master HDD, dev/hda Primary slave HDD, dev/hdb secondary master CD,
dev/cdrom
Win98, C: drive, dev/hda1 Linux /boot, dev/hdb1
IDE1 IDE0
Installation multi boot with Linux
1) 그 다음에 멀티 부트 기능을 제공하는 부트로더인 LILO 또는 GRUB 가 있는데 여기서는 LILO 의
경우를 설명한다 . LILO installation 메뉴는 다음과 같이 세 가지 선택이 나온다 .
. On C:
. Create a boot disk
. On partition /boot
“ON C:” 를 선택하면 1 번 하드 ( 윈 98 하드 ) 의 마스터 부트레코드 (MBR) 에 LILO 를 설치하여 리
눅스 설치가 끝난 후 피시를 리부팅하면 리눅스로만 부팅할 수 있다 .( 윈 98 하드 내용은 영향이 없
다 . 단지 부팅만 문제된다 ) 그러므로 중간에 설치가 문제가 되어도 윈 98 로 부팅 할 수 없다 . ( 윈
98 의 시동디스크를 사용하여 부팅 후 fdisk /mbr 명령으로 수정이 가능하다 ) 여기서는 가장 안전한
“ Create a boot disk” 를 선택한다 . 이는 리눅스 설치가 완료되었을 때 리눅스를 디스켓에서 부팅하
게 구성하는 것이다 .( 디스켓을 넣지 않으면 윈 98 로 부팅한다 ) 그 후에 리눅스에서 lilo.conf 라는
파일을 수정하여 하드에서 윈 98 과 리눅스를 선택 부팅하게 설정하는 것이다 . 따라서 혹시 리눅스
설치가 잘못되어도 윈 98 이 설치된 1 번 하드의 MBR 을 수정하지 않으므로 윈 98 부팅에는 아무
런 문제가 없다 .
4) Primary ethernet (eth0) 의 IP, subnet mask, gateway 들을 설정 , 시간대 , 방화벽 여부 ( 임베디드
TB 와 LAN 을 연결해서 전송해야 하기 때문에 방화벽을 해제 ) 등을 설정 .
5) 사용자 계정 및 root 암호를 입력한다 .
6) 설치 패키지를 선택해서 설치를 시작한다 . 설치 말기에 앞서 LILO 에서 linux 설치 디스크 옵션에
따라 drive A: 에 포맷된 floppy disk 를 넣으라는 메시지와 함께 floppy 에 linux boot loader 를 설치
하기 시작한다 .
7) 설치가 다 되면 X window 화면에서 그래픽 모드의 로그인 창이 나온다 . 로그인은 root 로 패스워드
는 앞서 설정한 것으로 로그인 한다 . X window 의 터미널을 열어 (ctl+alt+F2) linux text command 창
을 띄우고 여기서 root prompt 가 나타남을 확인한다 . “shutdown –r now” 를 쳐서 다시 부팅을 시킨
다.
Installation multi boot with Linux
1) BIOS 로부터 부트 될 때 del( 또는 F2) 를 쳐서 CMOS 셋업에서 CD 에서 C 로 부트시켜서 win98
이 정상적으로 작동되는지 확인해 본다 .
2) 다시 재부팅해서 CMOS 셋업에서 C 에서 A 로 부트 시켜서 drive A 에 삽입된 linux 부팅 디스켓
으로부터 부팅시켜 X-window 가 나타남을 본다 . 터미널을 열고 여기서 etc/lilo.conf 를 vi 에디터로
열고 설정을 변경해서 BIOS 부트되면서 win98 또는 linux 어떤 것을 선택할 것인가에 대한 선택
메시지가 나타나도록 함으로써 다음 번에는 linux 부팅 디스켓 없이 이 메시지에 의한 선택으로
win98 또는 linux 부팅을 선택하도록 한다 .
etc/lilo.conf
추가 other = /dev/hda1
Label = dos
Table = /dev/hda
Manual partition by using Druid
• 리눅스에서는 HDD 각각을 hda, hdb, hdc… 또는 sda, sdb 로 나눈다 . dos 에서는 EIDE 에 primary
master, promary slave, secondary master, secondary slave 와 같이 네 개의 디바이스들을 연결할 수 있고
primary 의 경우 IDE1, secondary 의 경우 IDE0 로 인식한다 . 일반적으로 EIDE 는 primary, secondary
두개의 포트를 제공하고 하나의 포트에 master/slave 두개의 커넥터를 사용하여 연결할 수 있게 되어 있
고 , primary 에는 HDD 를 master, slave jumper 로 셋팅해서 두 개를 연결하고 secondary 에는 CD,
DVD drive 를 연결해서 사용한다 . 하나의 HDD 에 OS 를 올릴 주파티션과 데이터를 저장할 확장파티션
으로 나누고 확장파티션은 다시 논리 드라이브로 쪼갤 수 있다 . 리눅스에서는 primary master 가 hda 가
되고 여기에 root, swap, boot 파티션을 나눠서 hda1, hda2, hda3 로서 표기한다 . primary slave 에서는
hdb 가 되고 여기에 hdb1, hdb2, hdb3
• Druid 를 사용하여 수동으로 linux 의 root, swap 파티션 나누기 , 기존의 파티션을 삭제할 수도 있다 .
• Swap 영역은 PC 의 주메모리의 용량이 제한되어 있어서 다양한 프로세스를 수행하기 위해 페이징 기법
을 사용하고 별로 사용되지 않는 코드는 주메모리에서 삭제하고 HDD 로부터 필요한 구성 요소들을 주메
모리로 올림으로써 HDD 를 가상메모리로 사용되는데 이 때 HDD 의 주메모리로부터 삭제된 코드 ( 또는
구성 요소들 ) 의 일시 장기 보관소라고 볼 수 있는 swapping 영역이 필요한데 이를 의미한다 . 여기서 주
메모리 사이즈의 두 배 정도이면 충분하고 주메모리가 1GB 라고 해서 swap 파티션 사이즈를 2GB 까지
크게 할 필요는 없고 1GB 라도 무방하다 .
메 뉴 설명 및 옵션 예 제
마운트할 지점 디렉토리 경로를 설정 /
파일시스템의 유형을 선택
파일시스템 유형 옵션 ) ext2, ext3, physical volum (LVM), ext3
software RAID, swap, vfat
root
swap
Manual partition by using Druid
메 뉴 설명 및 옵션 예 제
마운트할 지점 디렉토리 경로를 설정
파일시스템의 유형을 선택
파일시스템 유형 옵션 ) ext2, ext3, physical volum (LVM), swap
software RAID, swap, vfat
http://coffeenix.net/data_repository/htm/01-05-4.htm
LVM(Logical Volume Management)
• 리눅스에서 mkfs –t ext3 /dev/sda3 하면 리눅스 깔리면서 할당된 sda3 파티션을 ext3 파일시스
템으로 만들고 mount -t ext3 /dev/sda3 /mnt/backup 과 같이 /mnt/backup 에 마운트 시켜서 sda3
파티션 ( 일종의 논리 드라이브 ) 를 접근해서 사용하고 끝나면 unmount 시킨다 . fdisk 는 window 에
서의 디스크관리에서 데이터 영역 파티션을 재조정하는 식으로 사용된다 .
편집모드에서 지원하는 키
① default=1
기본값으로 부팅되도록 설정하는 부분이다 . grub 선택화면에서 특별히 선택하지 않으면 여기에 설정되어
진 값에 해당하는 운영체제를 로딩한다 . 현재 설정인 1 값은 아래 항목중에서 제일 먼저 설정되어 있는
운영체제를 말한다 .
② timeout=5
grub 부트화면에서의 대기시간이다 . 단위는 초이다 . 현재 설정은 5 초간 선택이 없으면 default 에 설정된
값으로 부팅된다 .
③ splashimage=(hd0,0)/grub/splash.xpm.gz
부트 화면의 배경이미지를 지정하는 부분이다 . xpm 형태의 그림이미지를 압축한 xpm.gz 파일을 사용한다 .
(hd0,0) 의 뜻은 /dev/hda1 라는 뜻이다 .
default=1
timeout=5
http://www.linux.co.kr/에서 멀티 부팅 검 splashimage=(hd0,0)/grub/splash.xpm.gz
색 Hiddenmenu
title SULinux (2.6.9-34.EL)
root (hd0,0)
kernel /vmlinuz-2.6.9-34.EL ro root=LABEL=/
vga=773
Boot loader(manager) for multi boot with Linux
※ 참고 . 리눅스 디바이스 와 grub 디바이스와의 관계
1. 기본관계
/dev/fd0 : (fd0) floppy?
/dev/hda : (hd0) 설명 : SCSI 하드디스크인 경우에 첫번째 물리적인 디스크도 이 값에 해당한다 .
/dev/hdb : (hd1)
2. 사용예
/dev/hda1 : (hd0,0)
/dev/hda4 : (hd0,3)
⑤ windowns 가 설치되어 있을 경우
만약 windowns 와 같이 설치된 시스템이라면 아래와 유사한 설정이 추가 되어 있을 것 이다 .
title Windowns
rootnoverify (hd0,1)
chainloader +1
dev/sda1(20GB)
Win XP dev/sda2(200MB), /boot, ext3
dev/sda3(18800MB)
LV0, /root, ext3
PV0 이자 VG0
LV1, , swap
Installation Fedora9 for multi boot with Linux
• 부트로더 설치에서 /dev/sda ( 즉 HDD 의 MBR, master boot record) 에서 할 건지 , first sector of boot
partition /dev/sda2 에서 할 건지를 결정해야 하는데 뭐가 좋지 ?
Other /dev/sda1
만약에 부트로더를 MBR 에 엮어서 문제가 생기면 DOS 시동디스크로 부팅시켜서 dos 에서 fdisk MBR
치면 복원된다 .
• 설치가 완료되면 부트로더 설치라는 메시지가 보이고 이것이 완료되면 CD4 를 빼고 재부팅한다 .
• 재부팅 하면 GRUB 가 뜨면서 몇 초 내에 엔터를 치면 Fedora (2.6.25-14.fc9.i686), Other 둘 중 하나를
선택해서 부팅시킬 수 있다 .
• 프로세스 기술자 , 상태 , 큐 전환
• 시그널과 프로세스간 통신
• 프로세스 스케쥴러
• 메모리 매핑 , 파일 시스템 , 파일 접근
• 스와핑 , 메모리 해제
• 실행 가능 파일 , 라이브러리
- 프로그램 생성
- 파일의 관리
- 시스템 사용 권한 통제
- 오류 검출 및 대응
- 컴퓨터 성능 모니터링 및 통계 처리
• 프로세스들이나 작업들 (tasks) 의 스케줄링 : 하드웨어는 수시로 실행중인 프로세서에 인터럽트를 보내어 OS 로
하여금 새로운 스케줄링 결정을 하도록 함으로써 많은 프로세스들이 프로세서 시간을 공평하게 공유할 수 있게 한
다.
실행중인 프로그램에 의하여 I/O 장치가 언제 사용될 것인지를 결정해주고 파일에 대한 액세스와 사용을 제어한
다.
프로세서 자체도 하나의 자원으로서 관리의 대상
운영체제는 특정 사용자 프로그램을 실행하는 데 프로세서 시간을 어느 정도 사용해야 할 것인지 결정해야 한다 .
다중프로세서 시스템 (multiple-program system) 의 경우에는 그러한 결정이 모든 프로세서에 대하여 이루어져야
한다 .
- 일단 작업이나 프로그램이 시스템에 들어오면 프로세스가 되어서 단기 (short-term) 스케줄러의 큐 (queue) 에 들어간
다 . 어떤 시스템에서는 새로이 생성된 프로세스가 교체되어 나가 있는 상태 (swap-out condition) 에서 시작되며 , 이
경우에 그것은 중기 스케줄러 (mid-term scheduler) 를 위한 큐에 추가된다 . 장기 스케줄러 (long-term scheduler) 를 다
중프로그래밍의 정도 (degree of multiprogramming) 에 따라 기억장치에 적재될 프로세스들의 수를 제어한다 .
- 큐로부터 빼 냄
- PCB 로부터 프로세스 관련 정보를 복구함
태로 바뀌어서 단기 큐로 들어간다 .
• 이로부터 보다 많은 수의 다중 프로세스를 지
원하도록 하는 것이 좋다
가장 최근에 I/O 수행이 시작된 프로세스 2 는 다 그 다음에 프로세스 1 이 I/O 요청을 함으로써 디
른 프로세스에 비해 가장 나중에 수행되므로 디스 스크의 중간 큐로 swap-out 시키고 그전의 프로세
크의 중간 큐로 swap-out 시키고 process4 를 스 2 를 swap-in 한다 .
swap-in 시킨다 . 이는 가급적 많은 수의 다중 프
로세스를 활성화시켜 가급적 프로세서의 유휴상태
를 최소화 하고자 하는 것이다 .
Memory Management (2) – Paging
• 조각난 공간을 모으는 과정 (compaction) 은 프로세서의 처리 속도를 낮추기 때문에 바
람직하지 못하다 .
page 4
page 5
page 6
page 7
Memory Management (4) – Demand Paging & Virtual Memory
• Page demanding : 보다 더 효율적으로 메모리 공간을 이용하기 위해 프로세스의 전체 page 들을 분할된 frame 들에 할당하기 보다는 매 시점 마다 기존
의 잘 접근하지 않는 page 들 대신에 필요한 page 들로 교체 (swapping) 하는 방법이 있다 . 잘못하면 교체가 수시로 이루어져 처리 속도가 늦어지게 된다 .
(thrashing) 직접사상 cache 의 경우에 하나의 line 에 많은 수의 tag 들이 존재하기 때문에 잘 못 replace 하다가는 교체하다가 볼 일 다 본다 .
• 이와 같이 하면 아주 큰 크기의 프로세스라 할지라도 전체를 메모리에 탑재하지 않고 꼭 필요한 것들만 탑재함으로써 프로그래머가 개발하는 프로그램의 사이
즈에 연연할 필요가 없어 진다 .
• HDD 는 접근성이 느려서 정지상태의 프로그램이나 데이터를 저장하는 단순히 보조 기억장치 이다 . 그런데 demand paging 기법을 사용하면 프로세스가
전체의 페이지들을 주메모리에 탑재하지 않더라도 수행 가능하다 . 따라서 HDD 로 부터 수시로 필요한 page 를 요청하여 프로세스를 수행시킬 수 있다 . 이
것은 언뜻 보면 HDD 를 하나의 프로세스가 돌아 가는 주메모리처럼 보여 진다 . 이러한 연유로 HDD 를 가상 메모리라고 한다 .
Virtual memory (1)
• paging 기법 : 다수의 프로세스들이 제한된 용량의 주 메모리에 올라가 있게 되고 수 차례에 걸쳐 프로세스가 생성되
고 소멸되는 가운데 메모리의 가용 공간은 조각난다 . 이러한 조각난 메모리 공간을 모은다는 것은 시간이 걸리는 작업
이다 . 따라서 조각난 메모리 공간에 프로세스에 관련된 코드가 그대로 분리되어 존재하도록 하는 대신 절대적 위치 정
보를 어딘가에 기록해 놓으면 된다 . 이를 위해 조각난 메모리 가용 공간을 frame 이라 하고 이러한 frame 에 프로세스
의 분리된 단위인 page 를 대응시키면 되고 그 정보를 page table 에 기록한다 . 즉 CPU 는 어떤 프로세스의 코드를 실
행한다고 할 때 그 코드의 page 번호와 오프셋으로 구성된 논리주소를 갖고 페이지 테이블을 참조하여 물리주소로 변
환하여 접근하게 된다 .
• 요구 페이지 (demanding page) : 하나의 프로세스는 조각난 메모리의 frame 들에 할당된 page 들로 구성되어 있고
자체의 페이지 테이블을 갖고 있다 . 이러한 page 들 가운데 자주 사용되지 않는 page 들은 사실 메모리 공간을 쓸데
없이 차지하고 있는 셈이다 . 따라서 운영체제에서 사용이 매우 적은 page 들을 검색하여 그 위치에 다른 프로세스의
필요한 page 들로 교체하는 기능을 가진다면 제한된 메모리 용량에 대해 매우 효율적인 이용을 기할 수 있을 것이다 .
그러나 page 의 교체가 자주 발생하는 thrashing 과 같은 이상 동작이 발생하여 HDD 를 자주 접근하여 속도가 느려지
는 현상이 발생한다 . 그러나 이러한 역기능을 억제하기 위한 알고리즘이 개발되어 이러한 문제는 거의 없어졌다 .
• page table pointer in register : 하나의 프로세스들은 하나의 page table 을 가진다 . 논리주소를 물리주소로 빠르게 변
환하여 프로세스의 코드를 실행해야 하기 때문에 page table 은 가급적 CPU 내부의 레지스터에 저장되어 있어 접근성
이 좋은 것이 가장 바람직하다 . 그러나 프로세스의 코드 길이가 매우 크다면 page table 의 entry 수 (page 수와 이에
대응하는 frame 수 , 즉 page table 줄 숫자 ) 도 매우 크고 이를 CPU 내의 한정된 용량의 레지스터에 기록하는 것은
불가능하다 . 이 대신에 page table 이 주 메모리에 위치하되 시작주소 즉 포인터를 레지스터에 저장하는 방법이 있다 .
• demanding page table : 매우 큰 프로세스에서 page table 의 entry 수가 매우 클 때는 page table 자체의 크기가 매우
커서 메모리를 많이 차지하기도 한다 . 이 경우에 당장 그 프로세스가 사용하는 page 들에 대한 page table 의 entry
들만을 주 메모리에 저장하여 메모리를 절약하는 방법이 있다 .
• TLB (Translation Lookaside Buffer) : 프로세스의 처리속도를 빠르도록 논리주소를 물리주소로 빠르게 변환하기 위해
참조하는 page table 은 가급적 CPU 로부터의 접근성 ( 거리가 가까움 ) 이 좋은 것이 가장 바람직하다 . 가장 접근성이
가까운 것은 앞서 언급한 대로 CPU 내의 레지스터이고 그 다음이 캐쉬 구조이다 . 이러한 특정 프로세스의 특정 page
table entry 를 CPU 에 인접해 있는 캐쉬 메모리 (TLB) 에서 검색하고 있으면 곧 바로 page entry 의 frame 및 오프셋
으로부터 물리주소를 얻어 CPU 는 이 물리주소로 캐쉬 메모리 (TLB 가 아닌 주 메모리와 관련된 캐쉬 ) 에 접근한다 .
Linux kernel
• BSD Socket Interface API : bind, connect, accept, send, recv 등으로 대변되는 BSD socket interface
를 제공하는 부분이다 .
• Network Protocol Stack : ipv4, ipv6, atm, x25 와 같은 프로토콜 스택을 가지고 있는 부분이다 .
• ps -e (f, j, l) : UID( 사용자 ID), 프로세스 ID(PID), 부모 프로세스 ID(PPID), 세션 ID(SID), 플래그 (F),
상태 (S) 등의 정보가 보임 . 프로세스의 상태 정보에는 {D : I/O 처리중 , R : 작동 중 , S : 이벤트를 기
다리는 중 , T : 시스널에 의해 중단된 상태 , W : 페이징 작업 중 , Z : zombi process 는 작동이 끝난 상
태로서 부모 프로세스로부터의 wait( ) 커널함수에 의해 프로세스가 해제되길 기다리는 프로세스 } 가
있다 . 세션은 로그온한 각각의 사용자를 지칭하고 – e 옵션은 전체 세션에 대해 돌아가는 프로세스에
대한 정보를 보여 준다 .
int main(){
struct sigaction act; //signal action 구조체
act.sa_handler=sig_handler; // 시스널 받을 때 액션을 할 함수 포인터
sigfillset(&act.sa_mask); // 다른 시그널 마스크
act.sa_flags=SA_RESETHAND; // 핸들러 실행후 기본값으로 리셋
(void) sigaction(SIGINT, &act, NULL); //Ctrl + C 인터럽트에 의한 시그널 받았을 때 앞서 정의된 action 으로 처리
while(1){
sleep(3);
printf("waiting for SIGINT...\n");
}
}
프로그램 위치 시스템
• Ctrl + C 를 치면 SIGINT 의 시그널이 발생되
터미널 어 그러한 시그널이 발생될 때 처리하라는
[root@localhost /]# cd work/socket_ code
[root@localhost socket_code]# gcc –o sig_intr signal_intr.c sigaction(SIGINT, &act, NULL) 함수에 의해
컴퓨터
[root@localhost socket_code]# . / sig_intr act 구조체의 sa_handler 멤버에 설정된 처
waiting for SIGINT...\
waiting for SIGINT...\
리함수 포인터 내용대로 sig_handler( ) 함수
Root 폴더 waiting for SIGINT...\ Ctrl + C 로 가서 처리하게 된다 . 이와 같이 한 후에도
"I catched a signal (number=3)
계속 main( ) 에서의 실행이 계속되는데 다시
waiting for SIGINT...\
• Socket 은 (IPv4, IPv6, X25), (stream, datagram, raw IP), (TCP, UDP) 의 세 가지 인수를 가지고 파일
기술자와 같이 socket descriptor 를 반환한다 .
Protocol family 설명
PF_INET Ipv4
PF_INET6 Ipv6
• serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
- sin_addr 은 in_addr 구조체로서 8 비트씩 쪼개진 4 개의 IP(192.168.123.165) 를 나타낸다 .
- htons( ) 는 little endian 또는 big endian 의 프로세서 내부 레지스터와 메모리 사이의 바이트 정열
의 차이에 따라 올바르게 정열하는 함수이다 . htons 는 host to net short integer, htonl 은 host to net
long integer 임 .
• if(listen(serv_sock, MAXQUE)<0)
int listen(int sockfd, int backlog) 는 해당 소켓의 대기열 사이즈 안에 버퍼링한다 . 성공하면 0, 실
패하면 1 을 반환
Root 폴더
[root@localhost socket_code]# gcc –o tcpechocli tcpechocli.c
• 클라이언트로부터 접속하자 마자 에코 서버 프로그램에서는 받아들
[root@localhost socket_code]# . / tcpechoserv 7000 여서 (accept 함수 ) 송신지 주소인 clnt_addr.sin_addr 를 “ Echo
Echo request from 127.0.0.1 request from ~” 과 같이 출력하고 이를 포함해서 client socket 을 구
2GB 미디어
성.
• 클라이언트가 서버에 접속한 후 입력 문자열을 서버로 보내기 위해 자신의 소켓을 통해 send 함수를 사
용한다 .
• 서버에서는 클라이언트로부터 보내진 문자열을 client socket 을 통해 recv 함수를 사용하여 메시지 버퍼
에 저장하고 이를 다시 client socket 을 통해 클라이언트로 송신한다 .
#include <arpa/inet.h>
if(connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr))<0)
char msg_buf[MSGBUFSIZE];
unsigned int msg_size; msg_buf[msg_size] = '\0';
printf("Echo from the server: %s", msg_buf);
if(argc != 3){
fprintf(stderr, "Usage: %s <server IP> <echo port>\n", argv[0]); close(sock);
exit(1); exit(0);
} }
exit_error("socket() failed");
// tcpechocli.c
Echo socket program
• HP 에서 echo server C 코드를 TB 에서 동작시키도록 하기 위해 “
arm-linux-gcc –o tcpechoserv_arm tcpechoserv.c” 와 같이 컴파일
한 후에 실행 이미지를 TB 에 다운로드한다 . TB 에서 포트 7000 번
으로 에코 서버를 구동한다 .
프로그램 위치 시스템
터미널
[root@localhost /]# cd work/socket_ proc
[root@localhost socket_code]# ls
Clone2.c clone2 process2.c process signal_intr.c sig_intr zombie1.c zombie1
컴퓨터 tcpechoserv.c tcpechocli.c
[root@localhost socket_code]# gcc –o tcpechocli tcpechocli.c
[root@localhost socket_code]# gcc –o tcpechoserv tcpechoserv.c
Root 폴더
[root@localhost socket_code]# arm-linux-gcc –o tcpechocli_arm tcpechocli.c
[root@localhost socket_code]# cp tcpechocli_arm /tftpboot/.
[root@localhost socket_code]# ifconfig eth0 192.168.123.166 up
2GB 미디어
[root@localhost socket_code]# service xinetd restart
…
[root@localhost socket_code]# . / tcpechoserv 7000 (3) (1)
(5) [root@EMPOS /]# tftp –r tcpechocli_arm –g 192.168.123.166
Echo request from 192.168.123.166
[root@EMPOS /]# ls
Echo request from 192.168.123.165 (10) (2)
… tcpechocli_arm …
• HP 에서 echo server 를 “ . / tcpechocli 7000” 와 같이 포트 7000 번 [root@EMPOS /]# chmod 755 tcpechocli_arm
(6)
으로 구동한다 . TB 에 client 프로그램을 작동시키도록 먼저 “ arm- [root@EMPOS /]# . / tcpechocli_arm 192.168.123.166 7000
#include <unistd.h> }
#include <errno.h>
#include <wait.h> if((serv_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP))<0)
exit_error("socket() failed");
#include <sys/file.h>
#include <sys/socket.h> memset(&serv_addr, 0, sizeof(serv_addr));
#define MSGBUFSIZE 80
if(bind(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr))<0)
• 허용된 사용자들이 네트워크를 통해 host 에 접속해서 자신의 파일시스템을 액세스하는 이면에는 host
자체가 사용자들에게 특정의 서비스를 제공할 수 있다는 의미이다 . 이것이 host 가 특정 용도 ( 웹 ,
FTP, telnet, mail, DNS 등 ) 를 가지는 서버로서의 기능을 가지고 사용자들은 이 서비스를 제공 받는
client 가 된다 . 이와 같이 server 와 client 간의 네트워크를 통해 통신을 하기 위해서 특정 프로토콜이
있고 각각은 server 및 client S/W 가 돌아가야 한다 .
user1
user2
host
처음 로그인하면 이 위치
/
• Root 계정의 슈퍼유저 ( 운영자 , admin) 는 리눅스 설치시에 암호를 정하고 그 때 사용자계정도 만들 수
있지만 리눅스 설치 후에 기동해서 리눅스 환경에서 useradd 라는 컴맨드를 사용해서 사용자들을 추가
할 수 있다 . 일반 사용자는 root 운영자와는 달리 시스템을 변경할 수 없지만 (useradd 명령을 내릴 수
없다 ), 때로는 super user 로서 시스템을 제한 적으로 변경하고자 할 때 자신이 su 라는 명령어를 사용
해서 root 권한을 가질 수 있다 . 반대로 사용자 계정을 제거하려면 userdel 명령어를 사용한다 .
Multi-User Linux system
프로그램 위치 시스템
터미널
.. …
파일명은 틀리지만 같은
file1 inode 를 사용하기 때문에 같
link 은 파일이다 . 그러나 하나의
파일을 수정하면 다른 파일도
inode 같이 변하게 된다 .
file2
fd 0 stdin fd 0
fd 1 stdout fd 1
Process ID 5248 Process ID 5236
fd 2 stderr fd 2
fd 3
File1, inumber 3 fd 3
fd 4
File2, inumber 10 fd 4
File3, inumber 25
과 같이 나타난다 .
구분에서 d : 디렉토리 , - : 일반 파일
•「 chmod u+w g=rw o-w somefile 」하면 somefile 의 접근권한을 사용자의 경우 (u) 쓰기 권한을 추
가 , 그룹 (g) 의 경우 읽기 및 쓰기 권한 설정 , 기타 (o) 의 경우 쓰기 권한 삭제를 한다 . 결국 rwxrwxr--
이 된다 . 이보다는 u, g, o 각 3 비트씩 해서 숫자로 표시하면 「 chmod 774 somefile 」와 같이 하는
게 더 보기 좋다 .
File system
ls > filelist.txt
• 방화벽 관련은 iptables –F, setup 에서 해제할 수 있고 Selinux 는 X-window 의 Selinux management 에
서 default setting 을 disable 로 한다 . 방화벽을 비활성화 시키고 해야
Linux Directory (1)
/root /userid
Documents nautilus Documents nautilus
.Xauthority .ami .bash_history .bash_logout .Xauthority .ami .bash_history .bash_logout
.dia .gconf .gnome .mozilla .swp .dia .gconf .gnome .gqview .gtkrc
.viminfo .mplayer
Linux Directory (2)
• Root 또는 사용자 로그인하는 과정 : LINUX 는 다수의 사용자들의 고유 접근 권한 및 데이터 영역을 가
지고 있고 다수 접속과 multi task 기능을 가진다 . Root 는 최고 권한을 가지는 super user 로서의 권한을
가져서 시스템을 관리 운영할 수 있어 사용자 계정을 생성해 줄 수 있고 권한도 규정할 수 있다 . 반면 일
반 사용자 계정에 등록된 사용자는 사용할 수 있는 영역이 제한되어 있어 시스템을 건드릴 수는 없지만
su 컴맨드를 사용하여 일부 super user 의 권한을 자체적으로 가질 수 있다 .
• Ctrl + Alt + F1~F6 : text 콘솔 , Ctrl + Alt + F7 : X-window 콘솔 , 콘솔에서 사용자 계정으로부터 로그아웃
하는 방법은 exit 명령어를 치거나 , Ctrl+D 키를 입력하여 로그아웃 한다 .
• 리눅스 시스템의 호스트 이름은 /etc/sysconfig/network 파일에 등록되어 있다 .
• 작업 위치는 현재 로그인 사용자 계정의 홈 경로를 의미한다 . 예를 들면 sulinuxuser 라는 계정으로 로그
인하였을 때의 홈 디렉토리 경로는 /home/sulinuxuser 가 되는데 이때 이 경로를 모두 표시하는 것이 아
니라 ~ 기호로 표시하게 된다 .
• 리눅스 시스템을 종료는 윈도우와는 달리 반드시 shutdown 컴맨드를 사용해서 안정적으로 종료해야 한
다.
[ 계정명 @ 시스템이름 현재작업위치 ] 프롬프트 기호
구분자 설 명
root 로그인한 사용자 계정명
localhost 리눅스 시스템의 호스트명
~ 현재 작업 디렉토리 위치
명령어 대기 커서
디렉토리 명 기능 특성
bin LINUX command 유동
boot 부트 이미지 유동
dev fd(floppy disk), cdrom, mem, modem, /dev/mem, 유동
/dev/sda1, /dev/zero
etc 시스템 환경 설정 유동
home 사용자 홈 유동
lib 공유 라이브러리 및 커널 모듈 유동
lost+found 파일시스템 복구를 위한 fsck(file system check) 링크 유동
misc 기타 유동
mnt 디바이스 마운트 유동
opt Add-on 소프트웨어 패키지 고정 , 공유 가능
proc 커널과 프로세스를 위한 가상파일 시스템 유동
root 루트 사용자 홈 디렉토리 유동
sbin 시스템 명령어 고정 , 공유 가능
tmp 임시 작업 유동
usr /local /share / 고정 , 공유 가능
var 가변 자료 유동
Linux Directory
[root@ciss9 /]# ls -l
total 136
drwxr-xr-x 2 root root 4096 Aug 12 05:44 bin
drwxr-xr-x 2 root root 4096 Aug 12 05:48
boot
drwxr-xr-x 6 root root 36864 Oct 10 04:02
dev
drwxr-xr-x 37 root root 4096 Oct 11 14:28
etc
drwxr-xr-x 14 root root 4096 Oct 1 11:41
home
drwxr-xr-x 4 root root 4096 Aug 12 05:42 lib
drwxr-xr-x 4 root root 4096 Aug 12 05:36
mnt
dr-xr-xr-x 89 root root 0 Sep 6 23:49 proc
drwxr-x--- 17 root root 4096 Oct 12 07:01
이들 디렉토리에 대해서 간단히 설명하면 다음과 같다 .
root
drwxr-xr-x 3 root root 4096 Aug 12 05:44 / : 최상의 디렉토리인 루트 디렉토리 .
sbin /bin : 중요하고 꼭 필요한 명령어가 있는 디렉토리 .
drwxrwxrwt 7 root root 4096 Oct 12 04:02 /boot : 커널 (vmlinux 등 ) 시스템 부팅에 관련된 파일을 저장하고 있는 디렉토리 .
tmp /dev : 시스템 디바이스 (device) 파일을 저장하고 있는 디렉토리 . /dev/mem, /dev/sda1, /dev/zero
drwxr-xr-x 22 root root 4096 Aug 12 05:41 /etc : 패스워드파일등 시스템의 전체 환경설정파일을 저장하고 있는 디렉토리 .
usr /home : 사용자의 홈디렉토리 , ID 와 동일한 이름으로 디렉토리를 가짐 .
drwxr-xr-x 20 root root 4096 Aug 12 05:44 /lib : 프로그램 (C, C++ 등 ) 에 필요한 각종 라이브러리를 저장 .
var m/mnt : 플로피 , CD-ROM 등 마운트를 위한 디렉토리 . 업버젼에서는 media
[root@ciss9 /] /proc : 실행중인 프로세스나 현재 시스템의 정보를 파일형태로 보여주는 가상디렉토리 .
/root : root 의 홈디렉토리 .
/sbin : 시스템 관리자용 명령어를 저장하고 있는 디렉토리 .
/tmp : 일시적인 저장을 위한 디렉토리 .( 정기적으로 삭제됨 )
/usr : 각종 어플리케이션등이 설치되어 있는 디렉토리 .
/usr/X11R6 : X 윈도우 시스템의 루트 디렉토리 .
/usr/include : C 프로그램에 필요한 헤드파일 (*.h) 디렉토리 .
/usr/lib : /lib 에 들어가지 않은 라이브러리 디렉토리 .
/usr/man : 명령어들의 도움말을 주는 매뉴얼 (manual) 페이지 디렉토리 .
/usr/sbin : /bin 에 제외된 명령어와 네트웍관련 명령어가 들어있는 디렉토리 .
/usr/src : 프로그램 소스 ( 주로 커널소스 ) 가 저장되는 디렉토리 .
/usr/local : 아파치 같은 추가 소프트웨어가 설치되는 장소 .
/var : 시스템운용중에 생성되었다가 삭제되는 데이터를 저장하는 디렉토리 .
/var/log : 각종 로그파일이 저장되는 디렉토리 .
/var/spool/mail : 메일이 일시적으로 저장되는 디렉토리 .
/var/spool/lpd : 프린트를 하기 위한 임시 디렉토리 ( 스풀링 디렉토리 ).
LINUX Command
컴맨드 명 기능
rpm, source
tar, gzip, vi, grep
arm-linux-gcc, tftp, minicom,
ifconfig
make, jmflash test led 부트 컴맨드를 사용해 TB 를 동작시켜 보는데 부트로더에 이 함수를
수정해서 컴파일하고 실행시켜 본다 .
patch, make clean
dd, mkfs, mount, gzip
tftp –g ip_number HP 에서 mmap 을 이용한 가상논리주소로 LED 접근해서 제어하는 응용 프로
그램을 arm-linux-gcc 의 크로스 컴파일러가 제공하는 라이브러리를 사용하여
개발하고 컴파일된 실행 이미지를 tftp –g ip_number 를 사용해서 TB 의 포팅
된 리눅스 환경의 현재 디렉토리로 전송한다 . ./led 를 해서 TB 의 포팅된 리눅
스 환경에서 돌아가도록 한다 .
insmod, mknod, rmnod 포팅된 리눅스 임베디드 TB 에서 LED 를 제어하기 위한 응용프로그램을 동작시
키는데 LED 드라이버 프로그램을 사용해서 접근할 수 있다 .LED 의 물리주소를
논리주소로 변환하는 함수 (open), LED 에 쓰기 함수 (write), 닫기 함수
(close), 초기화 함수 (init), 종결함수 (exit) 로 구성된다 . linux 에서 제공하는
device 를 open 하고 거기에 쓰고 , 닫는 과정의 응용프로그램을 구성할 수 있
다 . 여기서 device driver 의 함수에 연결된다 . 초기화 함수 (init), 종결함수
(exit) 는 linux 에서 insmod 드라이버명 , rmmod 드라이버명의 컴맨드에 의
해서 기동되어 디바이스 드라이버를 등록하고 소멸시킨다 .
LINUX Command
컴맨드 명 기능
useradd, userdel, su 사용자 계정 등록 / 사용자 해제 / 운영자 자격 격상
logout, exit 세션 로그아웃 / 비슷 , ctrl+d
env, export 로그인 계정의 환경변수 보기 / 환경변수 설정하기
man Manual 보기 , 빠져 나오려면 q
apropos
info 정보 보기
ls 시스템 환경 설정
find 루트에서 파일 찾아야 함 . -name minicom*.*
Chmod
rpm(Redhat package -qa 질의모드 . –ivh install,verbose, hash(#)
manager)
cat, sort 파일의 내용을 stdout 으로 출력
cat –n
/ 정렬
yum
shutdown –h now 리눅스 시스템을 종료 , power off
shutdown –r now 리눅스 시스템 재부팅
su 사용자가 root 계정의 super user 로서의 권한을 가짐
grub
Gedit, vi
vi command
유용한 vi 명령어
삽입
I: 줄의 제일 앞에서 입력
A: 줄의 제일 끝에서 입력
콤보 command
4w: 4 단어 skip 후 이동
4b: 4 단어 skip 후 이동
4j,h,k,l: 커서이동시 지정한 수만큼 건너뛰므로 이동을 좀 더 빨리 할 수 있다 .
줄의 결합 (J)
2 줄이 있고 , 2 째줄을 1 째줄 끝에 붙이고 싶다면 , 1 째줄에서 J 를 입력하면 된다 .
커서이동
0: 줄의 처음
^: 줄의 처음 ( 글자가 시작되는 처음 )
$: 줄의 끝
w: 단어단위 이동
e: w 와 같으나 단어의 끝으로 이동
b: w 의 반대방향으로 이동
H, M, L: 커서를 화면 상 , 중 , 하로 이동
검색 (/ 후 검색할 단어입력 )
n: 뒤로 검색
N: 앞으로 검색
vi command
매크로
ab aa aaaa: aa 를 입력하면 aaaa 로 자동변환
치환
s/pattern/replace: 현재줄의 첫번째 matching pattern 치환
s/pattern/replace/g: 현재줄의 모든 matching pattern 치환
%s/pattern/replace/g: 모든 줄의 치환
line,lines/pattern/replace: 해당 범위의 치환
저장
w>> file: 지정한 파일에 추가
윈도 split
vi 내에서 위아래로 윈도가 분활되면서 2 개의 파일을 동시에 open/ 편집할 수 있다 .
ex-mode(: 프롬프트상태 ) 에서 'sp 파일이름 '
윈도우가 전환은 Ctrl+ww
기타
1. d 의 경우 command 모드로 계속 남아 있으나 c 는 삭제후 insert 모드로 변환한다 .
cc, c$, cw 등은 유용하게 사용될 수 있다 .
2. . 은 마지막 명령을 되풀이한다 .
visual 모드
윈도의 텍스트 에디터와 같이 선택부분이 반전되면서 복사 , 삭제등을 할 수 있다 .
v 로 visual 모드로 집입하여 커서키를 사용해 원하는 부분을 선택한다 .
복사는 y, 삭제 / 잘라내기는 d 로 할 수 있다 .
vi command
vi 설정 (vim 설정 )
자신의 홈디렉토리에 .vimrc 를 생성하고 다음과 같이 할 수 있다 .
set ai
set ts=4
set nu
레코딩
설정파일의 주석추가 / 삭제시 유용하게 사용할 수 있다 .( 이미 vi 에 매크로기능이 있지만 ,
레코딩이 UltraEdit 의 매크로기능과 유사하다 .)
q{a-z}: {a-z} 로 레코딩 시작 . {a-z} 만 가능한게 아니고 실제 {0-9a-zA-Z"} 를 적기 번거로워
이렇게 표시만 한 것이다 .
q: 레코딩 종료
@{a-z}: 레코딩 내용 적용 (@@ 를 하면 바로 이전의 레코딩내용을 적용 , N@@ 은 N 으로
지정한 숫자만큼 적용 )
vi command
ctags 사용
쉘에서 ctags -R 하여 모든 소스에 대해 인덱스 생성
vi 를 실행하고 검색할 단어를 :ta tag 로 지정하든지 , 단어가 있는 곳에 커서를
둔다 .
해당함수 ( 오브젝트 ) 가 정의된 곳으로 가기 : Ctrl + ]
되돌아가기 : Ctrl + t
여러 파일 편집
vi a.c b.c c.c 와 같이 여러 파일을 지정한다 .
args: 파일목록 표시
n: 다음파일 편집 (vi 시작지 지정하지 않는 파일은 'n 파일이름 ' 이로 지정하면
된다 .)
rew: 이전 파일 편집 (vim 에선 prev 를 사용해도 된다 )
* 현재 편집중인 파일을 저장해야 다음 파일을 수정할 수 있음에 주의
( 불편한 편집이 아닐 수 없다 .)
• OSI 각 계층의 API : 하위계층 API device driver, 전달계층 (transport) 의 프로토콜 TCP/IP 를 위한 API 소켓 ,
응용계층의 API HTML
(OSI1,2)<IP,ARP(OSI3)<TCP,UDP(OSI4)<session<presentation<HTTP,FTP,telnet,SMTP(OSI7)
• IP 는 인터넷 계층으로서 (network layer) 비연결성의 특성을 갖고 32 비트의 송수신 IP 주소를 가지고 송신단에
서 여러 라우터를 거쳐서 수신단에 이르게 된다 .
IP 패킷 구성요소 기능
Version IPv6, IPv4
Internet Header Length 헤더의 길이
Service Type
Total Length 전체 길이
Identification 조각난 패킷의 순서 번호
DF : DeFragment 즉 어떤 노드에서 수용할 수 있는 패킷 길이를 초과할 경우 패킷을 조각낼 필요가 있는데 이 때 이 비트
Flags 가 1 로 되어 있으면 조각내지 않음 . 따라서 조각낼 필요가 있을 때는 그 노드에서 에러가 발생한다 . 패킷을 조각내지 않
도록 , More : 1 이면 패킷이 더 있다는 뜻임
Fragment Offset
Time to Live 수명이 정해져 있어서 많은 수의 노드를 거칠 경우 중간 노드 ( 라우터 ) 에서 패킷이 제거됨
Protocol 상위 계층의 프로토콜이 무엇인지 TCP, UDP 인지를 구분
Header Checksum
Source IP Address 10000001 00001010 00000110 00000111 129.10.6.7
Destination IP Address
TCP 또는 UDP data
• Class 를 두는 이유는 여러 호스트들을 묶어서 하나의 네트워크 그룹으로 만드는데 A class 가 가장 많은 호스트들
을 하나의 네트워크 안에 가질 수 있지만 네트워크 개수는 가장 작다 .
• IP 패킷의 필드에서 fragment 에 대한 설정이 있는데 그 이유는 두 연결 노드 사이에 여러 개의 서브넷 노드들이 존재하
고 이들이 수용할 수 있는 최대 패킷 크기 (MTU, Maximum Transmission Unit) 가 있기 때문에 이에 맞춰서 보내고자 하
는 데이터 크기를 조각낼 (fragmentation) 필요가 있다 . 특히 최 하위 계층인 이더넷의 프레임이 수용할 수 있는 데이터
필드의 최대 크기가 1500 바이트임을 감안하면 더욱이 그렇다 . 즉 각 계층에서 처리할 수 있는 데이터 크기와 통과 노
드들에서 전달 가능한 최대 패킷 크기 가운데 가장 작은 크기 (path MTU) 에 맞춰서 데이터 사이즈를 조정할 필요가 있
다.
• telnet cc.kangwon.ac.kr 과 같이 PC 에서 telnet 응용 서비스를 호출한다 > domain name list 로부터 수신지의 IP 주소
를 얻는다 > TCP 단계를 거쳐 > IP 계층에서는 수신지 IP 주소의 netid 와 자신의 IP 주소의 netid 가 같은지 아닌지
확인하고 같으면 ARP(Address Resolution Protocol) 를 구동하여 ARP 에 의해 같은 LAN 내의 호스트들에게 IP 주소를
캐스트 하여 해당 수신지로부터 MAC 주소를 가져온다 > 이제 이더넷을 통해 송수신 MAC 주소 , 상위로부터의 패킷 ,
에러정정부호 , 동기부호를 붙여 프레임을 구성하고 수신지로 보낸다
• TCP 는 많은 양의 데이터를 끊김 없이 순서대로 패킷의 송수신을 가능하게 하는 트랜스포트 계층에서의 연결형 프로토
콜이다 . 즉 트랜스포트 계층에서 종점간의 연결 개설 , 패킷 전달 순서 확인 , 오류 발생시 패킷 재전송 , 중복패킷 제
거 , 흐름제어 , 네트워크 오동작 시 보고하는 등의 기능을 갖고 있다 . 즉 송수신단의 연결설정과 연속적 패킷의 스트림
을 보장하는 프로토콜이다 .
- 상위 응용계층에서 telnet, http, ftp, smtp 와 같이 파일 또는 메일과 같이 신뢰성과 순차적 스트림 전송에 대한 응용 서비
스를 지원한다 ,
- 신뢰성은 많이 떨어지나 헤더의 길이가 짧고 연결 설정에 대한 지연이 없기 때문에 간단한 패킷을 실시간에 주고 받는
경우 , 패킷을 broadcast 하거나 multicast 하는 경우 , UDP 기능만을 지원하는 서버의 경우에는 UDP 프로토콜을 사용
한다 .
- TCP 는 통신을 하는 두 노드 사이의 연결 설정을 위한 오버헤드가 크다 . 반면에 UDP 의 경우는 패킷의 구조가 간단한
비연결형 데이터그램이기 때문에 헤더의 크기가 적어 짧은 길이의 데이터 통신과 빠른 실시간 서비스에 있어서는 최적
이다 . 특히 LAN 내에서의 UDP 사용은 LAN 내부에서의 전송 오류가 거의 없고 데이터의 순차도 지켜지기 때문에
TCP 보다 오버헤드가 적은 UDP 가 유리하다 . 따라서 domain name 서비스나 LAN 내에서의 데이터 전송 서비스인
NFS(Network File System) 서비스에 적용할 수 있다 .
• MAC 주소 ( 이더넷 ) < IP 주소 (IP 계층 ) < Port 번호 (TCP UDP 계층 ) 컴퓨터 네트워크 프로그래밍 김화종저 p3-12
TCP field structure (1)
• TCP 에서의 연결 절차 : (1) port A 에서 port B 로 연결 설정하기 위해 SYN 비트를 1 로 하고 Sequence Number 필드
에 보내는 데이터가 몇 번째 바이트인가를 나타내는 X 를 만들어 하위 계층으로 보낸다 (2) port A 의 IP > 이더넷 (3)
port B 의 이더넷 < IP (4) port B 의 TCP 계층에서 port A 로부터 받은 X 번째 바이트의 데이터에 대해 확실히 수신했
다는 메시지를 보내기 위해 ACK number 필드에 (X+1) 을 채우고 ACK 비트를 1 로 설정해서 응답한다 . 또한 port A
로 port B 자신도 연결 설정을 하겠다는 의미로 SYN 비트를 1 로 설정하고 보내는 데이터가 몇 번째 바이트인지를
Sequence Number 필드에 Y 로 해서 전체 패킷을 구성하여 하위 계층으로 보낸다 . (5) port B 의 IP > 이더넷 (6) port
A 의 이더넷 < IP (7) port A 의 TCP 계층에서 port B 로부터 받은 Y 번째 바이트의 데이터에 대해 확실히 수신했다는
메시지를 보내기 위해 ACK number 필드에 (Y+1) 을 채우고 ACK 비트를 1 로 설정해서 응답한다 .
• TCP 의 패킷 구성 필드에서 흐름제어와 관련된 window 필드에는 자신이 수용할 수 있는 데이터 사이즈의 크기를 설정
함으로써 흐름제어를 원활히 한다 . 두 통신 노드 간에 조각낼 필요 없이 원활하게 소통할 수 있는 데이터의 최대 크기를
path MTU 라고 하는데 대체로 이더넷의 1500 바이트 내로 하는 것이 보편적이다 . 따라서 window 필드에도 이 정도의
1460 바이트로 설정하는 것이 일반적이다 .
TCP 패킷 구성요
기능
소
Source Port
Destination Port
Sequence Number 전체 데이터 중 현재 보내는 송신 데이터가 몇 번 째 바이트인지를 나타내는 순서 번호
Ack number 상대방으로부터 수신한 데이터가 몇 번째 바이트까지 들어 왓는지를 나타냄
Header length
URG : 긴급 데이터임을 표시하는 비트
ACK : 수신했음을 알리는 비트
Code bits
SYN : 최초 데이터를 보내기 위해 연결 설정함을 표시하는 비트
FIN : 연결 해제를 나타내는 비트 , RST : 연결을 리셋
Window 흐름제어용 윈도우 크기
• 서버
- 연결형 서버 : TCP 와 같이 접속하는 client 마다 소켓을 사용해야 하므로 서버에 다소 부담은 되지만 연결성이
좋다 . / 비연결형 서버 : UDP 와 같이 접속하는 client 마다 소켓을 사용할 필요가 없어 broadcast 의 서비스에 사
용할 수 있다 . 그러나 연결성이 떨어진다 .
- 반복형 (iterative) : 서버에서 하나의 프로세스가 다수의 client 들에게 순차적으로 서비스 해 주는 경우로서 서비
스 시간이 짧고 간단할 경우에 적용된다 . 그만큼 서버에서 돌아가는 서비스 프로그램은 간단한다 . / 동시처리형
(concurrent) : 다수의 client 들이 접속하여 서비스를 요청할 경우 서버는 각각에 대해 개별적인 프로세스 (session)
를 할당하여 동시에 처리해 주는 형태이다 . 이 경우에는 서비스의 시간이 불규칙하고 다소 복잡할 경우에 해당되
며 당연히 서버의 서비스 프로그램은 복잡해 지고 부담이 된다 .
• ISP 에게 요청하여 IP 를 확보하고 그 IP 에 대응하는 도메인 이름을 설정할 필요가 있다 . 도메인 이름이 URL 이
되어 사용자가 접속하는 웹서버의 문자 이름이 된다 .
• PHP 를 설치하기 위해 zip 파일을 C:\PHP 에 압축을 풀고 .dll 파일들은 C:\windows\system32 아래에 넣고 ,
php.ini 파일은 C:\windows 아래에 넣는다 . 이제 php.ini 파일을 열어 확장모듈 DLL 파일의 위치 , 웹서버의 루
트 디렉토리 “ doc_root = “C:\ Program Files\Apache Group\Apache\htdocs” 와 같이 설정한다 .
• MySQL(Structured Query) 을 C:\mysql 아래에 설치한다 . C:\windows\my.ini 초기화 파일의 내용을 다음과 같이
수정한다 . ( 기본 폴더에 설치하면 할 필요가 없다 )
서비스를 시작 또는 중지하도록 DOS 실행창에서 하거나 제어판 > 관리도구 > 서비스도구를 사용하여 할 수 있다 .
• 시작메뉴에 아파치 웹서버 서비스를 시작하라는 아이콘을 클릭하면 아파치 서버가 동작하기 시작한다 .
MySQL 성공적인 웹프로그래밍 PHP 와 MySQL, Luke Welling, 류정욱 외 1 인 공역 , 정보문화사 , p971-
979
• MySQL(Structured Query Language) : 관계형 DB 관리 시스템 (RDBMS), 데이터베이스 > 테이블 > 행 / 열 , 키 ,
스키마
자신의 컴퓨터가 아닌 외부의 MySQL 서비스를 제공하는 웹호스팅을 받을 경우 호스트명을 입력하고 웹호스팅
당사에서 부여 받은 사용자 이름을 입력한다 .
• 패스워드를 치고 나면 mysql> 이라는 프롬프트가 나타나 이제부터 MySQL 을 사용하여 데이터베이스를 구축할
준비가 된다 .
• 만들어진 데이터베이스는 MySQL 서버에 존재하고 다수의 사용자들이 접속하여 사용하거나 웹에서 쿼리를 요청
할 수 있다 . 접근 및 사용 권한 설정을 다음과 같이 할 수 있다 .
mysql> grant all ( 엔터 ) ->on *( 엔터 ) -> to fred identified by ‘mnb123’( 엔터 ) -> with grant option;
1 2 3
bookorama.sql
• 데이터베이스 이름은 create database
create database books; books ;
• not null 은 반드시 값이 입력되어야 함을 의미 , auto_increment 는 테이블 내역이 추가될 때마다 id 수자가 자동으
로 증가
Gateway linux server
PC 방 Linux 192.168.0.1 사설 IP 로 설정
gateway 된 secondary ethernet
Portal site
인터넷 server
• 가령 client 가 요청한 웹문서를 Proxy server 가 인터넷망을 통해 portal site server 로 요청 패킷을 보내
면 portal site server 는 proxy server 에게 그 웹문서를 보내고 proxy server 는 수신한 웹문서를 메모리
또는 디스크 ( 캐쉬 ) 에 저장해 놓고 해당 client 에게 보낸다 . 따라서 이 후에 자주 사용하는 웹문서에
대한 client 로부터의 요청에 대해 갱신되지 않았으면 캐쉬에 있는 웹문서를 빠르게 서비스해줌으로써
통신 속도를 개선할 수 있다 .
• Port : IP 가 어떤 집의 주소라고 한다면 포트는 거기에 거주하는 개인으로 비유할 수 있고 64K 포트가
있다 . 80 번 포트는 http, 23 번 telnet 을 서비스한다 .
5500_0000
IIC
special function
5600_0000
IIS
registers
I/O port
5700_0000
RTC
5800_0000
A/D converter
5900_0000
SPI
5A00_0000
SD interface
R0
R1
register
...... file
R13 R13_exc stack pointer
R15
Bluetooth, GPS
VGA 가속기
SDRAM
FF UART
PCMCIA
Flash ROM 을 퓨징
하기 위한 JTAG USB Host, USB2.0 Host
client TDI242LP
sub UART controller
IrDA
MMC,SD
SPI 를 통한 인터페이스
XM-Bulverde base board (3)
PXA27X 로부터 Multimedia
accellorator 2700G 를 통해 고 XM-Bulverde hardware user’s guide p44~
속으로 영상을 전달하도록 한다 .
XM-Bulverde FPGA board
AC codec
주변장치로부터 인터럽트가 PXA27X 의
GPIO(General Purpose IO) 에 연결
Touch screen
데이터 버스 PXA272
graphic
TFT LCD accellorator 2700G GPIO interrupts
PXA IO
주소 (CS0~5, Ax),
부품 제어 인터페이스 상태 인터페이스
데이터 , 제어 버
reset CPLD 스 PXA 내부의 IO
interface 와 연결되어
Bus led, status CPLD CPLD Boot Flash ROM(64MB) /2nd 8 SDRAM(256MB)
led Flash ROM(64MB)
주변장치를 제어
Flash ROM
(64MB)
User 53MB
0x01400000
64MB CS0
Ramdisk 16MB
0x00400000
0x00300000
Kernel
2MB
0x00100000
0x00080000
Boot loader 512KB
0x00000000
0x00000000
Address map of XM Bulverde
0x0880_5000 은 어떤
LED ?
0x1060_0000 은 어떤 LED ?
XM-Bulverde linux user’s
guide, p32, bootloader 에서
test led 0x11
Address map of XM Bulverde
4000_0000
Address map of XM Bulverde
9FFF_FFFF
PXA272 내부 레지스터 파
일
Address map of XM Bulverde
Interrupts and IO interface by using GPIO
CPU core 는 RISC pipeline 구조를 가지고 있고 바로
측근에 IR(Instruction Cache) 및 DC(Data cache) 가
분리되어 존재한다 . CPU core 는 memory controller
를 통해 외부 메모리의 프로그램 코드를 측근의 IR 주변장치로부터 인터럽트를 수합하여 인터럽트 컨트롤
cache 로 가져와 거기에 있는 프로그램 코드를 수행한 러 내부의 제어 레지스터에 설정된 우선순위에 근거하
다. 여 가장 우선순위가 높은 인터럽트신호를 CPU core
로 보내면 CPU core 는 인터럽트 사이클로 접어들면
PXA27X 서 고유의 순차대로 동작한다 . 인터럽트 사이클의 동
작 순차는 CPU core 내부의 상태 및 데이터 레지스터
IC 의 값을 stack 에 보관하고 메모리의 해당 인터럽트의
CPU AMBA ISR 이 놓여 있는 위치로 점프해서 수행하고 ISR 의
core intf RET 인스트럭션을 만나 인터럽트 사이클 돌입 이전의
DC 프로그램 위치로 복귀해서 수행한다 .
AHB
Memory CSx, Ax, Dx, R/W
Interrupt controller
controller
외부의 시스템 버스에 칩선택 신호 , 주소 / 데이터 / 제
어 버스 신호들을 인터페이스 한다 . 시스템 버스에 연
결되는 메모리 또는 IO 인터페이스 칩의 특성에 따라
신호들의 시간 지연을 설정하거나 데이터 폭 등의 내용
DMA/bridge 을 제어레지스터에 설정할 수 있다 .
interrupts
상태
GPIO 주변장치들 CPLD
timer
제어
APB
Configuration
Cyclone II PROM EPC4
FPGA
JTAG
CMOS
Image
Sensor 7-segment
buzzer
Text
LCD
Motor LED
Matrix Dot
driver
keypad matrix
LED
0x0880_5000
Key
Bus pad
LED Dip sw
Reset &
power
XM-Bulverde (5)
System program Device driver program
Bootloader Source (Monitor Program) 및 Image AC’97 Audio Codec Driver Source
Linux kernel (2.6.12) (PXA27x& XM-Bulverde) Source UCB1400 Touch-Screen Driver source
및 Image PCMCIA/CF Device Driver Source
Root File System RAMDisk (BusyBox) Source 및 IrDA Device Driver Source
Image MMC/SD Device Driver Source
Ethernet Device (LAN91C111) Driver Source
Application program USB Host Device Driver
Network Application Source - USB2.0 OTG, Host 지원
- Chat server and client - USB Keyboard, Mouse Application Source
- Talk server and client
Qt/Embedded Source 및 Image Text Web Browser & Remote Control Source
- Address Book, Media Player, Terminal
- Image Viewer, Calendar, Graphic games
- Clock, Spreadsheet, Text Editor
- Control Panel, Virtual Keyboard, Handwriting etc.
Qt Camera Application Source
Graphic and Text Display Control, Application Source
I/O control
I/O Interface Application Source
- 8bit Button Switch, LEDs, 7-Segment Control Source
UART Application Source (Bootloader)
Web Service
- Goahead Embedded Web Server porting
-CGI/HTML (I/O Device Control Source)
Installation Development Tools
• 되도록이면 root 가 아닌 일반 사용자 계정으로 로그인해서 시스템을 함부로 고치지 않고 다양한 리눅스
개발환경 및 응용 프로그램들을 사용하도록 한다 .
터미널
•
프로그램 위치 시스템
관리
네트워크 제어 스크립트 ( 명령어 ) 인
/etc/inet.d/network start ( 또는 stop,
네트웤
restart, reload, status) 라고 치면 네트워
컴퓨터 크를 활성 ( 또는 중지 , 중지 및 활성 , 설
정 변경 , 상태 ) 를 할 수 있다 .
Root 폴더 eth0 IP, gateway, subnetmask, DNS 설정
2GB 미디어
SELINUX=enforcing permitted
SELINUXTYPE=targeted
Setting network in Fedora
네트워크 설정 파일 설정 내용
/etc/hosts 호스트 대비 IP 매핑
/etc/resolv.conf DNS 서버 주소 설정
/etc/sysconfig/network 호스트이름 , gateway <ex> HOSTNAME=localhost.localdomain …
/etc/sysconfig/network-scripts/ifcfg-0, ifcfg-1, NIC(ethernet0,1 등 ) 에 따른 고정 / 유동 (DHCP, Dynamic Host Configuration
ifcfg-lo Protocol), mac address, IP, gateaway, subnet mask, DNS
<ex> DEVICE=eth0 BOOTPROTO=static HWADDR=00:0c:29:cb:fa:7b …
/etc/sysconfig/selinux 보안 설정 <ex> SELINUX=permitted …
YUM(Yellowdog Updater Modified)
명령어 설정 내용
yum install “package”
yum update “package”
yum remove “package”
yum list “package”
yum search “package”
yum provides “package”
yum clean packages(headers) /var/cache/yum/package, /header 밑의 모든 파일을 지운다 .
Installation xinetd & tftp
Service tftp
[root@localhost yum.repos.d]# yum install yum
프로그램 위치 시스템 {
[root@localhost yum.repos.d]# yum search xinetd
socket_type = dgram
telnet-server.i386
터미널 protoco = udp
xinetd.i386
wait = yes
proftpd.i386
user = root
tftp-server.i386
컴퓨터 server = /usr/sbin/in.tftpd
[root@localhost yum.repos.d]# yum list xinetd
server_args = -s /tftpboot
xinetd.i386 : 2.4.14-18.fc9 fedora
disable = no
[root@localhost yum.repos.d]# yum install xinetd
Root 폴더 per_source = 11
Downloading packages : xinetd-2.3.14-18.fc9.i386.rpm
cps = 100 2
….
}
2GB 미디어 [root@localhost yum.repos.d]# cd /etc
[root@localhost etc]# find -name xinetd
. / rc.d / init.d / xinetd . / sysconfig / xinetd
:wq
[root@localhost etc]# cd /work/tools/tftp-server Minicom version ….
[root@localhost tftp-server]# rpm –ivh tftp-server-0.29-3.i386.rpm XM Bulverde Linux Kernel
[root@localhost tftp-server]# ls /etc/xinetd.d ….
tftp ….. [root@EMPOS ~]#cd ..
[root@localhost tftp-server]# cd /etc/xinetd.d [root@EMPOS /]# tftp –r hello –g 192.168.123.166
[root@localhost xinetd.d]# vi tftp Time out
[root@localhost xinetd.d]# cd /
[root@localhost /]# mkdir tftpboot
[root@localhost xinetd.d]# cp work/hello tftpboot/.
[root@localhost xinetd.d]# ifconfig eth0 192.168.123.166 up
[root@localhost xinetd.d]# iptables –F
[root@localhost xinetd.d]# service xinetd restart
xinetd 정지
xinetd 시작
[root@localhost xinetd.d]#
Installation xinetd & tftp
avc: denied
http://www.linux.co.kr/home2/board/bbs/board.php?bo_table=lecture&wr_id=1448
defaults{
최대 초당 50 회 무차별 접속 후 10
log_type = SYSLOG demon info
초 지연 대기
cps = 50 10
v6only = no
…..
• xinetd 는 telnet, vsftpd, tftp, ftp 등
을 통합 관리하는 internet super
} /etc/xinetd.conf
demon 으로서 /etc/xinetd.conf 에서
무차별 서비스 접속 (Denial of
service telnet{ Service) 에 대한 접속시도를 제한하
flags = REUSE 거나 /var/log 에 기록 내용 등을 설
socket_type = stream 정한다 . /etc/xinetd.d 아래의 각종
wait = no 서비스에 대한 설정
path 에 지정된 경로에 자주 사용하는 명령어의 결로를 앞쪽에 두는 것이 좋다 . path 에 설정된 경로를 찾
을 때까지 앞에서 뒤쪽으로 차례대로 검색 .
unset USERNAME
• fiberamp 계정으로 로그인해서 arm-linux-gcc 를 사용하지 못하는 이유는 무엇일까 ? root 계정에서 해야
하나 ? /home/fiberamp/.bash_profile 을 열어 동일하게 path 를 걸어 줘야 한다 . 또는 /root/bash_profile
에서 “ unset USERNAME” 을 “ set USERNAME” 으로 ?
Installation of arm compiler
#Include <stdio.h>
Int main(void){
int I;
프로그램 위치 시스템 for(i=0;i<3;i++)
printf(“%d hello embedded world\n”, i);
터미널
}
(2)
프로그램 위치 시스템
Minicom version ….
터미널 XM Bulverde Linux Kernel
[fiberamp@localhost ~]$ mkdir work
….
(1) [fiberamp@localhost ~]$ cd work HP 에서 minicom 을 통해 TB 의
[root@EMPOS ~]#cd ..
[fiberamp@localhost work]$ vi hello.c linux 커널이 부팅된 상태를 볼 수
컴퓨터 [root@EMPOS /]#ls 있다 .
[fiberamp@localhost work]$ arm-linux-gcc –o hello hello.c
[root@EMPOS /]# root usr etc var mnt dev
[fiberamp@localhost work]$
Minicom version ….ls [root@EMPOS /]#mkdir work
Root 폴더 [fiberamp@localhost
XM Bulverdework]$
Linuxhello
Kernelhello.c [root@EMPOS /]#cd work
[fiberamp@localhost
…. work]$
[root@EMPOS work]#
[root@EMPOS ~]#cd ..
2GB 미디어 [root@EMPOS /]#ls (3) Ctrl+a, z
…..
[root@EMPOS /]# root usr etc var mnt dev
Send file S S
[root@EMPOS /]#mkdir work
Port setup P
[root@EMPOS /]#cd work
TB 의 리눅스에서 실행파일을 실행 ….
[root@EMPOS work]#ls (4) …..
시켜 보면 제대로 돌아 감을 볼 수
[root@EMPOS work]#hello Zmodem
있다 .
…..
[root@EMPOS work]#./hello ….
[work] hello
0 hello embedded world
Space bar 한 번 누르면 디렉토리 이동 , 두 ….
1 hello embedded world
2 hello embedded world 번 누르면 선택해서 시리얼 포트를 통해 HP
에 있는 실행 파일 hello 를 TB 로 전송
Transmission thru LAN by NFS
• 앞서의 hello 실행 파일을 시리얼 포트를 통해 TB 로 전송했지만 큰 용량의 파일을 느린 시리얼 포트를
통해 TB 로 보내면 많은 시간이 걸리기 때문에 ethernet 을 통해 전달하면 100Mbps 의 빠른 속도로 보
낼 수 있다 . 이를 위해 앞서 xinetd 데몬의 tftp 를 사용하거나 지금 말할 nfs(network file system) 을 사
용한다 .
• HP 에서 nfs demon 이 깔려 있는지 “ rpm –qa | grep nfs” 또는 “ find –name nfs” 를 쳐서 확인한다 .
• 서버에는 NFS demon 이 설치되어 있어야 하는데 /etc/rc.d/inetd.d/nfs 실행 파일이 있음을 find 명령
어를 사용하여 확인해 볼 수 있다 .
(2)
:wq
mount
파일명은 틀리지만 같은
file1 inode 를 사용하기 때문에 같
link 은 파일이다 . 그러나 하나의
파일을 수정하면 다른 파일도
inode 같이 변하게 된다 .
file2
fd 0 stdin fd 0
fd 1 stdout fd 1
Process ID 5248 Process ID 5236
fd 2 stderr fd 2
fd 3
File1, inumber 3 fd 3
fd 4
File2, inumber 10 fd 4
File3, inumber 25
터미널 (1)
Minicom version ….
(1) [root@localhost /]# cd work/source ….
[root@localhost source]# ls XM-Bulverde# tftp ramdisk48_332.gz ramdisk
컴퓨터
… ramdisk48_332.gz … …. 16M tftpdone.
[root@localhost source]# gzip –d ramdisk48_332.gz XM-Bulverde# boot
[root@localhost source]# ls ….
Root 폴더
… ramdisk48_332 …
[root@localhost source]# mkdir /mnt/ramdisk [root@EMPOS ~]#cd ..
2GB 미디어 [root@localhost source]# mount –t ext2 –o loop ramdisk48_332 [root@EMPOS /]#ls
/mnt/ramdisk
Applications bin dev usr … work
[root@localhost source]# ls /mnt/ramdisk
[root@EMPOS /]#cd work
bin dev usr …
[root@EMPOS work]# . /led
[root@localhost source]# mkdir /mnt/ramdisk/work
l : left
[root@localhost source]# cp /tftpboot/led /mnt/ramdisk/work/.
r : right
[root@localhost source]# cp /tftpboot/ledioport.ko
/mnt/ramdisk/work/. q ; quit
디렉토리
padding 지우는 영역 256KB
jffs(journalling flash file system)
프로그램 위치 시스템
[root@localhost /]# minicom
터미널 (1)
Minicom version ….
(1) [root@localhost /]# cd work/tools/jffs ….
[root@localhost jffs]# ls XM-Bulverde# tftp usr.jffs usr
컴퓨터
… mkfs.jffs2 … …. 16M tftpdone.
[root@localhost jffs]# cp mkfs.jffs2 /usr/local/bin/. XM-Bulverde# boot
[root@localhost jffs]# vi ~/.bash_profile ….
Root 폴더
… path 등록 Kernel Panic
[root@localhost jffs]# source ~/.bash_profile
• /etc/fstab, mtab 설정 파일
MCS- 96
Macro Assembler
C Compiler
IC96.EXE
Librarian
LIB.EXE
• 명령어와 shell script, 설정 파일의 script
ASM96.EXE
cstexint.obj exint.obj enable.obj
/cstexint.lst /exint.lst in c96.lib
API
object
lib.obj prog1.obj prog2.obj prog3.obj
file
Relocater/Linker(link.exe)
link prog1.obj, prog2.obj, prog3.obj
executable
prog1.exe
file
• arm-linux-ar(archive manager)
Application program
• main.c 에서 사용하는 것은 ref1.h 에 정의된 함수이고 ref1.c 에 구현된 함수는 ref2.h 를 포함시켜
ref2.c 에서 구현한 함수를 사용한다 . 이 경우에 main.c 에서는 ref2.h 를 포함시켜야 할까 ?
//tst1-main.c
#include <stdio.h>
main.c #include "tst1_ref1.h"
//tst1-ref1.c //tst1-ref2.c
#include "tst1_ref1.h" #include "tst1_ref2.h"
#include "tst1_ref2.h"
int sqr(int x){
int cal(int x, int y){ return x*x;
int z; }
z=sqr(x)+sqr(y);
return z; //tst1-ref2.h
}
int sqr(int x);
//tst1-ref1.h
int cal(int x, int y);
make and makefile
• make 의 필요성
make 유틸리티의 목적은 프로그램 그룹 중에서 어느 부분이 새롭게 컴파일되어야 하는지를 자동적으
로 판단해서 필요한 커맨드 (gcc 따위 ) 를 이용해서 그들을 재컴파일 한다 . 우선은 make 의 사용을
프로그램 개발과 유지 쪽으로 국한시키기로 한다 . 보통 라인 수가 많아지면 여러 개의 파일로 나누어
( 모듈로 나누어 ) 개발을 하게 된다 . 이들은 알게 모르게 서로 관계를 가지고 있는데 , 어느 하나를
필요에 의해 바꾸게 되었을 때 그 파일에 있는 함수를 이용하는 다른 파일도 새롭게 컴파일되어야 한
다 . 하지만 파일 수가 많은 경우 이를 일일이 컴파일을 하게 될 때 , 그 불편함과 함께 컴파일하지 않
아도 될 것도 컴파일을 하게 될 수도 있고 , 컴파일해야 할 것도 미처 못하게 되는 경우가 있다 ( 링크
에러의 원인이 되기도 하는데 에러의 원인을 제대로 찾기가 힘이 든다 ).
--------------------------------------------------------------------------------
% gcc -c main.c
% gcc -c read.c
% gcc -c write.c
% gcc -o test main.o read.o write.o
Makefile 예제 1
--------------------------------------------------------------------------------
가 령 main.c 를 고쳤다고 생각한다면 main.o 가 컴파일되어 다시 생기고 , test 도 다시 링크되어 갱신된다 . 만약 io.h 가
바뀌었다고 가정하면 모든 파일들이 컴파일되어서 목적 파일이 생기고 , 그것들이 링크가 되어 test 가 생긴다 .
[root@localhost work]# vi tst1-main.c • “make label” 은 그 디렉토리에 있는 Makefile 내부의
[root@localhost work]# vi tst1-ref1.c
label 부분을 실행한다 . 가령 “ make clean” 을 실행
[root@localhost work]# vi tst1-ref2.c
[root@localhost work]# vi tst1-ref1.h 하면 Makefile 내부의 clean 부분을 실행해서 컴파일
[root@localhost work]# vi tst1-ref2.h
된 파일을 지운다 .
[root@localhost work]# gcc –c tst1-main.c
[root@localhost work]# gcc –c tst1-ref1.c
[root@localhost work]# gcc –c tst1-ref2.c • “make –option” 의 option 에는 디렉토리를 바꿔 거기
[root@localhost work]# gcc –o tst1 tst1-main.o tst1-ref2.o tst1-ref2.o 에 있는 Makefile 을 참조할 경우 “ -C” 를 사용한다 .
[root@localhost work]# ./tst1
기타 ‘ -t’ option
1st operand 1 2nd operand 2 result 5
[root@localhost work]#
• Macro : CC, CFLAG 등의 이름에 마크로 기능사용
Makefile tst1 tst1-main.c tst1-ref1.c tst1-ref2.c tst1-ref1.h tst1-ref2.h rm tst1-main.o tst1-ref1.o tst-ref2.o
[root@localhost work]#
:wq
Bootloader porting to Target Board
•
…..
[root@localhost linux-2.6.12]# find –name zImage make empos_xm_defconfig 를 사용하여 XM 장비에 맞는
. /arch/arm/boot/zImage 요소들을 선택한다 .
[root@localhost linux-2.6.12]# make clean
• drivers/ directory : 모든 디바이스 드라이버들의 소스 코드가 drivers/ 디렉토리에 존재한다 . 리눅스 2.4 에 의해 지원되는 장치의
다양함 때문에 , 여기에 많은 소스 코드가 있다 . 실제로 모든 커널 소스의 50 퍼센트 이상이 drivers/ 디렉토리안에 존재한다 .
• fs/ drirectory : 모든 지원되는 파일 시스템을 위한 장소이다 . IBM 의 JFS 나 Hans Reiser's reiserfs 같은 새로운 파일 시스템이
필요하면 그 파일 시스템에 소스 코드를 포함하는 이 디렉토리에 패치해야 한다 .
• include/ directory : 새로운 커널이 실제로 컴파일되기 전에 설정되어져야 하며 , 이 설정에서 어느 드라이버 , 특징들 , 모듈들이 커
널안으로 컴파일될 것인지를 make 유틸리티에게 알려주는 것을 의미한다 . 기본적으로 , 대부분의 표준 배포판은 단일 프로세서 커널
로 나온다 . 커널의 표준 SMP(Symetric Multiple Processor) 특징을 구현하기 위해서는 , SMP 를 포함한 설정이 요구된다 .
• ipc/ directory ; 프로세스간 통신을 다루는 데 필요한 모든 코드가 ipc/ 안에 있다 . 모든 중요한 세마포어 (Semaphore) 핸들링 C
코드가 여기에 있다 (sem.c).
• init/ directory : fork() 를 구현하는 코드 , 자주 실행되는 코드인 cpu_idle() loop 같은 매우 중요한 코드를 포함하는 Main.c 는
init/ 디렉토리 안에 존재한다 . 시스템 부팅 과정에서 읽는 bogomips 를 계산하는 코드는 스피드의 표시를 위해 그것을 참조하는
사람들을 위해 여기에 있다 . BogoMips reading 은 가끔 컴퓨터의 성능을 표시하는 기준이 된다 . 그러나 프로세서가 시스템 성능을
모두 표시하는 것은 아니며 noop(no operation) 을 수행하는데 걸리는 시간을 측정하는 것이다 .
• lib/ directory : lib/ 디렉토리는 종종 커널의 다른 부분에 의해 필요로 하는 코드를 가지고 있다 . 이를테면 , inflate.c 가 여기에
속한다 . 이 코드는 시스템이 부팅할 때 커널을 압축 해제하고 그것을 메모리에 로드한다 . 그것은 또한 표준 PKZIP 8-bit 압축 알
고리즘을 압축 해제하는 프로그램을 갖고 있다 .
• kernel/ directory : 대부분 보통 커널 함수라 불리는 일부가 kernel/ 디렉토리에 존재한다 . 스케줄러 , fork(), 그리고 timer.c
를 여기에 속한다 . 또한 printk.c 를 이 디렉토리에서 발견할 수 있으며 커널 소스 코드 전체에 걸쳐서 printk() 는 printf()
대신에 사용된다 . printf() 함수는 커널 안으로부터 호출될 때 SMP-capable 하지 않다 .
• mm/ directory : mm/ 디렉토리는 리눅스 커널에서 가상 메모리 매니저를 구현하는 소스 코드를 포함한다 .
• net/ directory : 네트워킹 지원을 위한 모든 소스 코드는 net/ 디렉토리 안에 있다 . TCP/IP, Netware, 그리고 Appletalk 가 모
두 여기에 있다 .
LINUX porting to Target Board
이를 위해 먼저 usb 메모리에 있는
led.c 를 HP 의 work 디렉토리 밑에 복
사해 넣고 이것을 컴파일해서 최종 실행
파일을 TB 의 work 디렉토리로 tftp,
nfs, 또는 z-modem 을 사용해 전송한
다 . 전송한 후 TB 의 work 디렉토리에
있는 led 실행파일을 “ ./led” 로 해서 실
행시켜 본다 . 이때 TB 의 LED 가 제대
로 점멸되는지를 확인해 본다 .
/*led.c HP 와 TB 가 시리얼 포트로 연결되어 minicom 을 통해
TB 의 리눅스에서 “ ./led” 를 실행하면 ‘ l’, ‘r’, ‘q’ 키 값에 대해 왼
쪽 , 오른쪽으로 led 를 쉬프트 , 끝내기를 할 수 있다 . int kbhit(){
char ch;
#include <stdio.h> int nread;
#include <stdlib.h>
#include <unistd.h> • 이 응용 프로그램에서 key board 관련 통신에 대한 함
if(peek_character != -1) return 1;
수 및 읽기 함수를 구현했는데 거기서 사용한 tcgetattr(
#include <sys/types.h>
#include <sys/mman.h> ), tcsetattr( ), read( ), open( ), close( ), mmap( ),
new_settings.c_cc[VMIN] = 0;
#include <sys/stat.h> munmap( ), usleep( ) 함수들 각각은 어떤 헤더 파일에 tcsetattr(0,TCSANOW,&new_settings);
#include <fcntl.h> 서 정의되나 ? 그 헤더파일들은 어느 디렉토리에 존재 nread = read(0,&ch,1);
#include <sys/ioctl.h> 하는가 ? Arm compiler 의 library 인 new_settings.c_cc[VMIN] = 1;
#include <termios.h> /usr/local/arm/3.3.2/include 밑에 있나 . tcsetattr(0,TCSANOW,&new_settings);
void led_exit(void) {
if(unregister_chrdev(ledioport_major,LEDIOPORT_NAME))
printk(KERN_WARNING"%s DRIVER CLEANUP FALLED\n",LEDIOPORT_NAME);
else printk("driver: %s DRIVER EXIT\n", LEDIOPORT_NAME); ledioport_major 에 저장된 주번호로부터 문자 디바이스 등록을 해
} 제하고 성공 여부에 대한 메시지를 출력한다 .
LED driver
//test.c 는 TB 의 리눅스 터미널에서 “ ./test 0x23” 과 같이 치면 led
에 출력하는 응용 프로그램이다 .
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
if(argc <= 1) {
printf("please input the parameter! ex)./test 0xa1\n");
return -1;
}
드라이버의 int ledioport_open(struct inode *minode, struct file *mfile) {}
이 open( ) 함수에 대응됨 . “/dev/ledioport” 는 insmod 및 mknod 명령
dev = open("/dev/ledioport", O_WRONLY);
어에 의해 등록된 led 의 파일 형태이다 .
if (dev != -1)
{
if(argv[1][0] == '0' && (argv[1][1] == 'x' || argv[1][1] == 'X'))
buff = (unsigned char)strtol(&argv[1][2],NULL,16);
else
buff = atoi(argv[1]); 드라이버의 ssize_t ledioport_write_byte(struct file *inode, const char *gdata, size_t length, loff_t
write(dev,&buff,1); *off_what) { } 이 write( ) 함수에 대응되고
close(dev); write( ) 의 첫 번째 인수인 dev 와 *inode 는 일치하지 않는데 ?
}
else 드라이버의 int ledioport_release(struct inode *minode, struct file *mfile) { } 이
{ close( ) 함수에 대응되고
printf( "Device Open ERROR!\n"); close( ) 의 첫 번째 인수인 dev 와 *inode 는 일치하지 않는데 ?
exit(-1);
}
return(0);
}
LED driver
Makefile, ledioport.c ledioport.mod.o ledioport.ko ledioport.o test.c [root@EMPOS /]# insmod ledioport.ko
Root 폴더
test.o init module, ledioport major number : 252
[root@localhost led_driver]# cp ledioport.ko test tftpboot/. [root@EMPOS /]# mknod /dev/ledioport c 252 0
[root@localhost led_driver]# service xinetd restart /dev/ledioport
2GB 미디어
… [root@EMPOS /]# . /test
[root@localhost led_driver]# [root@EMPOS /]# rmmod ledioport
KDIR := /work/linux-2.6.12-xm_bulverde
CC = arm-linux-gcc
PWD := $(shell pwd) warning Optimizatiom level 2 KDIR = /work/linux-2.6.12-xm_bulverde
C compiler optins CFLAGS = -D__KERNEL__ -DMODULE -Wall -O2 -I$(KDIR)
DRIVER_SRCS = ledioport.c
CFLAGS = -D__KERNEL__ -DMODULE -Wall -O2 -I$(KDIR)
DRIVER_OBJS = ledioport.o
TEST_TARGET = test
TEST_TARGET = test
TEST_OBJS = test.o
TEST_OBJS = test.o TB 에 깔려 있는 리눅스 OS 의
TEST_SRCS = test.c
TEST_SRCS = test.c 라이브러리를 – I option 을 써서
include 시킴
ledioport.o: ledioport.c
CC -c CFLAGS ledioport.c
default:$(TEST_TARGET)
test: test.o
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
CC -o test.o
$(CC) $(KDIR) -c $(TEST_SRCS)
test.o: test.c
$(CC) $(TEST_OBJS) -o $@
디렉토리 이동해서 CC -c test.c
거기서 make
clean:
rm -f *.ko
rm -f *.o
rm -f *.mod.*
rm -f .*.cmd
rm -f $(TEST_TARGET)
rm -f default
LED driver
• 앞서의 「 (2) asm 이 아니라 asm.arm 」 이라는 구절에서 컴파일 한 후에 ledioport.c 에서 참조하
는 arm 디렉토리가 생성되어 제대로 참조할 수 있음을 확인할 수 있다 .
Web server
• 소켓 프로그래밍
../asp.o: ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h ../security.o: ../security.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h
../base64.o: ../base64.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h ../sockGen.o: ../sockGen.c ../uemf.h
../default.o: ../default.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h ../uemf.o: ../uemf.c ../uemf.h
../ejlex.o: ../ejlex.c ../ej.h ../ejIntrn.h ../uemf.h ../um.o: ../webs.h ../wsIntrn.h ../um.h ../uemf.h
../ejparse.o: ../ejparse.c ../ej.h ../ejIntrn.h ../uemf.h ../umui.o: ../webs.h ../wsIntrn.h ../um.h ../uemf.h
../emfdb.o: ../emfdb.h ../wsIntrn.h ../uemf.h ../url.o: ../url.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h
../form.o: ../form.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h ../value.o: ../value.c ../uemf.h
../handler.o: ../handler.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h ../webs.o: ../webs.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h
../mime.o: ../mime.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h ../websuemf.o: ../websuemf.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h
../misc.o: ../misc.c ../uemf.h ../websSSL.o: ../websSSL.c ../websSSL.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h
../page.o: ../page.c ../webs.h ../wsIntrn.h ../ej.h ../ejIntrn.h ../uemf.h main.o: main.c ../wsIntrn.h ../webs.h ../ej.h ../ejIntrn.h ../uemf.h
.c.o:
$(CC) -c -o $@ $(DEBUG) $(CFLAGS) $(IFLAGS) $<
Web server – server program
#include "../uemf.h"
#include "../wsIntrn.h"
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#ifdef WEBS_SSL_SUPPORT
#include "../websSSL.h"
#endif
#ifdef USER_MANAGEMENT_SUPPORT
#include "../um.h"
void formDefineUserMgmt(void);
#endif
로컬영역연결 2
인터넷 연결공유
Window XP shared folders in local network
• 교내 망에서 각 컴퓨터는 컴퓨터 이름 , 사용자 계정 , 그룹 및 그에 대한 권한이 설정되어 있다 . 각
로컬넷은 그림과 같이 C class 에서 위 세 자리가 하나의 로컬넷으로 구성되고 각 로컬넷은 라우터에
연결되어 인터넷 ISP 에 접속된다 . 로컬넷에 소속된 컴퓨터들은 “작업 그룹”을 조성해 가입할 수 있
다.
203.250.133.1
인터넷
gateway
203.250.133. 220 고정 IP
203.250.133. 222 고정
IP
Gateway
switch(router) 203.250.143.1 gateway
LOCAL
NETWORK
C CLASS 255
COMPUTERS PER
LOCAL NET
203.250.143.231 고정 IP
client client client
203.250.143.233 고정
IP
인터넷
작업그룹 CTL
Gateway wins
switch(router)
로컬넷 마다 거기에 소속
LOCAL
된 작업그룹들과 컴퓨터 NETWORK
• 모든 사람들에게 공유를 허용하려면 (1) Guest 계정을 허용하고 (2) wins 를 설정 (3) 폴더옵
션에서 “모든 사용자에게 동일한 폴더 공유 권한을 지정”에 언체크 하고 (4) 공유할 폴더의 사용
권한을 “ everyone” 사용자 그룹으로 설정