[SWI의 진실]

Embedded Lab/ARM 2013. 3. 22. 19:53

Exception Handler를 다루다 보니, 궁금한 게 생겼어요. Hardware없이 interrupt를 거는 방법이 있을까요? SoftWare Interrupt라는 거 앞에서부터 언급되었었는데, Interrupt는 Asynchronous하게 암때나 걸리는 게 Interrupt일진데, Software로 어떻게 암때나 interrupt를 건다는 얘길까요. 실은 Software Interrupt라는 건 Interrupt가 아니에요. 실은 Software적으로 Exception을 걸 수 있는 걸 말하는 거죠. Software적으로 Exception을 걸게 되면 보통 User mode에 있던 System이 Supervisor mode로 전환이 되고요, Software Interrupt를 거는 순간부터는 Privileged Mode로 전환되는 거니까, System을 마음대로 주무를 수 있는 권한이 생기는 거죠. 
 
왜 이런 SWI를 굳이 사용하는 걸까요? compatibility때문에 사용하게 되는 경우가 많습니다. 보통은 kernel service를 이용할 때 많이 사용되는데요, 이렇게 하면 좋은 점이 말이죠, 일단은 Privileged mode로 들어갈 수 있게 되고, Kernel service로 들어서는 입구가 하나로 한정이 되므로 Kernel 입장에서는 SWI 부분만 수정을 잘하면 되는 장점이 있지요. 이런걸 유식한 말로 compatibility라고 합니다. 냐하하. 
 
SWI가 이용되는 대표적인 예는 아래의 두 가지에요. 
1. System Call (Kernel)
2. Semi hosting
 
System Call이 보통 Kernel등에서 많이 사용되는 개념인데, Kernel은 SVC mode에서 동작하고, 일반 application은 User Mode에서 동작하기 때문에, User Mode의 일반 application이 Kernel에게 service를 요청할 때 사용하지요. SWI를 걸어서 Kernel Mode로 System mode를 바꾸는 거죠 뭐. 
 
그리고, Semi hosting이라는 건 Target에서 I/O에 관련된 것들을 경로를 바꾸어 Target에서 실행되어야 하는 I/O를 Debugger를 실행하고 있는 Host system에서 대신 수행하게 하는 것인데, 예를 들면 UART로 Message를 뿌리던 target의 routine을 Semi hosting routine으로 갈아치우면, UART가 아닌 Debugger로 target의 Reporting을 직접 받을 수 있는 장점이 있어요. 이런 Semi hosting에 관련된 자세한 내용은 How to Debug section에서 다시 자세히 기술할 예정이오니, 여기서는 concept만 잘 가져가시도록 하시죠. 
 
그러면, SWI는 어떻게 구현되고, 어떻게 Handler를 구현하게 되는 걸까 하는 문제에 focusing을 해보는 게 어떨까 생각 중입니다. 
 
Software Interrupt를 걸려면 어떻게 해야 할까요? 간단하죠. 
SWI {condition}
이렇게 assembly를 삽입해 주면 SWI 명령어를 만나는 순간 Exception은 발생하고, SWI Exception Vector (0x0008)번지로 branch하게 됩니다. 이렇게 SWI 명령어 자체로 Exception을 걸어 User mode에서 강제로 SVC mode로 갈 수 있다니 이 얼마나 시적인 일입니꺄.
 
SWI {condition} 이라고 했는데, 그러면 SWI에 대해서 여러 가지 종류의 SWI를 걸 수 있다는 말인데요, 즉 슨 SWI 뒤에 숫자를 적어 넣고, 막상 Handler에서 뒤에 parameter로 준 condition을 switch 걸어서 여러 가지 case를 처리할 수 있다는 말이기도 하지요. 
 
그런데, ARM에서는 Exception이 발생하고 나면, Exception Vector로 jump해서 곧바로 Handler로 branch한다고 보았었는데, 어떻게 parameter를 준다는 말입니까. 이거야 말로 귀신이 곡할 노릇노릇 노른자이네요. 이것이야 말로 System Software를 하는 사람들의 실력이 빛을 발하는 순간이에요. 
 
모든 것은 원하는 것이 있으면 통하는 법이죠. 그것의 비밀은 SWI 명령자체가 비밀입니다. SWI 명령어의 32bit binary 형태를 한번 볼까요?
 
 
 
32bit 명령어 중 MSB 4bit는 조건을 나타내는 명령어, 즉 EQ, NEQ 등의 뭐 그거 있었잖아요. condition flag를 보고서 어떻게 할거냐는 조건 명령 그게 4bit 들어가고요. 바로 다음에 따라오는 4bit에 연달아 1111이 있으며 SWI 명령입니다. 그러면, 뒤에 24bit가 남게 되죠. 이 24bit에 해당하는 곳에 parameter가 들어갈 수 있게 되는 거죠. 실은 버려지게 되는 내용이지만, 재활용 수준에서 이걸 가져다가 여러 가지 종류의 SWI를 거는 것처럼 만들 수 있어요. 순수하게 System Software Engineer가 구현해야 하는 몫이에요. 뒤에 붙어 있는 LSB 24bit와는 아무 상관없이 일단 1111 (SWI)가 있으면 Processor는 Exception을 발생시킵니다. 그러면, 뒤에 붙어 있던 LSB 24 bit를 어떻게 parameter로 재활용할 수 있을 까요. 자자, 생각해 봅시다. 힌트는 Software Interrupt가 걸리게 되면, R14_SVC에 돌아갈 주소가 저장된다는 사실이에요. 
 
으흐흐, 그렇죠. 돌아갈 주소를 안다는 것은 돌아갈 주소에서 한 칸만 이전을 가져올 수만 있다면 SWI가 걸린 위치를 가져올 수 있다는 말이지요. 그러면 SWI가 걸린 위치를 가져와서 LSB 24bit만 Masking해내면 요리 끝이에요. 뭐 다 이런 식인 거에요. 
 
LDR r0, [r14, #-4]
BIC r0, r0, #0xFF000000 
 
요렇게 하면 r14가 가리키는 곳에서 4를 뺀 곳의 값 자체를 읽어와서 하위 24 bit를 r0에 긁어 올 수 있겠어요. 짜란! 자자, 그러면 실제로 어떻게 Software를 짜는지 알아야 하지 않겠어요?
 
두 가지 예를 들어볼 게요.하나는 위에서 본 것과 같은 SWI 호출과 Handler의 구현입니다. 나머지 한가지는 C Level의 SWI 의 직접 호출 구현이지요. 궁금 안 하실지도 모르겠으나, 조금 살펴 보져 머. 
 
첫 번째, 일반적인 SWI 호출하는 방법을 한번 해보시지요. 
 일단 c file에서 SWI를 호출해야겠죠. SWI_OOOPS()라는 함수에서 SWI 호출해 보겠습니다.
 
 
SWI_OOOPS()
{
    .............
    SWI_Exception();
    .............
}
 
그러면, SWI Assembly 명령어를 사용하기 위하여, Assembly file 하나에서 SWI_Exception 함수를 구현해 볼까요. 아래처럼 직접 SWI에 parameter 0x121212를 줘봅시다. 
 
SWI_Exception
  SWI  0x121212
이렇게 하면   SWI  0x121212 를 만나는 순간 곧바로 Software Interrupt가 걸리게 되고 Exception Vector로 branch하게 됩니다. 
 
0x8번지에 이렇게 씌여져 있겠죠. 
b SWI_Handler
 
그러면, 이제 간단하게 C Level의 SWI Handler를 부르기 위한 Handler를 만들어 주면 됩니다. 물론 여기에서 LSB 24 bit도 건져 내야죠.
 
 
SWI_Handler
   STMFD sp!, {lr}                  ; 돌아갈 주소 저장
   LDR  r0,  [lr, #-4]                  ; SWI 주소의 값을 가져옴. 
   BIC  r0,  r0,  #0xFF000000      ; LSB 24bit 건져냄. 
   BL  SWI_C_Handler                 ; r0에 넣었으니까, AAPCS에 의하여 첫번째 argument로
   LDMFD sp!, {lr}                     ; 다 처리하고 왔으면 돌아가야지~

 

뭐 이런 Story죠.

그럼 이때! SWI_C_Handler에 잘 도달 할 수 있도록 수로를 잘 터왔으니까, SWI_C_Handler만 잘 구현하면 됩니다. 잘 보세요.

 

 

void SWI_C_Handler (int OPTion)

 
 switch(option)
 {
  case 0x123432: 
           UART_MESSAGE ("SWI 0x123432");
      break ;
  case 0x121212 :
           LCD_MESSAGE ("SWI 0x121212");
      break ;
  case 0x654321:
           USB_MESSAGE ("SWI 0x654321");
      break ;
 }
 
}
 
r0에 LSB 24 bit를 넣었으니까, 그 값은 int option으로 넘어오게 되고, 그 option에 대해서 switch를 걸었으니까 결국 LCD_MESSAGE 를 찍겠네요. 음.. 어렵지 않군요. 
 
자, 여기서 그럼 다른 종류의 LSB 24bit를 걸기 위해서 SWI_Exception() 함수를 Assembly로 따로따로 구현해야 하느냐! 조금 더 편한 방법이 있어요. 
 
함수를 SWI와 번호로 선언할 수 있어요.

 
 __swi(0x123432) void UART_OUT (void)라고 선언하고서,
 
SWI_OOOPS()
{
    .............
    SWI_Exception();
    UART_OUT();
    .............
}
 
이렇게 부르면 차례로 LCD MESSAGE와 UART MESSAGE가 실행되게 됩니다. 어떻게 해서 이런 일이 가능한 것이냐 하면, UART_OUT() 함수 자체가 SWI 0x123432으로 compile 된답니다.
결국 SWI_OOOPS()함수는
 
 
SWI_OOOPS
   ........
   SWI 0x121212
   SWI 0x123432
   .........
 
이런 식으로 컴파일 되겠죠 뭐.

출처 : http://recipes.egloos.com/5037342

'Embedded Lab > ARM' 카테고리의 다른 글

[STM32 : SPI, using chip select2]  (0) 2014.03.05
[STM32 : SPI, using chip select]  (0) 2014.03.05
[논리 스프트와 산술 시프트의 차이]  (0) 2013.03.20
Posted by cyj4369
,

논리 시프트와 산술 시프트의 차이

논리 시프트 역시 비트를 이동하는 연산이나, 산술 시프트와의 제일 큰 차이는 부호비트(sign bit)가 보존되지 않는다는 것이다. 따라서 부호가 정의된 16비트 정수(signed integer)에서 연산의 결과값이100 0000(2)=32768(10) 이상의 범위를 넘어갈 경우 부호가 바뀌는 경우가 발생한다.    

'Embedded Lab > ARM' 카테고리의 다른 글

[STM32 : SPI, using chip select2]  (0) 2014.03.05
[STM32 : SPI, using chip select]  (0) 2014.03.05
[SWI의 진실]  (0) 2013.03.22
Posted by cyj4369
,

MASM(Microsoft Macro Assembler), NASM(Netwide Assembler), FASM(Flat Assembler), GAS(GNU Assembler), YASM 등 정말 다양한 종류가 있습니다. 그럼 여기서 잠시 질문하나 드리겠습니다. 어셈블리(Assembly)는 무엇이고 어셈블러(Assembler)는 무엇일까요? 그렇습니다. 어셈블리는 언어를 말하는 것이고, 어셈블러는 compiler 를 의미하는 것입니다. 물론 어셈에서는 C언어처럼 컴파일 이라는 용어대신 Assemble 한다고 표현하며, 이 동작을 해 주는 녀석을 Assembler 라고 말합니다.

 자, 그럼 위에서 나열한 것은 Assembler 의 종류입니다. 그런데 왜 각각에 대해서 문법이 다를까요?
Assembler 마다 지원하는 platform 이 다르고, syntax 형태도 차이가 있습니다. 당연히 platform 에 따라 종류를 나누면 상당히 많은 어셈블리가 존재하지요. 인텔(Intel)의 IA-32 Assembly 도 있고, IA-64 Assembly 도 있습니다. 그 이외에 상당히 많은 종류의 어셈블리(Assembly)가 존재하지요. syntax 에는 Intel 방식과 AT&T 방식이 있습니다. 자세한 내용은 아래에서 계속 설명 드리도록 하겠습니다.


GAS(GNU Assembler)

GAS 는 약자 속에 나와 있듯이 GNU Project 에서 사용되고 만들어진 어셈블러입니다. 당연히 GCC 안에 기본적으로 사용되는 녀석이기도 하지요. Linux 에서 인라인 어셈을 해 보신 분은 GAS가 어떤 syntax 를 사용하는지 아실겁니다. 바로 AT&T 입니다. 제가 싫어하는 문법이기도 하지요 =_=; 간단히 예를 들면 MOV EAX, 80 을 MOV $80, %EAX 로 표현합니다. 전자는 AT&T 이외에 다른 syntax 인 Intel syntax 입니다. 여튼 GAS는 Free Software 이고, Cross Platform 을 지원합니다.


MASM(Microsoft Macro Assembler)

가 장 많이 들어보셨을 어셈블러(Assemler)라고 생각합니다. Microsoft 에서 만들었으며, 많은 사랑을 받아온 어셈블러입니다. 64-bit 도 지원하며, syntax 는 Intel 방식을 따릅니다. 개인적으로 저는 이 syntax 가 가독성이 좋습니다. MASM 는 초기에 유료로 제공되었으며 사용하기 위해서는 별도로 설치를 해 주어야 합니다. 하지만 이제는 뮤로로 제공되며 고맙게도 Visual Studio 2008 이상 버젼부터는 기본적으로 MASM v9.0이 기본적으로 포함되어 있기 때문에 별도 설치를 해 줄 필요가 없습니다. 더불어 MASM 은 이름에서도 알 수 있듯이, 강력한 Macro 를 지원해줌으로써 프로그래머가 좀 더 편리하게 개발 할 수 있도록 지원해 줍니다. 편리하긴 하지만 때론 Assemly 의 참 모습을 잃어가는 것 같아 조금 아쉽기도 하네요. 참, 아시다시피 cross-platform 은 지원되지 않습니다 ^-^;

참고 사이트
http://www.masm32.com
http://www.movsd.com


NASM(Netwide Assembler)

80x86 platform 용으로 개발된 어셈블러입니다. 그리고 open-source 로 시작되었지요. 왜 그랬을까요? 네, 바로 Microsoft 때문입니다 -_-; 당시 Microsoft 의 MASM은 상용으로서 돈을 지불하고 사야만 했기 때문이죠. 그렇기에 MASM과 비슷한 점이 많고, 사람들의 비교 대상도 되곤 합니다. NASM의 장점은 현재는 Cross-Platform 을 지원한다는 것과 Macro(단, x86 platform에서) 를 제공한다는 것입니다. 그렇기에 일반적으로 Kernel 과 같이 O/S를 개발할 경우에 많이 사용되는 Assembler 입니다.

참고 사이트
http://www.nasm.us



이외의 Aseembler

이밖에 어셈블러(Assembler)는 다음 주소를 참고하시기 바랍니다.
JWASM : http://www.japheth.de/JWasm.html
FASM : http://flatassembler.net/
YASM : http://www.tortall.net/projects/yasm/




출처 http://rootfriend.tistory.com/entry/어셈블러Assembler의-종류

Posted by cyj4369
,

#apt-get install curlftpfs

#vim /etc/fstab

다음을 추가

curlftpfs#ID:PW@URL /media/nas fuse rw,uid=1000,gid=1000,umask=0755 0 0

'Embedded Lab > linux, x86' 카테고리의 다른 글

[에뮬레이터와 시뮬레이터의 차이]  (0) 2013.03.24
[어셈블리와 어셈블러]  (0) 2013.03.17
[crystaldiskmark]  (0) 2013.03.05
[파일시스템과 리눅스 디렉토리구조]  (0) 2013.02.20
[쉘 스크립트 wc]  (0) 2013.01.31
Posted by cyj4369
,

CrystalDiskMark는 SSD, HDD, USB등의 읽고 쓰기 성능을 시험할 수 있게 해주는 프로그램이다.
다운 받은 파일의 압축을 풀고 실행하면 되는 간단한 구조로 되어 있다.

1 ~ 9 - 테스팅하는 횟수
50MB ~ 4000MB - Test 크기
C:, D:, F: - Test할 드라이버
Seq - Sequential Read/Write Test :순차적 읽기, 쓰기 속도
512K - 무작위 쓰기, 읽기 속도(512KB)
4K - 무작위 쓰기 ,읽기 속도(4KB)
4K QD32 - 4K단위로 무작위 읽기, 쓰기 속도 실험하지만, QD가 32이어서 NCQ, AHCI를 위해 만든 옵션입니다.
(QD32란? 데이터를 병렬로 동시에 읽고 쓰는걸 테스트 하는 것 이다. (대기열 32라는 뜻이다.))

NCQ - HDD의 작업 효율을 높이는 기술이다. (HDD를 한번에 여러개의 명령을 보내고 수행)
            하드디스크에 지시한 명령을 접수한 순서대로 처리하지 않고 빠르게 처리할 수 있는 명령부터 다시 배열해 작업 속도를 단축시킨다.
AHCI - AHCI는 스토리지 드라이버에서 NCQ 및 핫 플러그와 같은 고급 직렬 ATA 기능을 사용할 수 있는 인터페이스 사양.
             AHCI는 소프트웨어가, SATA 장치들과 신호를 주고 받을 수 있도록 만든 하드웨어 구조를 뜻한다. (SATA HDD 파일 전송시 좀더 빠른 속도를 내기 위한 기술이다.)

'Embedded Lab > linux, x86' 카테고리의 다른 글

[어셈블리와 어셈블러]  (0) 2013.03.17
[리눅스에서 FTP자동 Mount]  (0) 2013.03.13
[파일시스템과 리눅스 디렉토리구조]  (0) 2013.02.20
[쉘 스크립트 wc]  (0) 2013.01.31
[쉘 스크립트에서 숫자연산]  (0) 2013.01.31
Posted by cyj4369
,

1. 파일 시스템의 종류

 

리눅스는 다양한 파일 시스템을 지원한다. ext2, ext3, minix, xiats, umsdos, hpfs OS/2, isofs, CD-ROM, msdos, nfs, sysv 등이 있다. 이 파일 시스템들은 각각 다음과 같은 특징을 가지고 있다.

 

◎ minix

과거 미닉스에서 사용되어졌던 파일 시스템으로 리눅스 파일 시스템 대부분의 기능을 제공하는 파일 시스템이다.

 

◎ xiafs

미닉스의 제한이 이었던 파일 이름과 파일 시스템에 대한 제한을 보안한 미닉스 파일 시스템의 수정 버전이다. 이 파일 시스템에는 추가된 새로운 기능은 없다. 한때 ext2와 함께 사용되었던 파일 시스템이었으나 현재는 많이 사용되지 않는다.

 

◎ msdos

도스의 FAT파일 시스템과 호환을 지원하는 파일 시스템이다. 또한 msdos와 OS/2와 윈도NT FAT파일 시스템과도 호환된다

 

◎ hpfs OS/2

OS/2의 파일 시스템이다. 하지만 현재는 읽기 전용인 파일 시스템으로 파일 시스템에 대한 읽기만이 가능하다.

 

◎ isofs CD-ROM

ISO기준을 따르는 표준 CD-ROM의 파일 시스템이다. isofs CD-ROM은 CD-ROM에 좀더 긴 파일명을 사용할 수 있도록 확장된 록 브릿지가 기본으로 지원된다.

 

◎ umsdos

MS-DOS 파일 시스템을 리눅스 상에서도 긴 파일명과 소유자, 접근 허가, 링크와 장치 파일 등을 사용할 수 있도록 확장한 파일 시스템이다. umsdos는 일반적으로 DOS 파일 시스쳄이 마치 리눅스 파일 시스템인 것처럼 보이도록 하는 기능을 제공하므로 따로 리눅스를 위한 파티션은 필요하지 않는다.

 

◎ nfs

네트워크 파일 시스템이다. 네트워크 상의 많은 컴퓨터들이 각각의 시스템에 가진 파일들을 서로 쉽게 공유하기 위해 제공되는 상호간의 파일 시스템 공유 파일시스템이다.

 

◎ sysv

System V/386, Xenix 그리고 Coherent 파일 시스템이다.

 

◎ ext

리눅스 초기에 사용되던 파일 시스템으로 호환성이 없던 ext2의 구 버전이다. 지금은 대부분 하지 않는다.

 

◎ ext2

리눅스는 미닉스 파일시스템을 처음으로 사용했다. 그러나 여러가지 제약 조건과 성능이 뛰어나지 못하였다. 이를 보안 하기 위해 EXT(Extened File System)이 제시 되었다. 이 파일 시스템은 리눅스 전용으로 설계되어 1992년 4월에 소개 되었다. 또한 1993년에는 2차 확장 파일 시스템인 EXT2가 ext의 여러가지 문제점을 보안하여 나왔다.

 

2. 디렉토리 구조

 

리눅스의 기본 디렉토리 구조는 트리 구조를 하고 있다. 그리고 디렉토리 구조는 기본구조를 제외하고 사용자의 설정에 따라 달라질 수 있다. 리눅스의 디렉토리 구조는 파일 시스템 표준안 (FSSTND, Linux File System Standard)을 기반으로 하는 것이 바람직하다. 파일 시스템 표준안은 리눅스상에서 어떻게 파일 시스템을 구성할 것인지에 대한 표준안을 제정하기 위해서 만들어진 문서이다. 표준안을 무조건 따르라는 강제력은 없지만 파일의 위치가 일관된게 유지되어 프로그램 작성, 포딩은 물론 시스템 관리도 쉬워지는 이점이 있기에 배포판들은 이 표준안을 지키고 있다.

 

2.1 디렉토리 기능 및 내용

 

대부분의 리눅스는 FHS(Filesystem Hierarchy Standard) 표준 파일 시스템 계층을 사용하고 같은 목적의 파일들은 같은 장소에 일관되게 모아 관리하므로 시스템에 자원이나 프로그램들을 쉽게 찾을 수 있다.

 

◎ /

루트 디렉토리라고 부르는 리눅스 시스템에서 가장 최상위 디렉토리며 디렉토리 구조의 시작이다. 시스템관리자의 홈인 /root와는 다르다. / 디렉토리 아래에 /bin, /etc, /boot, /mnt, /usr, /lib, /home, /dev, /proc, /var, /sbin, /tmp, /root, /lost+found 등의 디렉토리가 존재한다.

 

◎ /bin

binaries의 약어로 이진 파일들이며 리눅스에서 가장 기본이 되는 명령어들이 모여 있는 디렉토리이다. 디렉토리의 파일들을 보면 대부분이 실행 파일임을 알 수 있다. 또한 이곳에는 부팅에 필요한 명령어들이 위치하여 부팅후에 시스템의 계정 사용자들이 사용할 수 있는 일반적인 명령어들도 위치 하고 있다.

 

◎ /etc

이 디렉토리는 리눅스 시스템에 관한 각종 환경 설정에 연관된 파일들과 디렉토리들을 가진 디렉토리이다. 대부분의 이 디렉토리의 파일들은 시스템 관리자에 의해 관리되는 파일들이다. 웹 서버 환경 설정, 시스템 계정 사용자 정보, 패스 워드 관리, 시스템의 파일 시스템 관리 파일, 여러가지 시스템 보안에 관련된 파일들, 시스템 초기화 설정 파일, TCP/IP 설정 파일 등 시스쳄 전반에 걸친 거의 모든 환경 설정 파일들이 모두 이 디렉토리에 있다.

 

◎ /etc/rc.d

시스템의 부팅과 시스템 실행 레벨 변경시에 실행되는 스크립트들이 저장되어 있는 디렉토리이다. 리눅스의 6가지 실행 레벨로 각각의 해당 디렉토리가 있다.

 

◎ /etc/shadow

파일에서 패스워드 부분만을 따로 저장하는 파일이다. 이 파일에 패스워드는 암호화 되어 셰도우 패스워드 형태로 저장되어 있으며 시스템 관리자만이 접근할 수 있기 때문에 크래킹 등에 대한 우려가 상대적으로 적다.

 

◎ /etc/group

시스템의 그룹에 대한 정보를 저장하고 있는 파일이다.

 

◎ /etc/inittab

init를 설정하는 파일이다.

 

◎ /etc/issue, /etc/issue.net

getty에 의해서 로그인을 위한 프롬프트가 뜨기 전에 출력되는 메시지를 설정하는 파일이다. 리눅스 시스템으로 접속할 경우 가장 처음으로 볼 수 있는 메시지이다. 보통 시스템에 대한 설명과 각종 환영 메시지를 전달하기 위해서 사용된다. issue 파일의 내용은 보통 시스템의 터미널에서 볼 수 있다. 그리고 /etc/issue.net 파일의 내용은 리모트상에서 시스템으로 접속할 경우 볼 수 있다.

 

◎ /etc/motd

'Message of the day'의 약자로 시스템으로의 접속에 성공할 경우 쉘이 뜨기 전에 출력되는 메세지를 설정하는 파일이다.

 

◎ /etc/profile, /etc/csh.login, /etc/csh.cshrc

시스템이 시작될 때 사용자가 로그인을 할 때 본쉘이나 C쉘에 의해서 실행되는 스크립트 파일이다. 일반적으로 사용자들에 대한 기본 환경 설정에 사용된다.

 

◎ /etc/securetty

시스템 관리자가 시스템에 로그인할 수 있는 안전한 터미널에 대한 정보가 저장되어 있다. 일반적으로 가상콘솔이 설정되어 있다. 이것은 네트워크를 통해 시스템으로 침입해 시스템 관리자의 권한을 획득하는 크랙킹을 막기 위해서이다.

 

◎ /ete/shell

시스템에서 안정적으로 사용할 수 있는 쉘에 대한 정보를 저장하고 있는 파일이다. 만약 chsh명령을 사용해 사용중인 쉘을 바꾸려면 이 파일에 저장되어 있는 쉘중에 선택해야한다. 또한 ftp데몬의 경우 사용자의 쉘을 검사하여 /etc/shell에 저장되어 있지 않은 쉘을 사용한다면 로그인을 허용하지 않는다.

 

◎ /boot

리눅스 커널이 저장되어 있는 디렉토리로서 각종 리눅스 boot에 필요한 booting지원 파일들이 저장되어 있는 디렉토리이다.

 

◎ /mnt

외부 장치인 플로피 디스크, 시디롬, 삼바등을 마운트하기 위해서 제공되는 디렉토리이다. 임시로 사용되는 디렉토리이므로 프로그램들은 /mnt에 어떤 파일 시스템이 마운트 되었는지 자동으로 인식하지 않는다. 또한 /mnt는 보통 여러 개의 하위 디렉토리로 나누어 사용되고, 평소에는 각 디렉토리들은 비어 있다.

 

◎ /usr

시스템에 사용되는 각종 프로그램들이 설치되는 디렉토리이다. 프로그램과 관련된 명령어 미치 라이브러리들이 이 디렉토리에 위치 하게 된다. 또한 X 시스템관련 파일들과 리눅스 커널 소스, 각종 C언어 과련 해더 파일 등도 이 디렉토리 안에 저장되어 있다.

 

◎ /usr/bin

리눅스 시스템에서 사용되는 각종 프로그램들이 저장되어 있으며 /bin 디텍토리에 없는 다양한 실행 파일들이 저장되어 있는 디렉토리이다.

 

◎ /usr/X11R6

X 윈도우 시스템에 사용되는 모든 파일들이 이 디렉토리 안에 저장된다. 이 디렉토리는 X 윈도우 시스템의 개발과 설치를 좀더 쉽게 하기 위해서 전체 시스템 디렉토리 구조에 통합되지 않고 독자적인 구조를 가진다.

 

◎ /usr/etc

/etc 디렉토리에는 각종 환경 설정 파일들이 있듯이 이곳에도 여러 가지 시스템 환경 설정 파일들이 저장되어 있다./usr/etc의 파일들은 /etc디렉토리 안의 파일들과 달리 꼭 팔요한 파일들은 아니다.

 

◎ /usr/sbin

시스템 관리자를 위한 명령어들이 저장되는 디렉토리이다. 보통 이 디렉토리의 명령어들은 루트 파일 시스템에는 필요가 없는 서버 프로그램들이 저장된다.

 

◎ /usr/include

C언어 관련 해더 파일드이 저장되어 있는 디렉토리이다.

 

◎ /usr/lib

각종 라이브러리들이 저장되어 있는 디렉토리이다. 만약 사용자가 직접 작성한 프로그램을 컴파일한다면 해당 프로그램은 /usr/lib 디렉토리의 파일에 link된다. 또한 이 라이브러리 안에 실행 코드가 필요하다면 /lib 디렉토리를 참조한다.

 

◎ /usr/local

시스템의 특정적인 프로그램들이 저장되는 디렉토리이다.특정적인이란 시스템 관리자에 의해서 따로 설치되는 프로그램들을 말한다.

 

◎ /usr/man

man페이지의 실제 내용들이 저장되어 있는 디렉토리이다. 디렉토리를 살펴보면 man1, man2, man3, 등과 같이 여러개의 디렉토리들로 나누어져 있는 모습을 볼수 있다.man1 디렉토리는 섹션 1의 man 페이지 소스를 위한 디렉토리를 말한다.

 

◎ /usr/src

시스템에서 사용하는 각종 프로그램들의 컴파일되지 않은 소스 파일들이 저장되어 있다./usr/src/linux 디렉토리가 바로 리눅스의 커널소스를 저장하고 있는 디렉토리이기 때문이다.

 

◎ /usr/X386

/usr/X11R6 디렉토리와 유사한 티렉토리로 X11 Release 5를 위한 디렉토리이다.

 

◎ /usr/info

GNU info문서들을 저장하고 있는 디렉토리이다.

 

◎ /usr/doc

각종 문서들이 저장되어 있는 디렉토리이다

 

◎ /lib

프로그램들의 각종 라이브러리들이 존재한다. 대부분 공유 라이브러리로 더 편하게 사용할 수 있으며,파일의 크기를 줄여서 실행할 때 불러 사용하게 된다. /lib/modules 디렉토리에는 커널로 로딩 사능한 커널 모듀들이 저장되어 있다.

 

◎ /home

시스템 계정 사용자들의 홈 디렉토리와 ftp,www,등과 같은 서비스 디렉토리들이 저장된다. 이곳의 디렉토리와 파일들은 시스템에서 상용되지 않는다. 단지 리모트상에서 시스템으로 접속하는 사용자들을 위한 공간이다.

 

◎ /dev

디렉토리에는 시스템의 각종 디바이스들에 접근하기 위한 디바이스 드라이버들이 자장되어 있는 디렉토리이다. 이 디렉토리는 물리적인 용량은 갖지 않는 가상 디렉토리이다. 대표적으로는 하드 드라이브,플로피, 씨디롬 그리고 루프팩장치 등이 존재한다. 리눅스 시스템은 윈도우와 달리 각종 디바이스 장치들을 하나의 파일로 취급한다. 따라서 시스템은 각각의 장치들로부터의 정보를 /dev 디렉토리에 존해하는 해당 장치 파일로 부터 가지고 온다.

 

◎ /dev/console

시스템의 콘솔이다.

 

◎ /dev/hda

시스템의 하드 디스크이다. 여기서 /dev/hda는 첫 번째 하드 디스크를 의미하는 것이다./dev/hda1은 첫번째 하드 디스크의 첫번째파티션,/dev/hda2 두 번째 파티션등을 의미한다.만약 시스템에 여러 개의 하드 디스크가 부착되어 있다면 /dev/hdb,/dev/hdc 등의 파일도 /dev/hdb1,/dev/hdb2등과 같은형식으로 저장되어 있다.

 

◎ /dev/lp

시스템의 병렬 포트 장치들이다.

 

◎ /dev/null

이 디렉토리는 블랙홀이라고도 부르는 특별한 장치이다. 이 장치로 데이터 등을 보내면 모두 폐기되므로 주의해야 할 것이다.

 

◎ /dev/pty

시스템으로의 원격 접속을 위한 'pesudo-terminal'들이다. 만약 시스템 계정 사용자드이 원격지에서 시스템으로 텔넷등을 이용하여 시스쳄에 접속을 시도한다면 이들은 /dev/pty 디바이스들을 사용하게 되는 것이다.

 

◎ /dev/sda

SCSI 장치들이다. 만약 시스템에 스카시 하드 디스크를 장착했다면 시스템은 /dev/sda파일에서 정보를 얻어 장치에 접근할 것이다.

 

◎ /dev/ttyS,/dev/cuaS

/dev/ttyS은 직렬포트 장치들이고, /dev/cauS는 Callout. 장치이다.

 

◎ /dev/tty

시스템의 가상콘솔들이다. 이 가상 콘솔의 기능은 하나의 화면에 여러 개의 콘솔들을 만든다. 만약 사용자가 시스템 앞에 앉을 수 있다면,Alt + F1, Alt + F2등을 이용하여 리눅스에 제공한 여러개의 가상 콘솔을 직접 볼수 있을 것이다.

 

◎/proc

시스템의 각종 프로세서, 프로그램 정보 그리고 하드웨어적인 정보들이 저장된다. 이 티렉토리는 가상 파일 시스템으로 가상 파일 /dev와 마찬가지로 하드 디스크상에 물리적인 용량을 갖지 않는다. 즉 디렉토리에 존재하는 파일들은 실제 하드 디스크에 저장되지 않고 커널에 의해 메모리에 적재 된다. 디렉토리 안의 파일들은 현재의 시스템 설정을 보여 주는 것이다.

 

◎ /proc/1

프로세스 번호가 1인 프로세스에 대한 정보를 저장하는 디렉토리이다. 다른 프로세스들도 자신의 고유한 프로세스 번호의 디렉토리를 가진다는 것을 의미한다.

 

◎ /proc/cpuinfo

프로세서의정보를 저장하고 있는 파일이다. cpu의 타입, 모델, 제조회사, 각종 성능 등의 정보를 제공하여 준다.

 

◎ /proc/devices

현재 시스템 커널에 설정되어 있는 장치들에 대한 정보를 저장하고 있다.파일등의 정보로 모든 시스템의 장치 목록에 대한 정보를 얻을 수 있다.

 

◎ /proc/dma

현재 시스템에서 사용하고 있는 DMA 채널에 대한 정보를 저장하고 있다.

 

◎ /proc/filesystem

시스템에 설정되어 있는 파일 시스템에 대한 정보를 저장하고 잇는 파일이다.

 

◎ /proc/interrupts

현재 사용중인 인터럽트와 인터럽트의 사용량에 대한 정보를 저장하고 있는 파일이다.

 

◎ /proc/ioports

현재 사용중인 I/O 포트에 대한 정보를 저장하고 있는 파일이다.

 

◎ /proc/kcore

현재 시스템에서 사용중인 메로리의 실제 이미지이다. 이 파일은 실제 메모리의 내용을 모두 가진 것처럼 보이지만 프로그램이 필요로 하는 부분의 이미지만을 필요할 때 만들어 제공한다.

 

◎ /proc/kmsg

커널에 의해서 출력되는 메시지들을 저장하고 있는 파일이다.이것은 또한 syslog파일에도 저장된다.

 

◎ /proc/loadavg

현재 시스템의 평균 부하량(Load Average)에 대한 정보를 저장하고 있는 파일이다.이 파일을 통해서 시스템이 현재 수행해야 하는 일이 얼마나 많은지를 알려주는 3가지 지표에 대한 정보를 얻을 수 있다.

 

◎ /proc/ksyms

시스템 커널이 사용하고 있는 심볼들에 대한 정보를 저장하고 있는 파일이다.

 

◎ /proc/meminfo

현재 시스템이 사용중인 메모리의 사용량을 저장하고 있는 파일이다./proc/meminfo에서 실제 메모리는 물론 가상 메모리에 대한 정보도 얻으 수 있다.

 

◎ /proc/self

이 디렉토리를 보고 있는 프로그램 자시의 프로세스 디렉토리로 링크도어 있다. 만약 서로 다른 2개의 프로세스가 /proc 디렉토리를 보고 있다면 두 프로세스는 서로 다른 링크를 보게 된다. 이를 통해서 프로그램들이 자신의 프로세스 디렉토리를 쉽게 찾을 수 있다.

 

◎ /proc/stat

시스템의 현재 상태에 대한 다양한 정보를 저장하고 있는 파일이다.

 

◎ /proc/uptime

시스템이 얼마나 오래 동작했는지에 대한 정보를 저장하고 있는 파일이다.

 

◎ /proc/version

시스템이 현재 사용중인 커널 버전에 대한 정보를 저장하고 있는 파일이다.

 

◎ var

시스템에서 사용되는 동적인 파일들이 저장된다. 각종 시스템 로그 파일, 사용자 로그인에 대한 보안기록,메일서버를 운영한다면 사용자들에게 전송된 메일들을 임시로 저장한다.

 

◎ /var/cache

포멧된 메뉴얼 페이지들이 잠시 대기(Cache)하기 위한 디렉토리이다.

 

◎ /var/lib

시스테이 동작하면서 계속 수정되고 변경되는 파일들을 위한 디렉토리이다.

 

◎ /var/local

/usr/local 디렉토리에 설치된 프로그램들의 각종 데이터들이 저장되는 디렉토리이다.

 

◎ /var/lock

잠금 파일들이 저장되는 디렉토리이다.프로그램들이 특정한 장치나 파일들을 프로그램 자신이 독점적으로 사용하려 할 때 /var/lock 디렉토리에 잠금 파일을 만들어 사용하게 된다. 그렇기 때문에 다른 프로그램들은 장치나 파일을 사용하기 전에 우선 이 디렉토리의 내용을 조사하여 해당 장치나 파일들이 사용중인지 확인하게 된다.

 

◎ /var/log

프로그램들의 로그 파일들이 저장되는 디렉토리이다. 이 디렉토리에 wtmp파일은 login 파일과 messages파일은 syslog의 로그 파일이다.wtmp는 시스쳄의 모든 사용자 로그인과 로그 아웃에 대한 정보르 저장하고 있는 파일이고,messages는 커널과 시스템의 모든 출력 메세지를 저장하고 있는 파일이다./var/log 안의 파일들은 시스템의 사용량에 따라 그 크기가 무한대로 증가할 있으므로 정기적으로 파이들을 삭제하는 등 디렉토리 관리가 필요하다

 

◎ /var/run

시스템의 현재 정보들을 저장하고 있는 디렉토리이다./var/run/xinetd.pid 파일의 경우 현재 사용중인 xinetd 데몬의 프로세스 번호를 저장하고 있다.

 

◎ /var/spool

메일이나 뉴스, 프린터 큐 등고 같은 시스템상에서 대기 상태에 있는 작업들을 위한 디렉토리이다. 각각의 대기 작업들은 모두 /var/spool 아래 고유의 디렉토리에 위치하게 된다. 예를 들어 시스템의 계정 사용자들의 메일은 /var/spool/mail 에 저장된다.

 

◎ /var/tmp

/tmp에 저장된 임시 파일들중에 오래 보관되어야 할 임시 파일들이 저장되는 디렉토리이다.

 

◎ /tmp

이름에도 알 수 있듯이 임시 파일들을 위한 디렉토리이다.

 

◎ /root

시스템 관리자의 홈 디렉토리이다

 


'Embedded Lab > linux, x86' 카테고리의 다른 글

[리눅스에서 FTP자동 Mount]  (0) 2013.03.13
[crystaldiskmark]  (0) 2013.03.05
[쉘 스크립트 wc]  (0) 2013.01.31
[쉘 스크립트에서 숫자연산]  (0) 2013.01.31
[awk에서 substr쓰기]  (0) 2013.01.31
Posted by cyj4369
,

파일내의 단어 수 등의 정보를 출력한다.

문법
wc [ -cwl ] 파일이름(들)
옵션
-c : 문자(character)의 개수만을 알고 싶을 때 사용한다.
-w : 단어(word)의 개수만을 알고 싶을 대 사용한다.
-I : 행(line)의 숫자를 알고 싶을 때 사용한다. 혹은 개행 문자의 개수를 알고자 할 때 사용될 수도 있다.
설명
wc라는 이름은 word counter를 의미하는 것이 아닌가 생각한다. 아무런 옵션을 주지 않고서 사용하면 행수, 단어수, 문자수를 모두 검사해서 보고한다. 텍스트 문서 속에서 단어란 공백(space)문자, 탭(tab)문자 그리고 개행(newline)문자에 의해 구분되는 문자들의 집합을 의미한다.
사용예
$ wc sample.txt
11 29 197 sample.txt

Posted by cyj4369
,

쉘 스크립트에서는 모든걸 문자로 인식 한다.
그래서 어떻게 하면 문자를 숫자로 인식 하는가 살펴 보았더니
키보드 1 옆의 ` 와 expr 이라는 문장과 " " 을 잘 혼합하여야 계산이
되는 것이었다.

예를 보자
========================
cal.sh
========================
#!/bin/sh
log1=11
log2=21
total=`expr "$log1" "+" "$log2"`
echo $total
========================


결과를 보시다 시피 32가 실행되어서 나온다.
` 과 ` 사이에 expr 이라는 문자열을 넣고 변수의 경우 " " 로 감싸 주고 
연산자 + 도 "+" 로 감싸 주었다 
이렇게 하면 위의 그림처럼 결과가 나온다.

손이 좀 많이 가는 쉘스크립트 숫자 연산인 것 같다.

Posted by cyj4369
,

awk '{print substr(값, 시작위치, 잘라낼문자갯수)}' [FileName]



Posted by cyj4369
,

LVM에서 VG구성했던 USB없이 VG삭제하는 방법

vgreduce --force --removemissing [vg이름]

'Embedded Lab > linux, x86' 카테고리의 다른 글

[쉘 스크립트에서 숫자연산]  (0) 2013.01.31
[awk에서 substr쓰기]  (0) 2013.01.31
[apt-get 자세한 사용법]  (0) 2013.01.29
[리눅스 RAM 확인하기]  (0) 2013.01.09
[ioctl시 CPU관점에서 커널 lock]  (0) 2013.01.08
Posted by cyj4369
,