driver 파일 만들때 major no 에 대한 질문입니다.

cococo의 이미지

안녕하십니까. 저녁은 잘 보내고 계신지요.
모듈(디바이스 드라이버)파일을 만들어 보려고 하다가, 모르는 부분이 있어서 질문 올립니다.

드라이버 파일을 만든다음, 컴파일 하고, 등록 하잖아요?
근데, 등록하기 전에 mknod로 major / miner 번호를 정한다고 나와 있는데요... 240-255까지는 비어있는 거라서, 테스트 할 때 써도 된다고 나와 있더라구요.l 그래서 쓸라고 하다가, 혹시나 해서
#ls -al /dev/ 해 보니까 , 253번이 이미 사용중이네요?

여기서 질문입니다.
제가 driver.c파일을 만들었다고 했을 때, 설사 240-255 사이의 번호대를 이용한다고 해도, 사용되고 있는지 항상 체크해야 하나요?
글고, 만일 해야 한다면, 이걸 program code로는 어떻게 처리하죠?

참고로, 환경은 Fedora core 4 / kernel 2.6.11 입니다.

그럼, 저녁 맛나게 드시기 바랍니다. 이만 줄입니다.

owlet의 이미지

240-255라고해서 사용되지않는것은 아닙니다. 동적으로 할당하면 마지막 번호부터 할당이되기때문에 충분히 중복될수 있습니다. register_chrdev와 같은 디바이스 등록함수에서 에러리턴하면 major가 이미 사용중이라고 생각하시면 됩니다. 그리고, major는 mknod시에 정해지는것이 아니고 정해진 major로 노드를 만들어야 하는것입니다.

ktd2004의 이미지

제가 정리해 놓은 자료가 있네요..
원본은 Linux Device Driver 2nd 입니다.

동적으로 major number 할당하기
일반적인 device의 major넘버는 정적으로 할당되어 있다.
이러한 device들의 리스트는 Documentation/devices.txt에 존재한다.

사용할 수 있는 major number를 요청하기 위해서 register_chrdev의 major
파라메터의 값을 0으로 줄 수 있다.
이때의 register_chrdev의 반환값이 음수라면 error. 양수라면 동적으로 할당받은
major number를 의미한다.
만약 0을 반환한다면(major number는 아니다) 미리 정의한 major number를 등록하는
성공했음을 의미한다.

동적으로 major number를 할당받게 되었을 경우에 단점은 major number를 모르기
때문에 device node를 생성할 수 없다는 것이다.
이럴 경우에 /proc/devices 파일을 읽음으로써 해당하는 device의 major number를
알 수 있다는 것이다.

동적으로 major number를 할당하고 device node를 생성하는 script~

	#!/bin/sh
	module="scull"
	device="scull"
	mode="664"

	# 스크립트로 전달한 모든 argument를 가지고 insmod를 호출한다.
	/sbin/insmod -f ./$module.o $* || exit 1

	# 기존에 존재하던 node를 제거한다.
	rm -f /dev/${device}[0-3]

	# /proc/devices 파일로 부터 major number를 읽어온다.
	major=`awk "\\$2==\*$module\" {print \\$1}" /proc/devices`
	# sed를 사용한 예제.
	# major=`sed -ne "/$module/s/ *\(.*\) *$module/\1/p" /proc/devices`

	mknod /dev/${device}0 c $major 0
	mknod /dev/${device}1 c $major 1
	mknod /dev/${device}2 c $major 2
	mknod /dev/${device}3 c $major 3

	group="staff"
	grep '^staff:' /etc/group > /dev/null || group="wheel"
	chgrp $group /dev/${device}[0-3]
	chmod $mode /dev/${device}[0-3]

동적으로 major number를 할당받는 device driver 예제~

	result = register_chrdev( scull_major, "scull", &scull_fops);
	if( result < 0)
	{
		printk( KERN_WARNING "scull: can't get major %d\n", scull_major);
		return result;
	}
	if( scull_major == 0)
		scull_major = result;	/* dynamic */
cococo의 이미지

답변 읽고 [현재 시스템에서 안 쓰고 있는 번호] 를 찾는 방법이 필요하다고 생각하고 있었는데... 그사이에 답글을... ㅎㅎ

정말 감사합니다!!
저녁은 맛나게 드셨는지 모르겠네요. :)

덧글 : kernel 2.6으로 판올림 하면서 major 번호가 12bit 까지 쓸 수 있다..고 제가 보는 책에는 써 있는데요. 그럼 255이상의 번호를 할당해도 된다는 소리인가요? 저정도면 대충 중간 값(1024정도?) 할당해도 당분간은 겹치지 않을까...싶은데요. ^^;;

ktd2004의 이미지

예 저녁 맛있게 먹었습니다.

이건 Linux Device Driver 3nd(2.6 커널)에 있는 내용입니다.

커널내부에서는 device 넘버(major와 minor)를 유지하기 위해서 dev_t 타입(<linux/types.h>)을 사용합니다.

이 타입은 2.4 커널에서는 unsighed short(16bits), 2.6 커널에서는 unsigned int(32bits)가 사용되어집니다.

2.4 커널에서는 major가 8bits, minro가 8bits. 따라서 각각 0~255까지 가능합니다.

하지만 2.6 커널에서는 dev_t 타입이 unsigned int(32bits)로 되고 major가 12bits, minor가 20bits. 이렇게 32bits를 사용하게 됩니다.

책에서는 절대로 디바이스 넘버가 16bits 혹은 32bits라고 가정하지 말라고 나와있습니다.

대신에
<linux/kdev_t.h> 파일에 정의되어 있는.

MAJOR(dev_t dev);
MINOR(dev_t dev);
MKDEV( int major, int minor);

이 매크로를 사용하라고 하는 군요..

지금 그냥 보면서 대강 번역한 것이라 틀린것이 있을 수도 있습니다.
자세한 내용은 Linux Device Driver 3nd를 보시면 될 것같습니다....

댓글 달기

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