728x90

드림핵에서 공부하다가 헷갈려서 정리한다.

아래와 같이 레지스터와 메모리가 있고, Code1번을 실행한다고 할때 rax에 저장되는 값은 무엇일까?

[Register]
rax = 0x31337
rbx = 0x555555554000
rcx = 0x2
=================================
[Memory]
0x555555554000| 0x0000000000000000
0x555555554008| 0x0000000000000001
0x555555554010| 0x0000000000000003
0x555555554018| 0x0000000000000005
0x555555554020| 0x000000000003133A
==================================
[Code]
1: add rax, [rbx+rcx*8]

 

[풀이]

- 먼저 0x로 표현되는 것은 16진수이다.
- rcx는 0x2(16진수로 2)이고 여기에 8을 곱하게 되면 10진수로는 16이다.
- 10진수 16은 16진수로 10이다. (참고링크)
- rbx의 값은 0x555555554000이므로 여기에 0x10을 더하게 되면 0x555555554010이 된다.
- 위의 Memory표를 참고하였을때 0x555555554010의 값은 0x0000000000000003이다.
- 0x31337에 0x0000000000000003을 더하게 되면 0x000000000003133A가 된다. (16진수 이므로 9다음에는 A가된다.)
- 0x000000000003133A는 0x3133A이다.

728x90
728x90

리눅스에서는 프로세스의 메모리를 크게 5가지의 세그먼트로 구분한다.

세그먼트란 적재되는 데이터의 용도별로 메모리의 구획을 나눈 것인데, 크게
- 코드 세그먼트
- 데이터 세그먼트
- BSS 세그먼트
- 힙 세그먼트
- 스택 세그먼트
로 구분된다.

메모리에 대한 권한은 읽기, 쓰기, 실행이 존재한다.

 

/ 코드 세그먼트
- 실행 가능한 기계 코드가 위치하는 영역
- 텍스트 세그먼트(Text Segment)라고도 불린다.
- 읽기, 실행 권한이 부여되어있다.
- 쓰기 권한이 있다면 공격자가 악의적인 코드를 삽십하기가 쉬워지므로, 대부분의 현대 운영체제는 이 세그먼트에 쓰기 권한을 제거한다.
- 함수가 컴파일 되었을때 기계 코드로 변환되면 코드 세그먼트에 위치하게 된다.

/ 데이터 세그먼트
- 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치합니다.
- 읽기 권한이 부여된다. (CPU가 이 세그먼트의 데이터를 읽을 수 있어야 하므로)
- 쓰기가 가능한 세그먼트와 쓰기가 불가능한 세그먼트로 분류된다.
- 쓰기가 가능한 세그먼트 :
    > data 세그먼트
    > 전역 변수와 같이 프로그램이 실행되면서 값이 변할 수 있는 데이터들이 위치한다.
- 쓰기가 불가능한 세그먼트 : 
    > rodata(read-only data) 세그먼트
    > 값이 변하면 안되는 데이터들이 위치합니다.
    > 전역으로 선언된 상수가 여기에 포함된다.

/ BSS 세그먼트
- 컴파일 시점에 값이 정해지지 않은 전역변수가 위치하는 메모리 영역이다.
- 개발자가 선언만 하고 초기화하지 않은 전역변수 등이 포함된다.
- 프로그램이 시작될 때, 모두 0으로 값이 초기화된다.
- 이 세그먼트에는 읽기, 쓰기 권한이 부여된다.

/ 힙 세그먼트
- 힙 데이터가 위치하는 세그먼트이다.
- 스택과 마찬가지로 실행중에 동적으로 할당될 수 있다.
- 리눅스에서는 스택 세그먼트와 반대 방향으로 자란다고 표현한다.
- C언어에서 malloc(), calloc() 등을 호출해서 할당받는 메모리가 이 세그먼트에 위치하게 된다.
- 일반적으로 읽기,쓰기 권한이 부여된다.

/ 스택 세그먼트
- 프로세스의 스택이 위치하는 영역이다.
- 함수의 인자지역 변수와 같은 임시 변수들이 실행중에 여기에 저장된다.
- 스택 세그먼트는 스택 프레임(Stack frame)이라는 단위로 사용된다.
- 함수가 호출될 때 생성되고, 반환될 때 해제된다.
- 특정 프로세스가 얼마 만큼의 스택 프레임을 사용하게 될 지 미리 계산하는것은 일반적으로 불가능하므로
운영체제는 프로세스를 시작할 때 작은 크기의 스택 세그먼트를 먼저 할당해주고, 부족해 질 때마다 이를 확장해준다.
- 스택이 확장될 때 기존 주소보다 낮은 주소로 확장되기 때문에 '아래로 자란다'라는 표현을 사용한다.
- 읽기, 쓰기 권한이 부여된다.

 

 

 

728x90
728x90

4.권한변경, 소유권 변경 - chmod, chown


리눅스를 사용하면서 root권한으로 작업을 해야할 때가 있는데, 그 횟수가 너무 많으면 그냥 사용자를 root로 변경해서 사용하곤 한다.

중요한건 그 이후다.

사용자를 root로 바꾸었다는 점을 잊어버리고 root권한으로 폴더나 파일을 생성해버리는 것이다.

이후 다른 사용자로 그 폴더나 파일작업을 하려고 하면 퍼미션 에러가 난다.

이때! 권한과 소유자를 바꾸는 명령어가 필요하다. (는 방금 나의 상황이었다..ㅋㅋ)


4-1. 권한변경

권한변경 명령어에 대해 알아보기 전에 터미널에서 권한을 확인하는 법을 먼저 알아보자.

현재 위치에서 'ls'라는 명령어를 치면 현재 위치에 있는 디렉토리 및 파일의 이름목록만 도르륵 나열된다.

이때 'ls -l'이라는 명령어를 입력하면 현재 디렉토리안에 있는 폴더와 파일들의 권한, 소유자, 소유자그룹 등등을 볼 수 있다.


ls -l이라는 명령어를 입력하면

drwxr-xr-x 2 yj yj 4096  4월  5 23:12 dir1

화면에 이런식으로 내용이 나오는데, 여기서 맨앞의 'drwxr-xr-x'부분이 권한을 표시하는 부분이다.

다소 암호문같이 생겨서 '저게 뭔가...' 싶을테지만 권한값을 읽는 방법이 따로있다.

1,3,3,3자리씩 끊어 읽으면 되는데 순서대로 [디렉토리][소유자권한][그룹권한][전체권한]을 의미한다.

(ex.d rwx r-x r-x)


첫글자가 d일경우 '디렉토리'라는 의미이고(일반 파일은  -으로 표시된다.)

그 뒤로

r : 읽기권한 (4)

w : 쓰기권한(2)

x : 실행권한(1)

을 의미한다.


rwx는 읽기, 쓰기, 실행권한이 모두 있다는것을 나타내며 각 권한의 숫자를 더해서 7로 읽는다.

r-x는 읽기, 실행권한만 있다는것을 나타내며 읽기권한과 실행권한의 숫자를 더해 5로 읽는다.

이를 토대로 위의 예제인 dir1의 권한을 살펴보면  소유자권한(7), 그룹권한(5), 전체권한(5)이므로 권한을 755로읽는다.


그럼 이제 권한이 어떻게 부여되어있는지 확인을 하였으니 권한변경 방법을 알아보자.

먼저 권한변경 명령어를 알아보자.

chmod [권한값] [파일명]

위의 dir1의 권한이 755였는데 이 권한을 만약 777로 바꾸고 싶다면!?

간단히 'chmod 777 dir1'이라고 명령어를 입력하면 된다.

권한바꾸기 명령어 끝!ㅋㅋ


4-1. 소유자 변경

소유자 변경도 간단하다.

chown [옵션] [소유권자:그룹식별자] [파일명]

위의 명령어만 입력하면 끝이다.

위의 예제가 dir의 소유자가 yj인데 만약 aaa소유로 바꾸고 싶다면!?

'chown aaa:aaa dir1'을 입력하면 끝이다.


그런데 말입니다. 만약 dir1안에 말입니다.

하위 디렉토리가 있지 말입니다.

이런상황에서 그냥 'chown aaa:aaa dir1'라고 입력하면 dir1안의 하위 디렉토리의 소유자까지 모두 바뀌지 않는다.(dir1만 변경된다.)

이럴때 쓰는 옵션이 -R옵션이다.

'chown -R aaa:aaa dir1'이라고 입력하면 dir1안의 하위 디렉토리까지 모두 소유권이 변경된다.



728x90
728x90

3. 이름 변경 및 이동 - mv


mv [옵션] 원본이름 바꿀이름

만약 test.txt라는 파일을 test1.txt로 이름을 바꾸려면 'mv test.txt test1.txt'라고 입력하면된다.

이름변경 옵션은... 많이 안써봐서 잘 모르겠다.

추후 쓰면서 검색하게 되면 추가하게될것 같다.



mv [옵션] 대상 위치

상황을 몇개 가정해 보자.

1 .현재 dir_sub위치에 있고, text.txt파일을 dir디렉토리로 옮기려고 한다면

 mv ./test.txt ../

위의 명령어를 입력하여 이동할 수 있다.


2. 현재 dir위치에 있고, dir_sub디렉토리를 dir2디렉토리로 옮기려고 한다면

mv ./dir_sub/* /dir2

위의 명령어를 입력하면 된다.

현재디렉토리의 dir_sub디렉토리와 그 디렉토리 안의 모든파일을 dir2로 옮겨라 라는 명령어이다.



728x90
728x90

2. 파일삭제 - rm

rm [옵션] 파일명/폴더명 

파일 및 폴더를 삭제하는 명령어는 rm이다.

현재 폴더안에 test.txt라는 파일이 있을때 그 파일을 삭제하려면 단순히 'rm test.txt'라고 입력하면 된다.


그런데 명령어를 입력하면 한번에 바로 삭제가 되는것이 아니라 정말로 파일을 삭제할 것인지 물어볼것이다.

혹시 이 삭제확인단계를 생략해도 되는 경우라면 '-f'옵션을 주면 된다.

rm -f test.txt

위처럼 입력하면 text.txt를 삭제할꺼냐고 묻지도 따지지도 않고 바로 삭제한다.


만약 dir이라는 디렉토리를 삭제하려면 똑같이 'rm dir'이라고 하면 될까?

아니다. 

파일은 아무런 옵션없이 삭제가 가능하지만 디렉토리는 따로 옵션을 주어야 삭제가 가능하다.

디렉토리를 삭제할때 쓰는 옵션은 '-r'이다.

rm -r dir

위처럼 입력하면 디렉토리가 삭제될것이다.

(사실 디렉토리를 삭제하는 명령어가 rmdir이라고 있지만 보편적으로 rm -r을 많이쓴다고 한다.)


그런데 다만 위 명령어를 쓰면 안에 서브폴더나 파일이 있을때 그것들을 일일히 삭제할것이지 계속 물어본다...

해서 한번에 삭제를 하려면 옵션 -r과 -f를 합치면 된다.

rm -rf dir

dir안에 몇개의 폴더와 파일이 있든 위 명령어를 입력하면 한방에 삭제가 될것이다.



마치며...

'-f'옵션을 주면  정말 묻지도 따지지도 않고 '옛썰! 삭제 ㄱㄱ!!'하기 때문에 신중신중하게 쓰도록 하자.


728x90
728x90

나의 서브 노트북엔 우분투가 깔려있다.

터미널 쓰는게 뭔가 재미있기도 하고..(있어보이기도 하고..)해서 터미널에서 작업을 주로 하는 편인데

자주 쓰게 되는 명령어들을 정리하면 좋겠다고 생각했다.


1. 폴더생성 - mkdir

mkdir [옵션] 디렉토리명

현재 디렉토리에 디렉토리를 생성하는 명령어는 'mkdir'이다.

단순히 현재 디렉토리 안에 새로운 디렉토리를 만드려고 한다면 'mkdir 폴더명'을 입력하면 된다.


그렇다면 위의 이미지처럼 현재 디렉토리안에 'dir'이라는 디렉토리를 만들고 dir디렉토리안에 dir_sub디렉토리를 만드는 작업을 한번에 하려면 어떻게 하면될까?

단순히 'mkdir dir/dir_sub'라고 입력하게 되면 생성이 되지 않는다.

이럴때 옵션을 지정해 주어야 하는데 이 상황에서 쓰는 옵션은 '-p'이다.

mkdir -p dir/dir_sub

위처럼 명령어를 준다면 'dir_sub'디렉토리가 들어있는 dir디렉토리를 한번에 만들 수 있다.

'-p'명령어는 상위디렉토리(dir)를 포함하는 새로운디렉토리(dir_sub)를 생성할때 쓰이는 옵션이다.


이번에는 폴더에 퍼미션을 주면서 생성을 해보자.

퍼미션을 주는 옵션은 '-m'이다.

mkdir -m 777 dir

위의 명령어를 입력하면 퍼미션값이 777인 디렉토리가 생성된다.



728x90

+ Recent posts