c언어 동적할당 msize
글쓴이: doobae11 / 작성시간: 화, 2017/03/21 - 7:10오후
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바이트가 나오네요 ㅠㅠ
Forums:
찾아봤습니다.
정확히 뭔지는 모르겠네요.
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님의 알고리즘은..
shint님의 알고리즘은..
1. 본문에서 대표될 만한 단어를 산출 (단어의 빈도수를 기반으로 한 search 인가요?)
2. 해당 단어를 여러 포탈에 검색
3. 검색 결과를 어떠한 기준에 의해 추출
4. 제목/링크 형태로 복&붙
5. 결과적으로 본문과는 엉뚱한 답변이 나옴.
"알고리즘" 관련해서 소스코드가 있나요?
혹시 GitHub 같은 주소 있다면, 제가 요즘 관심이 있는 분야들의 집합체라서 그런데 공유 부탁드립니다.
contribute하고 싶습니다. :-)
같이 더 좋은 알고리즘으로 개선해나가요.
소곤소곤
shint 님 알고리즘에 대해 하나 추가요. 다른
shint 님 알고리즘에 대해 하나 추가요. 다른 분들이 조언을 해도 안 듣는다.
세벌 https://sebuls.blogspot.kr/
애초에 동적할당받은 공간의 크기는 할당받은 쪽에서
애초에 동적할당받은 공간의 크기는 할당받은 쪽에서 알고 있어야 하는 것이고, 사후에 알아내는 표준적인 방법도 없는 걸로 압니다만...
_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차원 배열을 무난히 사용가능합니다. 물론 그렇게 쓰는 게 썩 직관적인 문법은 아닙니다만 훨씬 깔끔한 바이나리를 생성하죠. 예컨대 뭐 이런 식입니다.
3)같은 이치로, 애초에 섹터 크기가 512로 고정되어 있다면 왜 그 값을
_msize
등의 함수로 얻어내려는 건가요? 섹터 크기를 헤더 파일에 상수로 정의하거나 별도의 매개변수로 넘겨주는 게 더 좋은 방법일 텐데요.제가 질문자님의 의도를 전혀 잘못 파악했을 수도 있지만, 지금 상황에서는 이 정도가 제 최선입니다. 더 좋은 답변을 바라시면 더 많은 정보를 주셔야지요.
댓글 달기