Linux 커널(특히 2.6 이상)에 재귀 기능이 있습니까?

Linux 커널(특히 2.6 이상)에 재귀 기능이 있습니까?

커널 스택의 제한된 고정 크기를 고려할 때 이론적으로는 재귀가 너무 깊지 않으면 재귀 함수를 가질 수 있지만 실용주의에서는 안전을 위해 재귀 함수를 모두 함께 없애는 것이 좋습니다. 결국 너무 많은 재귀로 인해 *thread_info_t* 구조가 지워지고 커널 패닉이 발생할 수 있습니다.

답변1

예!

일부 재귀 호출이 기록되거나 함수 이름의 일부가 될 수 있습니까? 그런 다음 find/grep이 이를 표시해야 합니다. 이를 수행하는 명령은 다음과 같습니다.

find /usr/src/linux/ -name "*.c" -exec grep recursive {} ";" -ls 

Piping | wc -l은 270개를 제공합니다. 즉, -ls가 각 파일에 대해 추가 줄을 인쇄하므로 최소 135개의 파일과 기능이 있습니다.

첫 번째 게임을 살펴보겠습니다.

/usr/src/linux/fs/jfs/jfs_dmap.c

대회에 대한 코멘트는 다음과 같습니다.

  • dmap 제어 페이지 자체의 조정으로 인해
  • 루트가 변경을 수행하고 이 변경 사항은 다음 dmap까지 표시됩니다.
  • 이 루틴을 재귀적으로 호출하여 수준을 제어하고 다음을 지정합니다.
  • 새로운 루트 값 및 다음 dmap 제어 페이지 수준
  • 조정될.

메서드 앞에

static int
dbAdjCtl(struct bmap * bmp, s64 blkno, int newval, int alloc, int level)

실제로 라인 2486과 그 이웃은 다음과 같습니다.

if (dcp->stree[ROOT] != oldroot) {
    /* are we below the top level of the map.  if so,
     * bubble the root up to the next higher level.
     */
    if (level < bmp->db_maxlevel) {
        /* bubble up the new root of this dmap control page to
         * the next level.
         */
        if ((rc =
             dbAdjCtl(bmp, blkno, dcp->stree[ROOT], alloc,
                  level + 1))) {
            /* something went wrong in bubbling up the new
             * root value, so backout the changes to the
             * current dmap control page.
             */

왜냐하면 질문은,어느재귀 기능을 사용하면 다음 135개 이상의 일치 항목에 액세스하거나 명시적으로 언급되지 않은 재귀를 검색할 필요가 없습니다. 정답은

예!

답변2

이것Linux 커널 코딩 스타일재귀 함수는 금지되지 않습니다.

스택이 오버플로되지 않도록 주의해야 하지만 이 주의 사항은 재귀 함수에만 해당되는 것은 아닙니다.루프를 사용할 수 있으면 이유 없이 재귀를 사용하지 마세요., 그리고 당신을 기억해요그리고 당신의 기능을 호출총 8kB에 불과하지만 때로는 재귀가 올바른 도구입니다.

답변3

현재 커널에는 천만 줄이 넘는 코드가 있습니다. 나는 이 모든 코드 라인이 어딘가에서 재귀적이라고 확신합니다. 재귀 프로그래밍은 매우 강력하므로 보상을 얻기 위해 많은 레벨을 실행할 필요가 없습니다.

관련 정보