섹터를 찾는 프로그래밍

t2rhsu의 이미지

리눅스에서 섹터를 찾는 프로그램을 만들려하는데

무엇부터 시작해야 할지 막막 합니다.

섹터의 시작과 끝부분을 찾고 싶습니다.

일단 리눅스에서 하드디스크의 섹터로 어떻해 접근하는지

궁금하고요

섹터를 찾는 프로그램을 어떤 식으로 디자인 해야할까요?

powerson의 이미지


일단, mbr로부터 partition에 대한 정보에 알아보셔야 할 거 같습니다. 그러면, 답이 보이실 거 같습니다. partition정보를 알게 되면, sector가 어디서부터 시작되고, 해당 partition의 용량이 얼마인지 알기 때문에, 당연히 sector의 끝도 알 수 있지요.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

bushi의 이미지

sector 라는 정량적이지 않은 모호한 단위는 정확히 알아보고 사용하셔야 합니다.

원하시는 것이 뭔지 모르겠지만,
/dev/sda 혹은 /dev/sda1 등을 일반 파일처럼 접근하면 됩니다.

400GB 하드디스크에서 테스트해보니

[bushi@rose net]$ cat test.c
#define _XOPEN_SOURCE 500
#define _LARGEFILE64_SOURCE
 
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
 
#define DEV   "/dev/sda"
#define BUFSZ 10
 
int main()
{
        int fp = open(DEV, O_RDONLY | O_LARGEFILE);
        off64_t res; 
        size_t bytes;
        char buf[BUFSZ];
        int expected_pass, expected_fail;
        int unexpected_pass, unexpected_fail;
 
        if (fp < 0) {
                perror(DEV);
                return EXIT_FAILURE;
        }
 
        errno = 0;
        res = lseek64(fp, 0, SEEK_END);
 
        if (errno) {
                perror(DEV);
                close(fp);
                return EXIT_FAILURE;
 
        }
        printf("%llu\n", res);
 
        expected_pass = 0;
        expected_fail = 0;
        unexpected_pass = 0;
        unexpected_fail = 0;
 
        bytes = pread64(fp, &buf[0], BUFSZ, res - (off64_t)BUFSZ);
        if (bytes == sizeof(buf)) {
                expected_pass ++;
        } else {
                unexpected_fail ++;
        }
 
        bytes = pread64(fp, &buf[0], BUFSZ, res - (off64_t)BUFSZ + 1);
        if (bytes != sizeof(buf)) {
                expected_fail ++;
        } else {
                unexpected_pass ++;
        }
 
        close(fp);
 
        fprintf(stderr, "  expected pass: %d/1\n", expected_pass);
        fprintf(stderr, "  expected fail: %d/1\n", expected_fail);
        fprintf(stderr, "unexpected pass: %d/0\n", unexpected_pass);
        fprintf(stderr, "unexpected fail: %d/0\n", unexpected_fail);
 
        if (unexpected_pass || unexpected_fail) {
                return EXIT_FAILURE;
        }
 
        return EXIT_SUCCESS;
}
[bushi@rose net]$ 
[bushi@rose net]$ gcc -s -o test test.c -Wall
[bushi@rose net]$
[bushi@rose net]$ sudo ./test || echo "Failed"
400088457216
  expected pass: 1/1
  expected fail: 1/1
unexpected pass: 0/0
unexpected fail: 0/0
[bushi@rose net]$

한치의 오차도 없이 맞아들어갑니다.

OTL

powerson의 이미지

어떠한 이유로 sector라는 단어가 모호하다는 말씀이신지 이해가 잘 안되는데, 혹시 설명해주실 수 있나요? 혹시 파일시스템에서 사용하는 block 또는 CHS에서 논리적으로 생긴 Cylinder에 대한 개념들에 대해서 약간 혼동하신 건 아닌지 궁금하네요. 일단 sector는 하드디스크에서 한번에 읽어들일 수 있는 크기이며, platter를 sector 단위로 모두 나누기 때문에, 여기서 모호할 거는 제가 보기엔 없어 보입니다.

P.S
아무래도 글이다보니 딴지글로 오해하실 거 같아서 말씀드리는 거지만, 궁금해서 물어보는 것이니 오해 안하셨으면 좋겠네요. ^^ 항상 글을 쓸때는 이러한 부분들로 고심하게 되다보니깐요. ㅎㅎ 그럼 수고하세요.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

bushi의 이미지

physical sector size 는 각 하드디스크에 달린 컨트롤러에 의존적이기 때문에 모호하다고 표현했습니다.

OTL

Necromancer의 이미지

/dev/hda, /dev/sda에 쓰면 그게 하드로 바로 날라갑니다. 읽기쓰기도 바이트 단위로 이루어지고요.
단, 그작업 하는 프로그램은 루트 권한이 필요합니다.

섹터단위로 읽고쓸려면 먼저 ioctl()로 해당 디스크의 sector 크기를 확인하셔야 합니다.
ioctl()에 넘길 인수는 기억이 안나는데 fdisk 소스에 그 사용례가 있습니다. 그다음 sector 크기의 배수로 처리하면 됩니다.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

댓글 달기

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