스티커 비트는 파일에 적용될 때 원래 무엇을 했습니까?


65

그 기능과 같이 다양한 장소에서 하나, 요즘 완전한 잘못된 것을 비난은 "스티키 비트"를 볼 수있는 요즘 A와 디렉토리와 행동에 쓰기 권한에 영향을 줄 것입니다 제한 삭제 플래그.

AskUbuntu 답변에서 응답자는 "스티커 비트가 일반적으로 디렉토리에 적용됩니다"라고 썼습니다 . 실제로 현대 시스템은 실제로 파일에 파일을 적용하지 않는 것처럼 보였지만 오래 전에 일반적인 경우는 디렉토리가 아닌 (실행 가능한 프로그램 이미지) 파일에 적용되는 경우였습니다. (파일에 대한 현대적인 사용법이 부족한 경우 관련 파일이 현재 파일 시스템에서 사용되지 않습니다 .)에 관련 질문 이 있습니다 .

이것은 질문을 촉발했다 :

실행 파일에 적용된 고정 비트 무엇을 습니까? 그때 setuid 같았나요?

과거 시제에 주목하십시오. 이 아닌 끈적 끈적한 비트가 어떻게 작동합니까? 지금. 그것은 그때 일하는 방식입니다.


3
"실제로 현대 시스템은 실제로는 파일에 적용하지 않는 것 같습니다."라는 말은 일부 시스템에만 해당됩니다. 스티커 메모 에 대한 Wikipedia의 페이지 "현재이 동작은 HP-UX 및 UnixWare에서만 작동합니다." 공통 구현 스레드가이를 무시하거나 메모리 / 스왑 등을 식별하기 위해 처리하는 다양한 구현을 보여주는 차트가 있습니다. 처리해야합니다. 사용 방법에 대한 자세한 내용은 운영 체제마다 다릅니다. 예를 들어, 어떤 Linux 시스템도 JdeBP의 답변과 같은 끈적 거리는 비트를 사용하지 않았습니다.
TOOGAM

답변:


91

아니요, 스티커 비트는 set-UID 또는 set-GID 플래그와 다릅니다. 자격 증명 처리에 대한 변경에는 영향을 미치지 않았습니다.

끈적 끈적한 비트는 프로그램 텍스트를 "끈적 끈적"하게 만들었습니다. 원래는 잘못된 이름이 아니 었습니다.

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

본질적으로, 실행 파일 형식 (책을 채울 수 있고 채울 수있는)의 세부 사항에 너무 깊이 들어 가지 않고 : 프로그램을 실행하기 위해 메모리에 직접로드되는 프로그램 이미지 파일의 부분은 기계 코드, 상수, 시작으로 구성됩니다 (0으로 초기화되지 않은) 변수의 값 및 0으로 초기화되고 초기화되지 않은 변수에 대한 빈 공간 (한 형태 또는 다른 형태).

이들은 "섹션"으로 알려진 모음으로 그룹화되며 일반적인 이름을 갖습니다. 기계 코드와 상수는 종종 프로그램 이미지의 "텍스트"섹션으로 알려진 것을 형성합니다. 0으로 초기화되지 않은 변수는 마찬가지로 "데이터"섹션입니다. 0으로 초기화되고 초기화되지 않은 변수는 "bss"(그 자체로 전체 민속 역사가있는 이름)입니다.

프로세스에 프로그램 실행 가능 이미지 파일이로드 된 경우 이미지 파일의 내용에서 다양한 부분 (텍스트, 데이터 및 bss)이 초기화됩니다.

"텍스트"섹션에서 특별한 점은 머신 코드 (및 상수)가 거의 항상 쓰여지지 않는다는 것입니다. 실행 가능한 이미지 파일이로드 된 모든 실행 프로세스의 가상 메모리 이미지에서 공유 될 가능성이 있습니다 . 프로그램 텍스트를 공유 할 수있는 정확한 시나리오는이 답변의 범위를 벗어 났으며 로더 수정 dem 등성 및 주소 공간 레이아웃 ID와 같은 것들을 포함합니다. 사람들은이 주제에 관한 책을 쓸 수도 있고 가질 수도 있습니다. ☺

공유 텍스트는 커널에서 사용하는 최적화입니다. 실행중인 단일 프로그램 이미지의 모든 인스턴스에 고유 한 개별 메모리 이미지가 없어도 동일한 머신 코드 (및 상수)의 여러 복사본으로 소중한 실제 메모리를 소비합니다.

스티커 텍스트

그러나 공유 텍스트보다 여전히 더 잘 할 수 있습니다. 분명히 특정 공유 텍스트 프로그램 이미지를 사용하는 프로세스가 항상 하나 이상 실행중인 경우 커널은 프로그램의 새 인스턴스가 실행될 때 새 프로세스의 가상 메모리 공간을 기존 공유 텍스트 세그먼트에 연결하기 만하면됩니다. 의 경우 (예를 들어) 거의 항상있다 /bin/login또는 /bin/sh실행 어딘가에 중간 크기의 시스템에서 로그인 프로그램하거나 커널이 이미 메모리에로드 된 자신의 텍스트 세그먼트의로드 사본에 부착 할 수있는 기본 쉘 너무 새로운 인스턴스.

스티커 텍스트는이 아이디어를 확장하여 현재 실행중인 프로세스가없는 이미지를 프로그래밍 합니다 . 실행 가능 이미지 파일이 고정 텍스트로 표시되면 커널은 마지막 프로세스 이후에 텍스트 세그먼트를 유지하여 종료합니다. 프로그램의 다른 인스턴스가 곧 실행되고 세그먼트에 다시 연결될 수 있기를 바랍니다.

초기 Unices에서는로드 된 고정 텍스트 세그먼트가 프로세스가 연결되지 않은 경우 스토리지를 교체하기 위해 교체됩니다. (나중 Unices는 이것을 위해 스왑 사용을 중지했습니다.) 또한 이름이 저장된 텍스트로 들었습니다 .

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

폐지

더 이상 사실이 아닌 스티커 텍스트의 작동을 기본으로하는 많은 가정이 있습니다. 스왑 스토리지에서 사전 작성된 세그먼트를 읽는 것이 실제 실행 가능 이미지 파일에서 요구되는 간단한 요구 페이징보다 빠를 필요는 없습니다. 파일 시스템 형식은 임의의 (순차가 아닌) 읽기 패턴에서 더 좋아졌습니다. 요구 페이징 자체의 출현은 통합 캐시, 공유 라이브러리 검색의 차이로 인한 비등 전성 외부 수정 및 주소 공간 레이아웃 무작위 화와 같은 사항을 변경합니다.

실행 가능한 프로그램 이미지를위한 끈적 끈적한 텍스트 비트는 오래 전부터 사라졌습니다. 예를 들어, 1980 년대 중반 4.3BSD의 작가들은 실행 가능한 프로그램 이미지에 대한 명시적인 고정 텍스트 마커 플래그를 쓸모없는 것으로 간주했습니다.

추가 자료

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

1
아주 좋은 답변입니다! 오늘 나는 무언가를 배웠다. :)
Andreas Wiese 2016 년

나도 :) 이것은 TSR도스 시절에 알고있는 것과 비슷하게 들린다 – "종료하고 거주자". 그러나 이는 일반적으로 나중에 실행되는 다른 프로세스가 호출해야하는 장치 드라이버와 같은 것들을위한 것이 었으며, 세계가 다중 스레드 / 다중 프로세스 OS로 이동할 때 사용되지 않을 수 있습니다.
Steve

1
이것은 멋진 답변입니다. 의 기원에 대해서는 어디에서 읽을 수 있습니까 bss?
고양이

1
TSR은 실제로 유사하지 않습니다. IBM + Microsoft 환경의 아날로그에 대해서는 표준 모드 에서 DOS + Windows 3.x 및 16 비트 OS / 2 버전 1.x를 참조하십시오. EXE 및 DLL 의 CODE세그먼트 (및 OS / 2 읽기 전용 DATA세그먼트)는 실행중인 모든 프로그램에서 (보통) 공유됩니다. 32 비트 OS / 2 버전 2.x 및 386 확장 모드 는 유닉스 세계가 몇 년 전과 마찬가지로 세그먼트 스와핑을 수요 페이징 된 가상 메모리로 대체 했기 때문에 실제로 "고착성"에 해당하는 것은 없습니다 . 거의 같은 방식으로 분할 끈적 거림이 필요합니다.
JdeBP

3
@JdeBP : 문제는 "스티커 비트가 setuid와 같았습니까?" 다소 광범위하고 부정확합니다. 하위 9 비트는 비슷하고 유사하기 때문에 대답은 "글쎄, 다소 복잡합니다"라고 주장합니다. 특정 사용자가 파일에서 특정 작업을 수행 할 수 있는지 여부에 영향을 미칩니다 . 그리고 set-UID, set-GID 및 sticky 비트는 작업이 허용 되는지 여부 와 관련이 없지만 작업 (특히 실행 작업)이 수행되는 방식의 일부 측면을 중재 한다는 점에서 유사 했습니다.
G-Man
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.