페이지 할당 관련

변유준의 이미지

리눅스에서 페이지 할당할때

alloc_pages()를 쓰게 되는데...

이걸쓰는데 질문입니다. 너무 황당할수도 있는 질문인데 ㅠㅠ

allloc_pages() 두번째 매개변수는 할당받는 페이지의 개수를 지정합니다(2의 지승)

이후 리턴은 페이지 디스크립터 포인터 형을 반환하죠.

여기서 궁금한게

하나를 할당받았을때는 그냥 쓰면 되지만

다수의 페이지 할당을 요청했을때는 맨 첫번째 페이지의 디스크립터 주소만 반환하게 됩니다.

1. 그러면 요청한 페이지 첫번째를 제외한 페이지들은 어떻게 접근이 가능하죠?

2. 반환된 페이지들은 물리적으로 연속인가요? 아니면 가상으로 연속인가요?

혹시 아시는분 조언 부탁드립니다.

beowulf의 이미지

1. Parameter로 넘어간 갯수 만큼 연속으로 만들어지기 때문에 첫번째 페이지 주소 + 페이지 크기 하면 됩니다. 대략
page_address( page ) + PAGE_SIZE * n 처럼 하시면 되겠네요.

2. alloc_page 계열은 physically 연속입니다. 가상으로 연속인 페이지들을 받으시려면 vmalloc 등을 쓰셔야 합니다.
___

evolution...

___

evolution...

select99의 이미지

리턴이 구조체 포인터니까..
그냥 포인터에 +1 하시면 다음페이지가 됩니다.

tj의 이미지

연속된 배열이 아닐 수도 있어서 nth_page(page, n) 사용하셔야 합니다.

select99의 이미지

연속되어 있습니다.

만일 그렇지 않다면 님이 제시한 함수조차도 문제해결이 불가능한 인터페이스가 되버립니다.

tj의 이미지

include/linux/mm.h

#define nth_page(page,n) pfn_to_page(page_to_pfn((page)) + (n))

이구요, include/asm-generic/memory_model.h 보시면, FLATMEM 일 때는 pfn <-> page mapping이 연속된 mem_map array에 인덱싱만 하지만 DISCONTIGMEM(NUMA 노드별로 이어서)이나 SPARSMEM (indirection이 완전히 한 layer 더 있습니다, NUMA 노드별로 연속되어있지도 않거나 memory hotplug시)인 경우는 하나의 연속된 배열이 아니라서 page + N 하시면 안됩니다.

근데 왜 연속된 배열이 아니면 nth_page()가 문제해결이 불가능한 인터페이스가 되죠?

변유준의 이미지

답변 감사드립니다~ 꾸벅~

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.