c언어 동적할당 msize

doobae11의 이미지

pmegabyte = (int **)calloc(mainMegabyte*BLOCK, sizeof(int*) * 4096);
for (int i = 0; i<(mainMegabyte*BLOCK); i++) {
	pmegabyte[i] = (int *)calloc(SECTOR, sizeof(int) * 128);
}
 
printf("%d\n", _msize(&pmegabyte[0][0]));

간단한 플래쉬 메모리 구현중에 섹터 메모리를 512바이트로 해줄려고 하는데요. 위와 같이 msize함수로 확인하면 한 블럭의 메모리만 나오는데 한 섹터 메모리만 확인 하는 방법있나요?? 저렇게 출력하면 512바이트가아닌 한 블럭 용량인 16384바이트가 나오네요 ㅠㅠ

shint의 이미지

정확히 뭔지는 모르겠네요.

1. disk_ioctl (GET_SECTOR_SIZE)

2. USB 대용량 저장장치 [네이버책]
http://book.naver.com/bookdb/book_detail.nhn?bid=2916177

3. CreateFile () [MSDN]
FILE_FLAG_NO_BUFFERING

4. 운영체제 강의 KOCW

5. 그 밖에 오픈소스'를 참고해도 될겁니다.

--------------------------------------------------
찾아본 내용
--------------------------------------------------
플래시 메모리 섹터'로 네이버 책 검색
http://book.naver.com/search/search.nhn?sm=sta_hty.book&sug=&where=nexearch&query=%ED%94%8C%EB%9E%98%EC%8B%9C+%EB%A9%94%EB%AA%A8%EB%A6%AC+%EC%84%B9%ED%84%B0

하드 포맷과 시스템 최적화?결정적 순간에 꼭! 필요한
http://book.naver.com/bookdb/book_detail.nhn?bid=4299638

운영체제
경성대학교 양희재
http://www.kocw.net/home/search/kemView.do?kemId=978503&ar=relateCourse

플래시 메모리 구현' 구글 검색
https://www.google.co.kr/search?q=%ED%94%8C%EB%9E%98%EC%8B%9C+%EB%A9%94%EB%AA%A8%EB%A6%AC+%EA%B5%AC%ED%98%84&source=lnms&sa=X&ved=0ahUKEwjMt976yefSAhUFU7wKHUBtAuIQ_AUIBygA&biw=1232&bih=757&dpr=1#spf=1

Sector slipping
https://en.wikipedia.org/wiki/Sector_slipping

Microsoft support policy for 4K sector hard drives in Windows
https://support.microsoft.com/en-us/help/2510009/microsoft-support-policy-for-4k-sector-hard-drives-in-windows

Finding the sector size of a partition
http://unix.stackexchange.com/questions/2668/finding-the-sector-size-of-a-partition

Disk sector
https://en.wikipedia.org/wiki/Disk_sector

disk sector size
https://www.google.co.kr/?gfe_rd=cr&ei=7civWISqNtPEXtfbhaAG&gws_rd=ssl#q=disk+sector+size&*&spf=385

CreateFile ReadFile 등으로 파일다루기
http://egloos.zum.com/striders/v/1071240

하드디스크 배드섹터, 스캔 프로그램
http://sosal.kr/775

메모리 최적화 프로그램 뷰티풀 메모리
http://hwsecter.tistory.com/12

Working with MTD Devices
http://matgimchi.tistory.com/entry/Working-with-MTD-Devices

[Ch.8] 파일 접근 제어
http://g0n4k00.tistory.com/entry/Ch8-%ED%8C%8C%EC%9D%BC-%EC%A0%91%EA%B7%BC-%EC%A0%9C%EC%96%B4

FatFs Module Application Note
http://elm-chan.org/fsw/ff/en/appnote.html
disk_ioctl (GET_SECTOR_SIZE)

섹터 메모리 api
https://www.google.co.kr/search?q=%EC%84%B9%ED%84%B0+%EB%A9%94%EB%AA%A8%EB%A6%AC&tbm=vid&source=lnms&sa=X&ved=0ahUKEwjv1Y-pw-fSAhUEppQKHYODC5oQ_AUICSgC&biw=1232&bih=757&dpr=1#q=%EC%84%B9%ED%84%B0+%EB%A9%94%EB%AA%A8%EB%A6%AC+api&*&spf=495

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

백연구원의 이미지

shint님의 알고리즘은..

1. 본문에서 대표될 만한 단어를 산출 (단어의 빈도수를 기반으로 한 search 인가요?)
2. 해당 단어를 여러 포탈에 검색
3. 검색 결과를 어떠한 기준에 의해 추출
4. 제목/링크 형태로 복&붙
5. 결과적으로 본문과는 엉뚱한 답변이 나옴.

"알고리즘" 관련해서 소스코드가 있나요?
혹시 GitHub 같은 주소 있다면, 제가 요즘 관심이 있는 분야들의 집합체라서 그런데 공유 부탁드립니다.
contribute하고 싶습니다. :-)

같이 더 좋은 알고리즘으로 개선해나가요.


소곤소곤

세벌의 이미지

shint 님 알고리즘에 대해 하나 추가요. 다른 분들이 조언을 해도 안 듣는다.

raymundo의 이미지

애초에 동적할당받은 공간의 크기는 할당받은 쪽에서 알고 있어야 하는 것이고, 사후에 알아내는 표준적인 방법도 없는 걸로 압니다만...

_msize()처럼 컴파일러에서 지원하는 함수를 쓴다쳐도, 자기가 calloc 으로 SECTOR*sizeof(int)*128 만큼을 할당받았는데, 그 할당받은 공간의 크기를 알아내는 함수를 썼더니 SECTOR*sizeof(int)*128 값이 아니라 SECTOR 값만 나오길 바라는 게 온당한 일인가 의문입니다. 어떤 사정이 있어서 SECTOR값을 모르는 쪽에서 알아내야만 한다 해도, _msize의 결과를 미리 정한 값인 sizeof(int)*128 로 나누는 것 이외의 방법이 있을 것 같지도 않고요. 어쩌면 여기 계신 고수님들의 묘수가...?

P.S. 아 제가 잘못 본 부분이 있군요. 원하는 건 SECTOR값이 아니라 sizeof(int)*128 이 부분인가본데...(이게 512니까) 어쨌거나 아랫분 말씀처럼 지금은 원하시는 게 너무 이상하네요.

좋은 하루 되세요!

 의 이미지

무엇을 하고 싶으시다는 건지 이해할 수가 없군요.

_msize(&pmegabyte[0][0])는 사실상 _msize(pmegabyte[0])와 같고, 따라서 앞선 루프에서 pmegabyte[0]calloc으로 할당한 메모리의 크기가 나오게 됩니다. 구체적으로는 SECTOR * sizeof(int) * 128이죠. 이 출력은 질문자님께서 16384라고 밝혀 주셨고요.

프로그램은 작성자가 희망한 대로 돌아가는 게 아니라 작성자가 작성한 대로 돌아가는 법입니다.
그러니 질문자님이 대체 뭘 하고 싶어 하셨는지는 제가 추측해야 하는데, 썩 달가운 상황은 아니로군요.

sizeof(int)는 아마도 4일 테고, 그러면 sizeof(int) * 128는 512, 즉 섹터 크기가 되는군요. 출력값으로부터 역산하면 SECTOR는 32일 것이고, 16384가 한 블럭의 크기라는 점으로 미루어 볼 때 SECTOR이 의미하는 바는 블럭 하나에 들어있는 섹터의 갯수겠네요. 저라면 그런 의미의 상수를 정의할 때 SECTORS_PER_BLOCK 하는 식으로 짓겠습니다만.

여전히 의문이 남습니다.

1) pmegabyte는 2차원 배열을 모사하기 위한 포인터 배열이 들어가는 것으로 보이는데, 왜 sizeof(int*) * 4096의 배수만큼 할당하는 거죠? 제가 잘못 추론한 내용이 있나요? 블럭 하나당 SECTOR, 즉 32개의 섹터가 존재하니 32개의 int * 포인터면 충분할 텐데요.

2) C언어에서 배열은 그 크기가 컴파일 타임에 정해져 있을 때만 사용가능한데, 주어진 코드에서는 실제로 블럭 크기와 섹터 크기가 하드코딩되어 있으므로 2차원 배열을 무난히 사용가능합니다. 물론 그렇게 쓰는 게 썩 직관적인 문법은 아닙니다만 훨씬 깔끔한 바이나리를 생성하죠. 예컨대 뭐 이런 식입니다.

#include <stdio.h>
#include <stdlib.h>
 
int main(void){
    int i, j, k;
    int (*p2darray)[2][2] = (int (*) [2][2])calloc(2, sizeof(int[2][2]));
 
    for(i=0;i<2;i++){
        for(j=0;j<2;j++){
            for(k=0;k<2;k++){
                p2darray[i][j][k] = i*100 + j*10 + k;
            }
        }
    }
    for(i=0;i<2;i++){
        for(j=0;j<2;j++){
            for(k=0;k<2;k++){
                printf("%d\n", p2darray[i][j][k]);
            }
        }
    }
    free(p2darray);
    return 0;
}

3)같은 이치로, 애초에 섹터 크기가 512로 고정되어 있다면 왜 그 값을 _msize 등의 함수로 얻어내려는 건가요? 섹터 크기를 헤더 파일에 상수로 정의하거나 별도의 매개변수로 넘겨주는 게 더 좋은 방법일 텐데요.

제가 질문자님의 의도를 전혀 잘못 파악했을 수도 있지만, 지금 상황에서는 이 정도가 제 최선입니다. 더 좋은 답변을 바라시면 더 많은 정보를 주셔야지요.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.