고정 비트가 파일에 적용될 때 처음에 수행하는 작업은 무엇입니까?

고정 비트가 파일에 적용될 때 처음에 수행하는 작업은 무엇입니까?

많은 곳에서 "스티키 비트"라는 용어를 볼 수 있지만 이제는 그 기능 때문에 완전히 잘못된 이름이라는 비난을 받고 있습니다.지금디렉토리에 영향을 미치고 다음과 같은 역할을 하는 쓰기 권한입니다.삭제 제한배너.

AskUbuntu의 답변에서 답변자는 다음과 같이 썼습니다."고정 비트는 일반적으로 디렉토리에서 작동합니다.". 나는 실제로 현대 시스템이 그것을 파일에 적용하지 않는 것 같지만 오래 전에는 관찰했습니다.대개무슨 일이 일어나는지는 디렉터리가 아닌 파일(실행 가능 프로그램 이미지)에서 작동한다는 것입니다. (최신 파일 사용이 부족할 때 관련 질문이 있습니다.현재 파일 시스템이 고정 비트를 사용하지 않는지 여부.)

이는 다음과 같은 질문을 제기합니다.

무엇했다고정 비트가 실행 파일에 적용됩니까? setuid 같은건가요?

과거형에 주의하세요. 이것은 아니다끈끈한 비트는 어떻게 작동합니까?지금. 그 당시에는 그렇게 작동했습니다.

답변1

아니요, 고정 비트는 set-UID 또는 set-GID 플래그와 동일하지 않습니다. 자격 증명 처리에 대한 변경 사항에는 영향을 미치지 않습니다.

고정 비트의 목적은 프로그램 텍스트를 "고정"으로 만드는 것입니다. 원래 이 말은 틀린 말이 아니었습니다.

배경: 프로그램 이미지 섹션 및 공유 텍스트

기본적으로 실행 파일 형식에 대한 세부 사항을 너무 깊이 다루지 않고(책에는 이러한 형식으로 채워져 있을 수 있음) 프로그램을 실행하기 위해 메모리에 직접 로드되는 프로그램 이미지 파일 부분에는 기계어 코드, 상수, 값이 포함됩니다. ​​시작(0이 아닌 초기화) 변수 및 (어떤 형태로든) 0으로 초기화되거나 초기화되지 않은 변수를 위한 공백입니다.

이들은 "섹션"이라는 컬렉션으로 그룹화되며 일반적인 이름을 갖습니다. 기계어 코드와 (때때로) 상수는 일반적으로 프로그램 이미지의 "텍스트"라고 불리는 것을 형성합니다. 마찬가지로, 0으로 초기화되지 않은 변수는 "데이터" 부분이고 0으로 초기화되지 않은 변수는 "데이터" 부분입니다."무의미한 말"(이름 자체에는 전체 민속 역사가 있습니다).

프로세스가 프로그램 실행 가능 이미지 파일을 로드하면 이미지 파일의 내용을 기준으로 각 부분(텍스트, 데이터, bss)이 초기화됩니다.

"텍스트" 부분의 특별한 점은 기계 코드(및 상수)가 거의 항상 작성되지 않는다는 것입니다. 그럴 가능성이 있다공유됨이 실행 가능 이미지 파일이 로드된 모든 실행 프로세스의 가상 메모리 이미지입니다. 프로그램 텍스트를 공유할 수 있는 정확한 시나리오는 이 답변의 범위를 벗어나며 멱등성 및 주소 공간 레이아웃 식별을 위한 로더 수정과 같은 작업이 포함됩니다. 사람들은 이 주제에 관한 책을 쓸 수도 있고 또 쓸 수도 있습니다. ☺

공유 텍스트는 커널에서 채택한 최적화입니다. 단일 실행 프로그램 이미지의 각 인스턴스가 자체 별도의 메모리 이미지를 가질 필요가 없으므로 정확히 동일한 기계어 코드(및 상수)의 여러 복사본을 통해 귀중한 물리적 메모리를 소비합니다.

끈적끈적한 텍스트

하지만 문자를 공유하는 것보다 더 나은 일을 할 수 있습니다. 분명히 특정 공유 텍스트 프로그램 이미지를 사용하는 실행 중인 프로세스가 항상 하나 이상 있는 경우 해당 프로그램의 새 인스턴스가 실행되면 커널은 새 프로세스의 가상 메모리 공간을 기존 공유 텍스트 세그먼트에 추가하기만 하면 됩니다. 거의 항상 ( 가령) /bin/login또는/bin/sh어딘가에따라서 중간 규모 시스템에서는 로그인 프로그램이나 기본 셸의 새 인스턴스를 커널이 이미 메모리에 로드한 텍스트 세그먼트의 로드된 복사본에 간단히 연결할 수 있습니다.

고정 텍스트는 이 아이디어를 절차적 이미지로 확장합니다.현재 실행 중인 프로세스가 없습니다.. 실행 가능한 이미지 파일이 고정 텍스트로 표시되면 커널은 이를 사용한 마지막 프로세스가 종료된 후에도 텍스트 세그먼트를 유지합니다. 프로그램의 다른 인스턴스가 곧 실행되어 세그먼트를 다시 추가할 수 있기를 바랍니다.

이전 Unices에서는 로드된 고정 텍스트 세그먼트에 프로세스가 연결되지 않은 경우 스왑 저장소로 교체되었습니다. (Unices는 나중에 exchange 사용을 중단했습니다.) 이 이름을 들어보셨을 수도 있습니다.저장된 텍스트.

물론 프로그램 이미지에 고정 텍스트 비트를 설정하는 것은 주의해야 할 사항입니다. 어떤 프로그램이 이로부터 이점을 얻을 수 있는지는 기계의 일반적인 사용에 따라 다릅니다. 현재 연결되지 않은 텍스트 세그먼트는 커널 리소스를 소비합니다. 즉, 모든 시스템에서 사용할 수 있는 텍스트 세그먼트 수에는 실질적인 제한이 있습니다. 따라서 작업에는 일반적으로 수퍼유저 권한이 필요합니다.

폐하다

더 이상 올바르지 않은 고정 텍스트 작업 뒤에는 여러 가지 가정이 있었습니다. 스왑 저장소에서 미리 제작된 세그먼트를 읽는 것이 실제 실행 가능한 이미지 파일에서 간단한 끌어오기 요청보다 반드시 빠른 것은 아닙니다. 파일 시스템 형식은 (순차가 아닌) 무작위 읽기 패턴에 더 적합해졌습니다. 통합 캐싱, 공유 라이브러리 검색 차이로 인한 비멱등성 외부 수정, 주소 공간 레이아웃 무작위화 등 수요 페이징 자체의 출현으로 상황이 바뀌었습니다.

실행 가능한 프로그램 이미지에 끈적끈적한 텍스트 비트를 사용하던 시대는 오래 전에 지나갔습니다. 예를 들어, 1980년대 중반에 4.3BSD 작성자는 실행 가능한 프로그램 이미지에 대한 명시적 고정 텍스트 마크업 플래그가 더 이상 사용되지 않는다고 간주했습니다.

추가 읽기

  • 바흐, 모리스 J. (1986). UNIX 운영 체제 설계. 프렌티스 홀. ISBN 9780132017992.

관련 정보