에러
-
[C] 읽기 전용 메모리 공간2022.08.03
-
[ARM64] 맥북 M1 위에 설치한 리눅스 가상환경에서 vscode 설치하기2022.06.28
[C] 읽기 전용 메모리 공간
안녕하세요. 밥한그릇입니다 ^^
오늘 친구와 연락을 하던 중 C언어의 '읽기 전용 메모리'에 관한 내용을 새롭게 알게되어, 오랜만에 포스팅을 쓰게 되었습니다.
그럼 시작합니다~
C언어는 프로그래밍 언어의 기본으로도 여겨지며, 하드웨어와 관련된 많은 api를 제공하고 직접 메모리를 할당-해제합니다. 따라서 사람의 언어보다는 기계의 방식에 더 가까운 low-level 언어로 분류되고 있습니다.
저 또한 C언어를 주력 언어로 사용해왔으나, 보통 개발 시 사용하게 되는 C언어의 기능이 제한적인 만큼 '읽기전용 메모리 공간'에 대한 내용은 오늘 처음 접하게 되었습니다. 따라서 포스팅을 통해 그 설명과 기록을 해두고자 합니다.
📟 메모리 공간
4개의 메모리 segment
메모리 공간은 OS에 의해 할당되어, 물리적 주소가 아닌 논리적 주소의 형태로 다음과 같이 연속적으로 존재합니다.
여기에는 stack 영역, heap 영역, 데이터 영역, code(text) 영역이 있습니다.
잘 알려져있다시피 스택 영역은 지역 변수들과 함수의 호출 정보 등을 저장하며, 힙 영역은 우리가 동적할당한 데이터들을 저장하게 됩니다.
데이터 영역은 주로 전역변수와 정적 변수 등을 저장하며, 프로그램의 시작과 함께 메모리가 할당되어 프로그램이 끝나면 소멸합니다. 코드 영역은 컴파일 시간에 결정된 코드와 상수가 기계어로 저장되어 있습니다.
Stack과 Heap은 메모리 주소공간의 위 아래에서 서로를 마주보며 영역을 확장하는 구조입니다.
각 segment에서의 읽기/쓰기 권한
이때 각 영역에 대한 읽기/쓰기 권한이 서로 다릅니다.
Read-only(읽기 전용) 영역에서는 메모리에 대한 읽기만 가능하고, 쓰기는 불가능합니다. 그렇지만 Read-Write 영역에서는 메모리 공간에서 데이터를 읽고 쓰는 것 모두가 가능합니다.
코드 영역은 컴파일 이후 그 내용이 변경되면 안되므로 Read-only 영역입니다. 반면에 Stack 영역과 Heap 영역은 내용을 읽는 것도 가능하고, 내용을 바꾸고 새로 쓸 수도 있는 Read-Write 영역입니다.
그러면 data 영역은 어떤 영역일까요. Read-Only일까요 아니면 Read-Write일까요?
네. 정답은 둘 다입니다 (!!!)
읽기 전용 메모리 공간과 읽기-쓰기가 모두 가능한 메모리 공간이 모두 있습니다.
이 점을 기억해두시고 다음 설명으로 넘어갑시다.
🔍 읽기 전용 메모리 공간
앞서 설명하면서, 메모리의 data segment 영역에 읽기 전용 메모리와 읽기-쓰기 모두 가능한 메모리가 따로 있다고 했습니다.
이때 이 읽기 전용 메모리 공간을 C에서 쓸 수 있는데요.
어떻게 하면 읽기 전용 메모리 공간을 사용하는 지 예시를 통해 보도록 하겠습니다.
#define _CRT_SECURE_NO_WARNINGS // strcpy 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
#include <string.h> // strcpy 함수가 선언된 헤더 파일
int main()
{
char *s1 = "Hello"; // 문자열 포인터
char *s2 = ""; // 문자열 포인터
strcpy(s2, s1); // 실행 에러
printf("%s\n", s2);
return 0;
}
다음의 코드를 실행하면 에러가 납니다. 왜 일까요?
읽기 전용 메모리끼리 복사(쓰기)를 수행하려고 하였기 떄문입니다.
char *p = "문자열" 과 같은 형식으로, 포인터의 값을 바로 할당해주게 되면, 이 데이터는 읽기 전용 data 섹션에 저장됩니다.
따라서 이러한 메모리 관련 오류를 일으키지 않게끔, 읽기전용 메모리에 대해서도 확실히 알아두는 것이 좋겠습니다.
포인터와 메모리 관련 개념이 확실히 잡히지 않은 경우, 더욱 헷갈릴 수 있는 부분이라고 생각합니다.
char *s1 = "Hello"; char *s2 = "";과 같은 문자열 포인터에 할당된 문자열 리터럴은 왜 읽기 전용일까요?
C 언어 컴파일러는 문자열 포인터에 할당한 문자열 리터럴을 실행 파일의 읽기 전용 데이터 섹션(데이터 세그먼트)에 배치하기 때문입니다. 따라서 실행 파일이 실행된 뒤에는 읽기 전용 메모리가 되며 쓰기를 할 수 없습니다. 다음은 각 운영체제별 읽기 전용 데이터 섹션 이름입니다.
- Windows PE: .rdata
- 리눅스 ELF: .rodata
- OS X Mach-O: __TEXT, __cstring
참고 자료
COS Pro 2급 C 언어: 38.1 문자열 복사하기
38 문자열을 복사하고 붙이기 이번에는 문자열을 다른 곳으로 복사하는 방법과 두 문자열을 붙이는 방법을 알아보겠습니다. 38.1 문자열 복사하기 문자열은 다른 배열이나 포인터(메모리)로 복사
dojang.io
이 포스팅을 작성할 때 C언어 코딩도장의 내용과 코드 예시를 참고하였습니다.
'IT > CS 공부' 카테고리의 다른 글
[전공] C에서의 변수의 scope와 lifetime (0) | 2022.06.11 |
---|---|
[컴파일러] LR 파서 문제 풀이 (0) | 2022.06.11 |
[컴파일러] LL(1) 파서 문제 풀이 (0) | 2022.06.11 |
[컴파일러] LL 파서와 LR 파서 (0) | 2022.06.10 |
[KOCW] 운영체제 3차시 - 프로세스 관리 (0) | 2021.11.08 |
[ARM64] 맥북 M1 위에 설치한 리눅스 가상환경에서 vscode 설치하기
안녕하세요 밥한그릇입니다.
저는 현재 m1 맥북을 사용하있고, 개발할 때도 많이 사용하는 편입니다.
그런데, 다른 pc의 리눅스 환경에서 진행하고 있는 개발을, 제 m1 노트북에 가져와서 이어서 작업하고 싶은데 개발환경이 다르다보니 쉽게 그럴 수가 없더라구요. 더군다나 m1은 apple silicon칩 기반의 새로운 운영체제를 사용하기도 해서, 아직 지원하지 않는 소프트웨어가 꽤 많기 때문에 호환성도 떨어져요... (ㅠㅠ)
그래서 가상 환경으로 리눅스를 설치하고자 고생을 많이 했습니다.
가상머신을 지원하지 않는 경우가 대부분인데다가, 열심히 알아보아 겨우 설치하더라도 나중에 좀 이상해지는 경우가 있었어요. (sudo apt install 과정에서 계속 의존성 관련 오류가 생기는 등)
그래서 이번에 새로 vmware fushion을 통해 kali linux를 깔아봤는데, 결과는 대 성공이었습니다 ㅎㅎㅎ
mac m1에서의 리눅스 가상환경 설치 방법은 아래 더보기를 클릭하세요.
https://elsainmac.tistory.com/869?category=665146
m1(apple silicon) mac 에서 Linux를 사용하고 싶다면... (VMware Fusion Technical Preview를 이용하는 방법)
apple silicon 칩을 내장한 mac을 사용하는 분들에게 아직은 많은 제약이 따르고 있는데, 그 중에 가장 큰 부분은 역시 MS Windows나 Linux등을 Native하게 설치해서 사용하기 어렵다는 것입니다. 물론, 몇
elsainmac.tistory.com
맥북 M1에서 리눅스 가상환경을 설치하려면 위의 링크를 따라 그대로 설치하세요.
이게 제가 깔아본 방법 중 가장 쉬웠습니다... 이전에 UTM을 이용해서 깔아보기도 했지만 나중에 계속 설치 오류같은 것이 생겨 지웠고, 지금은 vmware fusion에 만족하고 있습니다.
참고로, 위의 블로그에 나온대로 설치할 때 토렌트 파일로 칼리리눅스를 설치하려니 귀찮았는데, 그냥 일반파일로는 아무리 기다려도 도저히 다운로드가 되지 않습니다. 그래서 다음의 Transmission 이라는 프로그램을 이용해 토렌트 파일을 집어넣고 다운로드 해주니 굉장히 빨리 다운로드가 되었습니다.
https://iboxcomein.com/using-transmission-on-mac/
맥에서 토렌트 파일 다운로드하는 방법 – Transmission 기본 사용법 - SoEasyGuide
토렌트를 이용해 파일을 컴퓨터에 다운로드하기 위해서는 토렌트 클라이언트가 설치 되어 있어야 합니다. 많이 사용 되는 토렌트 클라이언트에는 유토렌트(μTorrent), 큐빗토렌트(qbittorrent) 그리
iboxcomein.com
vscode 설치
그러나 한가지 문제가 있는게, 아무리 노력해도 vscode 설치가 되지 않아 힘들었어요.
구글링에서 나온 그대로 어떤 경로 설정 등등을 해서 sudo apt install code를 해도 패키지를 다운받을 수 없었구요. 직접 리눅스용 vscode 파일을 다운받아준 다음 sudo apt install ./code~~~ 이렇게 해도 에러가 나서 깔 수가 없었어요. 갖은 방법을 써보고 구글링해봐도 답이 없더라구요.
그런데, arm64에 맞는 .deb 파일로 깔아봤더니 vscode 설치에 성공했습니다! 원래는 그냥 저기 커다란 .deb 버튼을 눌러 amd64용 파일을 다운받고는 설치가 되지 않아 애먹었는데.. 그동안 너무 삽질만 했네요 (ㅠㅠ) 저같은 사람이 생기지 않기를 바라는 마음에 포스팅을 작성했습니다 (...)
** 참고 : 이 vmware-fusion에 깔아준 m1용 kali-linux는 arm 체제 기반이거든요. 그래서 반드시 amd가 아닌 arm64로 깔아주어야하는 것이랍니다.
저 빨간 박스로 표시해놓은 부분을 클릭하여 설치한 뒤, 다운로드한 폴더로 들어가 파일을 설치해주면 됩니다.
터미널을 클릭하여 띄운 뒤 다음의 명령어를 입력해줍시다.
cd ~/Downloads
sudo apt install ./(다운로드 받은 파일 명)
code # vscode 실행
다운로드 받은 파일 명은 sudo apt install./ 까지 치고 탭 치면 자동완성 되어 나올 거에요.
(저는 amd용 설치파일과 arm용 설치 파일이 총 2개가 있어서 2개가 검색 되었지만, 파일이 하나만 있다면 하나가 바로 자동완성 되어 나옵니다)
설치 후, 터미널에 code 라고만 입력해주면 vscode 창이 뜹니다.
와~ vscode가 잘 설치된 모습을 볼 수 있죠?
그전에 정말 갖은 뻘짓을 많이 하느라 고생했었는데 드디어 성공해서 정말 좋네요...
(그전엔 vscode 설치가 되지않아 vscodium을 설치했다가 github 연동이 잘 되지않아 포기하고 vscode 설치로 다시 돌아오는 등.. 많은 뻘짓을 했습니다)
바로가기 설정
그런데 아직 바로가기가 설정되지 않았습니다.
작업바나 아니면 바탕화면에 vscode 바로가기 아이콘이 생기면 정말 좋을텐데요.. 그렇죠?
바탕화면 바로가기 추가부터, 작업바에도 바로가기 아이콘을 추가한 모습입니다.
이제 사용하기 더욱 편하겠네요 ^^
이 포스팅이 도움이 되었다면 좋아요 버튼 눌러주세요~
댓글 또는 지적 항상 환영합니다 ^^
'IT > 개발 환경 및 설치' 카테고리의 다른 글
[ARM64] M1 맥북에서 윈도우 사용하기 (feat. Parrellels) (0) | 2022.07.04 |
---|---|
[오류] VM VirtualBox 시작 오류 (0) | 2022.02.24 |
[오류] 맥북 m1 : gdb 설치 오류 - Error: gdb: no bottle available! (0) | 2022.01.23 |
리눅스에 GUI가 설치되어있는 지 확인하는 방법 (명령어) (0) | 2021.11.21 |