
나는 그 과정에 대해 읽고 있었다. 나는 다음과 같은 문제에 직면한 "프로세스를 만드는 방법"이라는 주제를 발견했습니다.
커널이 보는 프로세스 이미지는 자신만의 공간 user address space
, 즉 다른 사용자의 간섭으로부터 자유로운 보호된 공간에서 실행되고 있습니다. 이 주소 공간에는 여러 세그먼트가 있습니다.
ㅏ. 텍스트 세그먼트
B. 데이터 세그먼트
C. 사용자 세분화
나는 아직도 이것이 무엇을 의미하는지 이해하지 못합니다. 누군가 이 주제에 대해 나에게 알려 주실 수 있습니까?
답변1
Linux 또는 Unix 프로세스의 메모리(RAM)는 단지 선형 바이트 배열입니다. 각 바이트에는 0부터 최대값까지의 숫자가 있습니다. 이것이 프로세스의 "주소 공간"입니다. 주소 공간의 크기는 CPU가 32비트인지 64비트인지에 따라 다르지만, 메모리의 모든 바이트는 해당 바이트의 주소(단순한 숫자)를 기반으로 읽거나 쓸 수 있습니다.
프로세스에는 실행 가능한 코드, 사용하는 데이터, 실행 가능한 코드에서 수행한 함수 호출의 LIFO 활성화 레코드 스택 등 다양한 부분이 있습니다. 이것들은 조각입니다. 주소 공간 블록은 실행 가능한 코드인 "코드 세그먼트" 전용입니다. 주소 공간의 또 다른 블록은 초기화 변수(보통 전역 변수)에 할당됩니다. 이는 일반적으로 "데이터 세그먼트"로 명명되지만 데이터 세그먼트일 수 있습니다. 이것"BSS 세그먼트"는 일반적으로 초기화되지 않은 변수에 존재하며 일반적으로 세그먼트를 늘릴 수 있습니다. 함수 활성화 레코드의 LIFO 스택은 일반적으로 명시적으로 표시되지 않습니다.
프로세스 주소 공간의 일부 다른 부분은 동적으로 로드된 라이브러리, C++ 생성자 또는 소멸자, 동적 링커 코드 등에 전용될 수 있으며 이는 매우 복잡해질 수 있습니다.
그런 다음 실행 파일 형식의 문제가 있습니다. 대부분의 Linux 또는 Unix 프로세스에는"ELF" 파일 형식, Mac에서는 Mach-O 형식을 사용하지만. 많은 프로세스에는 초기 주소 공간에 해당 실행 가능 조각이 있습니다.
제 생각에는이 페이지프로세스의 주소 공간을 채우는 것이 무엇인지에 대한 아이디어를 제공합니다. "주소"는 기본적으로 메모리의 바이트 이름을 지정하는 숫자라는 점을 기억하세요. 일부 작성자는 실행 프로세스를 디스크에 있는 파일과 혼동하기도 하므로 생각하거나 읽을 때 명확하게 하려고 노력하십시오.
주소 공간이 무엇인지에 관해서는... 실행 중인 모든 프로세스에 대한 사용자 주소 공간이 있습니다. 이렇게 하면 한 프로세스가 다른 프로세스의 데이터를 쓰고 두 번째 프로세스가 충돌하는 것을 방지할 수 있습니다. 즉, 주소 공간은 버그가 있는 프로그램이 다른 프로그램을 손상시키는 것을 방지하는 데 사용됩니다. 또한 주소 공간 세그먼트는 서로 데이터를 처리하므로 한 사용자의 프로그램이 다른 사용자에게 보여주고 싶지 않은 정보를 메모리에 보관할 수 있습니다. 주소 공간을 사용하면 메모리의 데이터에 대한 액세스를 제어할 수 있습니다.