[C] 읽기 전용 메모리 공간

IT/학과 공부|2022. 8. 3. 13:40

안녕하세요. 밥한그릇입니다 ^^

오늘 친구와 연락을 하던 중 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일까요?

네. 정답은 둘 다입니다 (!!!)

읽기 전용 메모리 공간과 읽기-쓰기가 모두 가능한 메모리 공간이 모두 있습니다.

이 점을 기억해두시고 다음 설명으로 넘어갑시다.

 

 

https://www.researchgate.net/figure/THE-STACK-AND-OTHER-SEGMENTS-WITHIN-A-PROCESS-ADDRESS-SPACE_fig5_254048999

🔍 읽기 전용 메모리 공간

앞서 설명하면서, 메모리의 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

 


참고 자료

https://dojang.io/mod/page/view.php?id=1804#:~:text=C%20%EC%96%B8%EC%96%B4%20%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC%EB%8A%94%20%EB%AC%B8%EC%9E%90%EC%97%B4,%EC%93%B0%EA%B8%B0%EB%A5%BC%20%ED%95%A0%20%EC%88%98%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4. 

 

COS Pro 2급 C 언어: 38.1 문자열 복사하기

38 문자열을 복사하고 붙이기 이번에는 문자열을 다른 곳으로 복사하는 방법과 두 문자열을 붙이는 방법을 알아보겠습니다. 38.1 문자열 복사하기 문자열은 다른 배열이나 포인터(메모리)로 복사

dojang.io

이 포스팅을 작성할 때 C언어 코딩도장의 내용과 코드 예시를 참고하였습니다.

댓글()

[블록체인] 하이퍼레저 패브릭의 개념 - 기본 구조 (네트워크)

IT/블록체인|2022. 5. 26. 11:19

https://www.youtube.com/watch?v=d9EmSrNFDY8&list=PLlYCl1UOH8dima_f8QOIeY1ieuOAYKo_G 

오랜만의 포스팅이네요. (앞으로 포스팅 말투를 좀더 점잖게 바꾸기로 했습니다 ㅎㅎ)

유튜버 dapp campus님의  [Hyperledger Fabric Core Concept]] 01. Fabric Structure 강의를 정리한 것입니다. (위의 링크 참고)

예전에 공부했던 건데 지금 올려봅니다. (노션에 정리했던 건데 그냥 그 정리본을 캡쳐해 그대로 올립니다) 

문제 시 삭제하겠습니다! 댓글 주십시오.

 

사람들에게 블록체인이라면 보통 비트코인과 이더리움이 익숙할 것입니다.

그런데 이번엔 리눅스재단의 오픈소스 프로젝트로 만들어진 하이퍼레져 패브릭에 대해 알아볼 거에요.

Hyperledger Fabric은 과연 비트/이더와 어떤 점에서 다른 걸까요? 그리고 그 구조는 어떻게 이루어져 있을까요?

한번 알아봅시다.

 

비트, 이더와의 비교


구성요소


구조도와 진행 과정

 

 


'IT > 블록체인' 카테고리의 다른 글

[블록체인] 블록체인의 역사와 발전, 활용  (0) 2022.06.27

댓글()

[KOCW] 운영체제 2차시 - 운영체제 서론

IT/학과 공부|2021. 10. 26. 22:51

1. 운영체제 서론

 

운영체제란?  : Operating System

 

운영체제가 없는 컴퓨터는 '야생마'와 같다.

 

참고) 프로그램의 실행 과정

더보기

어떤 프로그램을 실행하기 전, 어떤 명령들(instruction)이 미리 메모리(휘발성 메모리)에 적재됨

 

프로그램 -> (메모리) <-> (프로세스)

 

프로그램 실행과정

프로그램(명령어들의 집합) -> 메모리에 올림 -> 프로세스로 올림

 

 

프로그램을 어떻게 메모리에 올릴까?

프로세스는 하나 뿐인데 어떻게 프로그램이 동시에 실행될 수 있을까?

-> 운영체제 없이는 불가능

 

운영체제란 무엇인가? : 컴퓨터 하드웨어를 관리하는 시스템 (Control program for computer)

컴퓨터에 있는 하드웨어를 잘 관리하여 성능을 높이고 사용자에게 편의성을 제공

 

 

부팅 (Booting)

 

참고) 메인메모리 

더보기

메인메모리 - RAM / ROM 메모리

 

RAM이 대부분, ROM은 적은 부분을 차지

RAM은 휘발성 메모리, ROM은 비휘발성 메모리

RAM은 전원이 꺼지면 메모리가 날아간다. ROM은 컴퓨터 부팅 과정에만 사용된다.

 

참고) 컴퓨터 구조

더보기

프로세서 / 메모리(ROM, RAM) / 디스크

POST (Power-On Self-Test) : 전기를 키면, 컴퓨터의 환경수준이 다 제대로 되어있는가 점거하는 것

부트로더 (Boot loader) : OS를 메인메모리로 로드함

 

부팅 과정

 

1. 프로세스에서 ROM부분의 코드를 제일 먼저 읽어와서 실행한다.

2. 이때 POST를 실행하여 점검한 후, 그 다음 부트로더를 실행하게 됨

3. OS가 메인메모리로 올라간다. (전원이 꺼지기 전까지 메인메모리에 유지됨)

 

 

운영체제의 위치

 

- OS의 구조

 

http://cis2.oc.ctc.edu/oc_apps/Westlund/xbook/xbook.php?unit=04&proc=page&numb=1

OS = Kernel + Shell

 

HW : 하드웨어 자원

Kernel : 실제로 하드웨어(메모리, 디스크)를 관리하는 프로그램

Shell (command interpreter) : OS의 바깥쪽에 위치. 사용자로부터 명령을 받아들여, 이를 해석한 뒤에 해당되는 명령을 실행

Application : OS 위에서 실행되는 응용프로그램. (OS가 관리해주는 대로 하드웨어 자원을 사용)

 

 

OS : 프로세스(cpu) 관리, 메모리(메인) 관리, I/O 관리, 파일(디스크) 관리, 네트워크 관리, 보안 관리

 자원 할당자, 자원 관리자

 

더보기

OS 가 하는 일 vs 정부가 하는 일

부서별 업무, 자원관리, 자원할당 등등...

댓글()

[KOCW] 운영체제 1차시 - 강의소개

IT/학과 공부|2021. 10. 26. 21:35

친구와 함께 운영체제에 대한 강의를 매일 1강씩 듣고, 블로그에 정리하기로 내기를 했습니다 ㅎㅎ

패널티로 벌금 내기 싫으니까 매일 열심히 하게 되겠죠?

무료대학강의 플랫폼인 KOCW에서 유명한 강의 중 하나입니다. 매일 매일 성실히 공부해서 정리하겠습니다~

그럼 시작합니다.

 


운영체제 강의

- 경성대 컴퓨터공학부 / 2학년 2학기 / 학부기초 / 3학점 (강의 3, 실습 0)

- 양희재 교수

- 교재 : Silberschatz et al, Operating System Concepts with java, 8th ed, 2011

 

- 수업목표

1) Windows, Unix/Linux, MacOS X, IOS, ...

2) 운영체제의 정의, 역할, 역사

3) 프로세스 관리, 주기억장치 관리, 파일 관리, ...

4) 운영체제 이해부터 설계까지

 


15주간 수업 계획

 

- 1~2주 : 개요, 역사, 현대운영체제

- 3~7주 : 프로세스 관리 (스케쥴링, 동기화)

- 8~11주 : 메모리 관리 (페이징, 가상메모리)

- 12~15주 : 파일 관리 (파일할당, 디스크스케쥴링)

 

1, 2 Introduction : Operating System? (오퍼레이팅 시스템이란)

3 Process Management (프로세스 관리)

4 Process Synchronization (프로세스 동기화)

5 Classical Problems (전통적인 문제)

6, 7 Deadlock (결착상태 -> 어떻게 해결할 것인가?) / 중간고사

8 Main Memory Management (주기억장치 관리)

9 Paging & Segmentation

10 Virtual Memory (가상메모리 -> 어떻게 만들 것인가)

11 File Allocation (파일 할당)

12 Disk Scheduling (디스크 스캐쥴링)

13~15 Summary & Final Exam (이 과목에 대한 전체적인 정리, 복습)

댓글()