문제

나는 디자인에는 커널(는 내가 실제로 전화를"중핵"그냥 다를 수 있지만,그 기본적으로 같은)에 대한 OS 에서 일하고 있어요.의 세부 사항 OS 자체는 관련이 없는 경우가 얻을 수 없는 멀티태스킹,메모리 관리,및 다른 기본적인 것들을 실행,그래서 내가 필요할 수 있도록 하는데 초점을 두고 있음.나는 몇 가지 questinos 디자인에 대해 malloc 니다.

나는 그는 malloc()은 중 하나가 될 것의 일부 커널은 자체(나 쪽 이)또는 프로그램의 일부이지만,난 내 자신을 쓰기의 구현 C 표준 라이브러리에서 어느 쪽이든,그래서를 작성하 malloc.나의 질문은 실제로는 오히려 단순한 이와 관련하여,어떻게 C(C++)관리 힙?

어떤 나는 항상 가르쳤에 theorey 클래스는 힙도 확대의 조각이 기억에서 시작하여 지정된 주소,그리고 많은면에서의 감각처럼 행동 스택입니다.이 방법으로 나가 알고 있는 변수 선언서에서 글로벌 범위가 시작 부분에서,그리고 더 많은 변수는"밀어"에 힙으로 그 선언에 해당 범위,그리고 변수는 범위를 벗어는 단순하게 왼쪽에서 메모리 공간,그러나 그 공간을 무료로 표시되므로 힙 확장할 수 있습니다 더우면 그것을 주시기 바랍니다.

무엇을 알아야 하는 것은,어떻게 지구상에서는 C 실제로 처리하는 동적으로 확장하는 힙에서는 이런 방식으로?는 컴파일된 C 프로그램들에게 자신의 통화를 일상적인 malloc 및 처리하는 자신의 힙,또는 나는 필요를 제공하는 자동으로 확장하는 공간이 있나요?또한,어떻게는 C 프로그램 알고 있는 힙 시작?

아,그리고 내가 알기에는 동일한 개념을 적용하는 다른 언어로,그러나 나는 것처럼 예 C/C++기 때문에 나는 가장 편안하는 언어입니다.도를 걱정하지 않는 다른 것 같은 스택으로 나는 할 수 있는 일을 처리하기 위해 다음과 같이다.

그래서 나는 가정 내 진짜 문제는 다른 malloc/무료(처리하는 점점 확보 페이지에 대한 자체,etc.)가 프로그램이 필요합 OS 을 제공하는 다른 건 없나요?

감사합니다!

편집 내가에 더 관심이 있는 방법 C 사용하는 malloc 과 관련하여 힙에서 보다 실제 동작의 일상적인 malloc 자체입니다.도움이 된다면,나는 이렇게 86 지만,C 는 크로스 컴파일러 그래서 그것은 중요하면 안된다.^_^

편집:할 수 있다는 점을 이해 얻어 혼동된다.배웠는"힙"었는 프로그램을 저장한 것 같은 지역/글로벌 변수입니다.나는 사용을 다루고"스택에서"어셈블리 프로그램,그리고 나는 그냥 하는 것을 깨달았다 아마을 의미하는 대신 합니다.약간의 연구 내 부분에 보여줍니다"힙"더 일반적으로 사용을 참조하여 총 메모리는 프로그램으로 할당한 자체,또는,총(및 순서)페이지의 메모리 OS 가 제공됩니다.

그래서 그 마음에,나는 어떻게 처리도 확대 ?(나타나지 않는 내 C 클래스는 약간...결함이 있습니다.)

도움이 되었습니까?

해결책

malloc 일반적으로 구현 C runtime 에 사용자 공간에 의존하고,특정 OS 시스템 호출을 지도에서 페이지의 가상 메모리입니다.직업 mallocfree 은 이들의 관리 페이지를 메모리에서 해결 크기(일반적으로 4KB 지만,때때로 크고),슬라이스 주위에 조각으로 하는 응용 프로그램을 사용할 수 있습니다.

보,예를 들어, GNU libc 구현합니다.

에 대해 훨씬 간단하게 구현 확인 MIT 운영 체제 클래스에서는 마지막 년입니다.특히,보 최종 실험실 유인물, 고,살펴보 lib/malloc.c.이 코드를 사용하여 운영 체제 JOS 에서 개발 클래스입니다.그것이 작동하는 방법은 그것을 읽습니다 페이지 테이블(을 제공해 OS)을 찾고,매핑되지 않은 가상 주소 범위입니다.그런 다음 사용 sys_page_allocsys_page_unmap 시스템 호출을 지도하고 매핑을 해제 페이지로 현재의 과정입니다.

다른 팁

여러 가지 방법이 있을 해결하는 문제입니다.

은 대부분 C 프로그램이 자신의 malloc/기능이 있습니다.는 것입니다 작업을 위해 작은 물체.처음에는(로 메모리가 소진)메모리 관리자가 요청할 것입 OS 에 대한 더 많은 메모리.전통적인 방법을 통해 이 작업을 수행할 수 있 mmap 및 sbrk unix 개(호출/LocalAlloc on Win32).

내가 당신을 살펴보 Doug Lea 메모리 할당자 (구글:dlmalloc)에서 메모리 공급자(예:OS)의 관점입니다.는 할당자가 최고 수준에서 매우 좋은 걸이를 위해 모든 주요 가동 시스템입니다.하려면 무엇을 알고 높은 성능을 할당자를 기대에서는 OS 를 이 코드는 첫 번째 선택이 될 것입니다.

당신은 혼란 힙 및 스?

나 요구하기 때문에 당신이 언급"이제까지 확장각의 메모리",범위,밀 변수에 힙로 그들은 선언합니다.는 확실한 소리처럼 당신은 실제로 이야기에 대해 스택입니다.

에서 가장 일반적인 구현 C 선언의 자동변

int i;

일반적으로 가면 결과에 나가고 스택에 할당됩니다.에서 일반적인 malloc 지 않을 관여하지 않는 한 당신이 명시적으로 호출,또는 일부 라이브러리 호출을 만드를 호출합니다.

내가 권하고 싶을 보고"전문가는 C 프로그래밍"Peter Van Der Linden 배경에 대해서는 어떻게는 C 프로그램을 일반적으로 스택과 힙.

무 읽기:Knuth-예술의 컴퓨터 프로그래밍,1 권,제 2 장,절 2.5.그렇지 않으면 읽을 수 있는 커&Ritchie"C 프로그래밍 언어는"참조 구현;또는,당신을 읽을 수 있습 Plauger"표준 C 라이브러리"다른 구현합니다.

믿는 당신이 할 필요가 내의 핵심이 다소 다를 수에서 무엇을 외부 프로그램의 핵심 참조하십시오.특히,in-core 메모리 할당 프로그램에 대한 것을 다루는 가상 메모리 등는 반면,프로그램 코드 외부에서 단순히 결과를 참조의 핵심이 무엇인가가 있을 제공합니다.

읽기에 대한 가상 메모리 관리(페이징).그것은 매우 CPU 별,그리고 모든 OS 를 구현하는 VM 관리를 위해 특별히 지원되는 모든 CPU.만약 당신이 작성 OS x86/amd64 읽고,해당 매뉴얼이 있습니다.

일반적으로는 C 라이브러리를 처리하의 구현 malloc, 요청,메모리에서는 OS(를 통해 하나 익명 mmap 거나,노인 시스템 sbrk)으로 필요합니다.그래서 당신의 커널로의 처리해야 할당하는 전체 페이지를 통해 무언가가 다음과 같이 하나의 사는 의미입니다.

다음은 최대 malloc 나눠 메모리하지 않는 방법으로 조각한 메모리에 너무 많다.나지 않도 au fait 의 정보와 함께 이것은,하지만;그러나,기간 마음에 온다.면 사냥 참고,내가 이 게시물을 업데이트.

위험 위험!!하는 경우에도 고려하려고하면 커널 개발,당신은 아주 인식 비용 당신의 자원과 이들의 상대적으로 제한된 가용...

에 대한 한 가지 재귀,그것은 매우 비싼(적어도에서 커널 땅),하지 않겠다는 많은 기능을 작성하는 단순히 계속 unabaided,또는 다른 커널이 당황한다.

밑줄 나의 점을 여기에서,(에 stackoverflow.com heh),이 게시물을 체크 아웃에서 NT 디버깅 블로그 에 대해 kernel stack overflow 의,specificially,

·X86 기반 플랫폼 커널 모드에 스택이 12K.

·X64 기반 플랫폼 커널 모드에 스택이 24K.(x64 플랫폼이 포함 시스템 프로세서를 사용하 AMD64 건축 및 프로세서 사용 Intel®EM64T architecture).

·에 Itanium 기반 플랫폼 커널 모드에 스택이 32K32K 역행 저장합니다.

는 정말 많은;


1.스택을 사용하여 자유롭게.

2.호출 기능을 재귀적으로.

당신이 읽으면 이 블로그는,당신이 얼마나 열심히 커널 개발할 수 있는 독특한 설정의 문제입니다.당신이론 등 잘못이 아니었다,그것은 단순히,간단합니다.;)

에서 이동하기 이론->커널 개발에 대한 중요한의 컨텍스트 전환 가능한(아마도 저장 하이퍼바이저 상호 작용에 섞!!).

어쨌든,결코 가정,유효성을 검사하고 테스트합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top