리눅스의 아버지는 마침내 설득당했다: 30년 된 리눅스 커널 C 언어가 C11로 업그레이드될 것이다

WBOY
풀어 주다: 2024-02-14 21:36:03
앞으로
380명이 탐색했습니다.

최근에 사용하던 C언어 리눅스 커널의 1989년 버전이 드디어 대대적인 업그레이드를 했다는 소식이 있습니다. 현대 기술의 속도는 멈출 수 없습니다. 오늘날 Linux 오픈 소스 커뮤니티는 커널의 C 언어 버전을 C11 표준으로 업그레이드하려는 강력한 계획을 발표했습니다. 이번 대대적인 개편은 오는 5월인 리눅스 버전 5.18 이후부터 적용될 것으로 예상된다. 이 중요한 움직임은 Linux 커널에 무한한 잠재적 기회를 제공하고 최신 기술의 요구 사항에 더 잘 적응하는 데 도움이 될 것입니다.

이 결정은 질문을 시작한 후 공식 성명을 발표하는 데 불과 일주일이 걸렸습니다. Linux의 완고한 아버지 인 Linus Torvalds를 설득하는 것은 쉽지 않습니다. 문제의 이유는 약간 우연한 것 같습니다. Linux 之父终于被劝动:用了 30 年的 Linux 内核 C 语言将升级至 C11

벌레의 연쇄반응

이 문제는 지난주 Linux 커뮤니티 토론에서 발생했습니다.

Jakob Koschel이라는 박사과정 학생이 커널 연결 목록 프리미티브와 관련된 추측 실행 취약점을 방지하는 방법을 연구하던 중 이러한 문제를 발견했습니다.

Linux 커널은 struct list_head에 의해 정의된 이중 연결 목록을 광범위하게 사용합니다.

: 으아악 이 구조는 종종 다른 구조에 포함됩니다. 이러한 방식으로 관련 구조 유형을 사용하여 연결된 목록을 만들 수 있습니다.

또한 커널은 연결된 목록을 탐색하고 조작하는 데 사용할 수 있는 수많은 함수와 매크로도 제공합니다. list_for_each_entry()는 그 중 하나이며 제어 구조로 위장한 매크로입니다. 문제는 이 매크로에 있습니다. 커널에 다음 구조가 포함되어 있다고 가정합니다.

으아악

list의 요소는 foo 구조의 이중 연결 목록을 만드는 데 사용할 수 있습니다. 이러한 연결 목록의 선두로 선언된 foo_list라는 구조가 있다고 가정해 보겠습니다. 이 연결 목록은 다음 코드를 사용하여 탐색할 수 있습니다. 으아악

list 인수는 foo 구조 내의 list_head 구조 이름을 매크로에 알려줍니다. 이 루프는 목록의 각 요소에 대해 한 번 실행되며 반복자는 해당 요소를 가리킵니다. 이로 인해 USB 하위 시스템에 버그가 발생했습니다. 매크로에 전달된 반복자는 매크로를 종료한 후에도 계속 사용할 수 있습니다.

이것은 위험한 것이므로 Koschel은 루프 후 반복자 사용을 중지하여 버그를 수정한 수정 사항을 제출했습니다.

리누스를 설득하세요Linux 之父终于被劝动:用了 30 年的 Linux 内核 C 语言将升级至 C11

그러나 Linus Torvalds 자신은 이 패치를 별로 좋아하지 않으며 투기 실행 취약점과의 관계를 보지 않습니다. Koschel이 이에 대해 자세히 설명한 후 Linus는 이것이 단지 일반적인 버그일 뿐임을 인정했습니다.

그러나 상황은 그리 간단하지 않았고 Linus는 곧 실제 근본 원인을 깨달았습니다. 링크된 목록 순회 매크로에 전달된 반복자는 루프 자체 외부의 범위에서 선언되어야 합니다. 이 예측할 수 없는 버그는 C89에 "루프에 변수 선언"이 없기 때문에 발생합니다.

list_for_each_entry()와 같은 매크로는 루프 자체에서 반복자 변수를 선언할 수 없기 때문에 본질적으로 항상 루프 외부의 마지막 HEAD 항목을 누출합니다.

자신을 선언할 수 있는 반복자 목록 순회 매크로를 작성할 수 있다면 반복자는 루프 외부에 표시되지 않으며 그러한 문제도 발생하지 않습니다. 그러나 커널은 C89 표준을 따르기 때문에 루프 내에서 변수를 선언할 수 없습니다.

Linus는 업그레이드하기로 결정했습니다. 아마도 C99 표준으로 전환해야 할 때일 것입니다. 20년이 넘었지만 적어도 C89보다 최신 버전이며 루프 내에서 변수를 선언할 수 있습니다.

C89는 너무 오래됐는데 왜 그렇게 오랜 세월이 지나도 변하지 않았나요? Linus는 일부 고대 gcc 컴파일러 버전에서 이상한 문제가 발생하여 쉽게 업그레이드할 수 없었기 때문이라고 말했습니다.

그러나 이제 Linux 커널은 gcc에 대한 최소 요구 사항을 버전 5.1로 높였으므로 과거의 이상한 버그는 사라져야 합니다.

Linux 之父终于被劝动:用了 30 年的 Linux 内核 C 语言将升级至 C11또 다른 핵심 개발자인 Arnd Bergmann은 우리가 확실히 C11 이상으로 업그레이드할 수 있다고 믿습니다. 그러나 C17 또는 C2x로 업그레이드하면 gcc-5/6/7에 대한 지원이 중단되므로 C11로 업그레이드하는 것이 더 쉽습니다.

결국 Torvalds는 "알겠습니다. 5.18 병합 창 초기에 시도해 보겠습니다."라는 아이디어를 내놓았습니다. C11로 이동하면 예상치 못한 버그가 발생할 수 있지만 모든 것이 순조롭게 진행된다면 다음 Linux는 커널 버전은 공식적으로 C11로 이동됩니다.

위 내용은 리눅스의 아버지는 마침내 설득당했다: 30년 된 리눅스 커널 C 언어가 C11로 업그레이드될 것이다의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:lxlinux.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!