<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://pimg.daum-img.net/whsnake/css/atom.css?ver=1.0" type="text/css"?>
<feed xmlns="http://www.w3.org/2005/Atom" version="1.0" >
  <title>일상 속의 행복</title>
  <link rel="alternate" type="text/html" href="http://blog.daum.net/baramjin"/>
  <link rel="self" type="application/atom+xml" href="http://blog.daum.net/xml/atom/baramjin"/>
  <rights>바람진</rights>
  <author>
    <name>바람진</name>
    <uri>http://blog.daum.net/baramjin</uri>
  </author>
  <generator uri="http://blog.daum.net" version="1.0">Daum blog (blogmaster@daum.net)</generator>
  <id>tag:blog.daum.net,2009:baramjin</id>
  <updated>2009-11-04T12:53:37Z</updated>

  		<entry>
	    <title>커널 소스 관련...</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/baramjin/16010996"/>
		<id>tag:blog.daum.net,2009:baramjin.16010996</id>
	    <author>
		    <name>바람진</name>
	    </author>
	    <updated>2009-11-04T12:53:37Z</updated>
	    <published>2009-11-04T12:53:37Z</published>
	    <content type="html">
	    	&lt;P&gt;다들 아는 것이겠지만 자주 잊어먹기 때문에 정리한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;리눅스 커널을 받으려면 &lt;A href=&quot;http://www.kernel.org/&quot; target=&quot;_blank&quot;&gt;http://www.kernel.org/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;안드로이드 소스 관리를 보려면 &lt;A href=&quot;http://android.git.kernel.org/&quot; target=&quot;_blank&quot;&gt;http://android.git.kernel.org/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;안드로이드는 당연히 gitweb이다&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;안드로이드의 공식적인 커널을 받으려면 kernel/common.git으로 받으면 된다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;$git clone git://android.git.kernel.org/kernel/common.git&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;default branch는 android-2.6.27 이다.&lt;/P&gt;
&lt;P&gt;Donut 버젼에서 권장하는 branch는 android-2.6.29 이다&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;이를 위해서는 다운로드 받은 상태에서 다음과 같이 한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;$git checkout -b android-2.6.29&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>안드로이드 초기화 (Init 프로세스 코드 분석)</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/baramjin/16010995"/>
		<id>tag:blog.daum.net,2009:baramjin.16010995</id>
	    <author>
		    <name>바람진</name>
	    </author>
	    <updated>2009-10-26T17:53:27Z</updated>
	    <published>2009-10-26T17:53:27Z</published>
	    <content type="html">
	    	&lt;P&gt;안드로이드의 초기화 과정 중 Init 프로세스를 생성하고 init 프로세스가 동작하는 과정에 대하여 정리한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Init 프로세스는 부팅 과정에서 커널이 생성하는 첫번째 프로세스로 PID는 1이다.&lt;/P&gt;
&lt;P&gt;리눅스 커널의 부팅 과정을 보면 알겠지만 다음 과정에서 생성된다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;/kernel/init/main.c 파일을 참조하면 다음과 같은 초기화 과정을 거친다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;start_kernel()&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;rest_init()&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;kernel_init()&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;init_post()&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;init_post()에서 init 프로세스를 생성하는데, 이를 위해서 ramdisk_execute_command를&amp;nbsp;kernel_init()에서 &quot;/init&quot; 으로 설정하고 access 여부를 확인한다. run_init_process()에서는 입력된 파일명을 실행하는 역활만을 한다. &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;static int noinline init_post(void)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; free_initmem();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unlock_kernel();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mark_rodata_ro();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; system_state = SYSTEM_RUNNING;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; numa_default_policy();&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (sys_open((const char __user *) &quot;/dev/console&quot;, O_RDWR, 0) &lt; 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(KERN_WARNING &quot;Warning: unable to open an initial console.\n&quot;);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (void) sys_dup(0);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (void) sys_dup(0);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; current-&gt;signal-&gt;flags |= SIGNAL_UNKILLABLE;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#e31600&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ramdisk_execute_command) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; run_init_process(ramdisk_execute_command);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(KERN_WARNING &quot;Failed to execute %s\n&quot;,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ramdisk_execute_command);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * We try each of these until one succeeds.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * The Bourne shell can be used instead of init if we are&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * trying to recover a really broken machine.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (execute_command) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; run_init_process(execute_command);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(KERN_WARNING &quot;Failed to execute %s.&amp;nbsp; Attempting &quot;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;defaults...\n&quot;, execute_command);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;FONT color=#7293fa&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; run_init_process(&quot;/sbin/init&quot;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; run_init_process(&quot;/etc/init&quot;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; run_init_process(&quot;/bin/init&quot;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; run_init_process(&quot;/bin/sh&quot;);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; panic(&quot;No init found.&amp;nbsp; Try passing init= option to kernel.&quot;);&lt;BR&gt;}&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;이후에 /sbin/init, /etc/init, /bin/init, /bin/sh 를 실행하는 코드가 있는데 안드로이드의 경우 실제 이와 관련된 파일이 없기 때문에 위의 과정으로만 처리가 된다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;안드로이드에서 init 프로세스와 관련된 코드는 /system/core/init/init.c 에 있다. init 프로세스가 하는 중요한 작업 중 하나는 init.rc 파일을 처리하는 것이다. &lt;/P&gt;
&lt;P&gt;안드로이드에서 기본적으로 사용하는 init.rc 파일은 /system/core/rootdir/init.rc 파일이다. /system/core/rootdir/Android.mk 파일을 보면&amp;nbsp;init.rc 파일을 target 디렉토리로 복사하도록 하고 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;init 프로세스의 기본 기능을 다시 한번 정리하면 다음과 같다.&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;1) SIGCHLD signal 처리&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;2) rc 파일 처리 (init.rc 와 init.xxx.rc)&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;3) 디바이스 초기화와 관리&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;4) 기본 property 설정&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;이중 rc 파일 처리를 보면 다음과 같다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;&lt;FONT color=#e31600&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; INFO(&quot;reading config file\n&quot;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; parse_config_file(&quot;/init.rc&quot;);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* pull the kernel commandline and ramdisk properties file in */&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; qemu_init();&lt;BR&gt;&lt;FONT color=#e31600&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; import_kernel_cmdline(0);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; get_hardware_name();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#e31600&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; snprintf(tmp, sizeof(tmp), &quot;/init.%s.rc&quot;, hardware);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; parse_config_file(tmp);&lt;/FONT&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;처음 init.rc 파일을 분석해서 서비스(Service) 리스트와 액션(Action) 리스트를 만든다. &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;다음으로 import_kernel_cmdline()을 호출해서 필요한 내용을 전역 변수에 저장한다. 이를 보면 /proc/cmdline을 읽어와서 이를 분석하여 저장하는데 /proc/cmdline에 저장된 내용은&amp;nbsp;kernel 컴파일시 CONFIG_CMDLINE에 정의한 문자열 (/kernel/.config 파일 참조)이다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;static void import_kernel_cmdline(int in_qemu)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char cmdline[1024];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char *ptr;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int fd;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#e31600&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fd = open(&quot;/proc/cmdline&quot;, O_RDONLY);&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (fd &gt;= 0) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int n = read(fd, cmdline, 1023);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (n &lt; 0) n = 0;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* get rid of trailing newline, it happens */&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (n &gt; 0 &amp;&amp; cmdline[n-1] == '\n') n--;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmdline[n] = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; close(fd);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmdline[0] = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ptr = cmdline;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (ptr &amp;&amp; *ptr) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char *x = strchr(ptr, ' ');&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (x != 0) *x++ = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#e31600&gt;import_kernel_nv(ptr, in_qemu);&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ptr = x;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* don't expose the raw commandline to nonpriv processes */&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; chmod(&quot;/proc/cmdline&quot;, 0440);&lt;BR&gt;}&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;arm의 경우는 CONFIG_CMDLINE으로 정의된 문자열을 /kernel/arch/arm/kernel/setup.c 에서 처리한다.&lt;/P&gt;
&lt;P&gt;하여간에 import_kernel_cmdline()을 보면 /proc/cmdline의 내용을 읽어와서 import_kernel_nv()를 이용해서 전역 변수(console, bootmode, serialno, baseband, carrier, bootloader, hardware)에 저장한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;내 안드로이드 환경에서는 CONFIG_CMDLINE의 문자열은 다음과 같다. androidboot.hardware만 정의하기 때문에 전역 변수 hardware 값만 설정된다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;CONFIG_CMDLINE=&quot;root=/dev/ram rw initrd=0x40600000,0x400000 init=/init console=ttySAC0 mem=200M androidboot.hardware=tcc92xx&quot;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;마지막으로&amp;nbsp;get_hardware_name()을 호출해서 hardware 이름(xxx라고 가정)을 얻어낸 후, init.xxx.rc 파일을 분석해서 역시 서비스 리스트와 액션 리스트를 만든다. init.rc가 안드로이드에서 기본적으로 수행해야할 서비스들을 정리한다고 하면 init.xxx.rc에는 하드웨어 의존적인 초기화 과정을 만들어 두어야 한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;get_hardware_name()을 보면&amp;nbsp;/proc/cpuinfo의 내용을 읽어서 전역 변수 hardware와 revision을 다시 설정하는데 왜 다시 처리하는지는 모르겠다. &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;일단 init,rc와 init.xxx.rc (내 보드에서는 init.tcc92xx.rc)을 분석해서 서비스 리스트와 액션 리스트를 만드는 것은 parse_config_file()이 한다. 이 함수는 /system/core/init/parser.c 에 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;init.rc 파일은 on init 에서 수행해야 하는 액션 리스트와 on boot에서 수행해야 하는 액션 리스트가 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;on init&lt;/P&gt;
&lt;P&gt;sysclktz 0&lt;/P&gt;
&lt;P&gt;loglevel 3&lt;/P&gt;
&lt;P&gt;# setup the global environment&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; export PATH /sbin:/system/sbin:/system/bin:/system/xbin&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; export LD_LIBRARY_PATH /system/lib&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; export ANDROID_BOOTLOGO 1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; export ANDROID_ROOT /system&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; export ANDROID_ASSETS /system/app&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; export ANDROID_DATA /data&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; export EXTERNAL_STORAGE /sdcard&lt;/P&gt;
&lt;P&gt;# Backward compatibility&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; symlink /system/etc /etc&lt;/P&gt;
&lt;P&gt;# create mountpoints and mount tmpfs on sqlite_stmt_journals&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mkdir /sdcard 0000 system system&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mkdir /system&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mkdir /data 0771 system system&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mkdir /cache 0770 system cache&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mkdir /sqlite_stmt_journals 01777 root root&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mount tmpfs tmpfs /sqlite_stmt_journals size=4m&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mount rootfs rootfs / ro remount&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; write /proc/sys/kernel/panic_on_oops 1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; write /proc/sys/kernel/hung_task_timeout_secs 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; write /proc/cpu/alignment 4&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; write /proc/sys/kernel/sched_latency_ns 10000000&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; write /proc/sys/kernel/sched_compat_yield 1&lt;/P&gt;
&lt;P&gt;# Create cgroup mount points for process groups&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mkdir /dev/cpuctl&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mount cgroup none /dev/cpuctl cpu&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; chown system system /dev/cpuctl&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; chown system system /dev/cpuctl/tasks&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; chmod 0777 /dev/cpuctl/tasks&amp;nbsp;&lt;/P&gt;
&lt;P&gt;......&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;# mount mtd partitions&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Mount /system rw first to give the filesystem a chance to save a checkpoint&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mount yaffs2 &lt;A href=&quot;mailto:mtd@system&quot;&gt;mtd@system&lt;/A&gt; /system&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mount yaffs2 &lt;A href=&quot;mailto:mtd@system&quot;&gt;mtd@system&lt;/A&gt; /system ro remount&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;......&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;# create basic filesystem structure&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mkdir /data/misc 01771 system misc&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mkdir /data/misc/hcid 0770 bluetooth bluetooth&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mkdir /data/misc/keystore 0770 keystore keystore&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;on boot&lt;BR&gt;# basic network init&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ifup lo&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hostname localhost&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; domainname localdomain&lt;/P&gt;
&lt;P&gt;# set RLIMIT_NICE to allow priorities from 19 to -20&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setrlimit 13 40 40&lt;/P&gt;
&lt;P&gt;# Define the oom_adj values for the classes of processes that can be&lt;BR&gt;# killed by the kernel.&amp;nbsp; These are used in ActivityManagerService.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop ro.FOREGROUND_APP_ADJ 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop ro.VISIBLE_APP_ADJ 1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop ro.SECONDARY_SERVER_ADJ 2&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop ro.BACKUP_APP_ADJ 2&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop ro.HOME_APP_ADJ 4&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop ro.HIDDEN_APP_MIN_ADJ 7&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop ro.CONTENT_PROVIDER_ADJ 14&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop ro.EMPTY_APP_ADJ 15&lt;/P&gt;
&lt;P&gt;# Define the memory thresholds at which the above process classes will&lt;BR&gt;# be killed.&amp;nbsp; These numbers are in pages (4k).&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop ro.FOREGROUND_APP_MEM 1536&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop ro.VISIBLE_APP_MEM 2048&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop ro.SECONDARY_SERVER_MEM 4096&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop ro.BACKUP_APP_MEM 4096&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop ro.HOME_APP_MEM 4096&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop ro.HIDDEN_APP_MEM 5120&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop ro.CONTENT_PROVIDER_MEM 5632&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop ro.EMPTY_APP_MEM 6144&lt;/P&gt;
&lt;P&gt;# Write value must be consistent with the above properties.&lt;BR&gt;# Note that the driver only supports 6 slots, so we have HOME_APP at the&lt;BR&gt;# same memory level as services.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; write /sys/module/lowmemorykiller/parameters/adj 0,1,2,7,14,15&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; write /proc/sys/vm/overcommit_memory 1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; write /proc/sys/vm/min_free_order_shift 4&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; write /sys/module/lowmemorykiller/parameters/minfree 1536,2048,4096,5120,5632,6144&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Set init its forked children's oom_adj.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; write /proc/1/oom_adj -16&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Permissions for System Server and daemons.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; chown radio system /sys/android_power/state&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; chown radio system /sys/android_power/request_state&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; chown radio system /sys/android_power/acquire_full_wake_lock&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; chown radio system /sys/android_power/acquire_partial_wake_lock&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; chown radio system /sys/android_power/release_wake_lock&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; chown radio system /sys/power/state&lt;BR&gt;......&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;# Define TCP buffer sizes for various networks&lt;BR&gt;#&amp;nbsp;&amp;nbsp; ReadMin, ReadInitial, ReadMax, WriteMin, WriteInitial, WriteMax,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop net.tcp.buffersize.default 4096,87380,110208,4096,16384,110208&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop net.tcp.buffersize.wifi&amp;nbsp;&amp;nbsp;&amp;nbsp; 4095,87380,110208,4096,16384,110208&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop net.tcp.buffersize.umts&amp;nbsp;&amp;nbsp;&amp;nbsp; 4094,87380,110208,4096,16384,110208&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop net.tcp.buffersize.edge&amp;nbsp;&amp;nbsp;&amp;nbsp; 4093,26280,35040,4096,16384,35040&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; setprop net.tcp.buffersize.gprs&amp;nbsp;&amp;nbsp;&amp;nbsp; 4092,8760,11680,4096,8760,11680&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;분석되어 리스트로 만들어진 액션들은 다음 코드들에 의하여 실행된다. (/system/core/init/main.c)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;int main(int argc, char **argv)&lt;BR&gt;{&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; action_for_each_trigger(&quot;early-init&quot;, action_add_queue_tail);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; drain_action_queue();&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;......&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* execute all the boot actions to get us started */&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; action_for_each_trigger(&quot;init&quot;, action_add_queue_tail);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; drain_action_queue();&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;......&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* execute all the boot actions to get us started */&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; action_for_each_trigger(&quot;early-boot&quot;, action_add_queue_tail);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; action_for_each_trigger(&quot;boot&quot;, action_add_queue_tail);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; drain_action_queue();&amp;nbsp;&lt;/P&gt;
&lt;P&gt;}&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;코드를 보면 early-init, init, early-boot, boot 에 따른 액션 리스트를 실행하는데, 안드로이드에서 사용하는&amp;nbsp;init.rc에 early-init과 early-boot가 없기 때문에 init과 boot에 해당하는 액션만 실행된다. &lt;/P&gt;
&lt;P&gt;init은 주로 전역 변수 초기화, 마운트 포인트(mount point) 생성, MTD 파티션 마운트, 기본적인 파일 시스템 구조를 생성하며, &lt;/P&gt;
&lt;P&gt;boot는&amp;nbsp;네트웍을 초기화 하며, 접근 권한 등을 설정하고, APP group의 메모리 사용량을 설정한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;서비스의 경우는 class_start default 로부터 정의된다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class_start default&lt;/P&gt;
&lt;P&gt;## Daemon processes to be run by init.&lt;BR&gt;##&lt;BR&gt;service console /system/bin/sh&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; console&lt;/P&gt;
&lt;P&gt;# adbd is controlled by the persist.service.adb.enable system property&lt;BR&gt;service adbd /sbin/adbd&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&lt;/P&gt;
&lt;P&gt;# adbd on at boot in emulator&lt;BR&gt;on property:ro.kernel.qemu=1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; start adbd&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;......&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#e31600&gt;service servicemanager /system/bin/servicemanager&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; user system&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; critical&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; onrestart restart zygote&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; onrestart restart media&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;서비스들을 정의하는 방법은 다음과 같다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;service &lt;name&gt; &lt;pathname&gt; [&lt;argument&gt;]&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;&lt;option&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;.....&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;&lt;option&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;즉 위의 예를 보면 servicemanager는 /system/bin/servicemanager를 실행해야 하며 user system, critical과 onstart 옵션을 가진다는 것을 알 수 있다. critical은 안드로이드의 운영 정책으로 4번 오류 발생시 reboot한다는 의미라고 한다. onrestart는 해당 서비스가 재시작되면 다음의 서비스를 다시 시작하라는 말이다. 즉 servicemanager가 재시작되면 zygote와 media도 다시 시작해야 한다. &lt;/P&gt;
&lt;P&gt;(/system/core/init/readme.txt 참조)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;서비스 리스트들은 어떻게 시작될까?&lt;/P&gt;
&lt;P&gt;이 부분에 대해서는 다음 포스팅을 일단 참조한다. (&lt;A href=&quot;http://andstudy.springnote.com/pages/3872497&quot; target=_blank&gt;http://andstudy.springnote.com/pages/3872497&lt;/A&gt;)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;일단 init 프로세스가 동작하면 루프를 돌면서 restart_process(0를 호출하는데 여기에서 처리되는 것 같다. 좀 더 정리하면 좋겠지만 다른 일로 나중에 정리한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(;;) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int nr, i, timeout = -1;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i = 0; i &lt; fd_count; i++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ufds[i].revents = 0;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; drain_action_queue();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#e31600&gt;restart_processes();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (process_needs_restart) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; timeout = (process_needs_restart - gettime()) * 1000;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (timeout &lt; 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; timeout = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;#if BOOTCHART&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (bootchart_count &gt; 0) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (timeout &lt; 0 || timeout &gt; BOOTCHART_POLLING_MS)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; timeout = BOOTCHART_POLLING_MS;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (bootchart_step() &lt; 0 || --bootchart_count == 0) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bootchart_finish();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bootchart_count = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;#endif&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nr = poll(ufds, fd_count, timeout);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (nr &lt;= 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#e31600&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ufds[2].revents == POLLIN) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* we got a SIGCHLD - reap and restart as needed */&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; read(signal_recv_fd, tmp, sizeof(tmp));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!wait_for_one_process(0))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ufds[0].revents == POLLIN)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; handle_device_fd(device_fd);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ufds[1].revents == POLLIN)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; handle_property_set_fd(property_set_fd);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ufds[3].revents == POLLIN)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; handle_keychord(keychord_fd);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;init.rc에 의해서 수행되는 서비스는 다음과 같다.&lt;/P&gt;
&lt;P&gt;console, abdb, servicemanager, vold, nexus(?), debuggerd, ril-daemon, zygote, media, bootsound, bootanim, dbus, hcid, hfag, hsag, installd, flash_recovery, racoon, httpd, keystore &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>정적 디바이스 드라이버 초기화 (등록)</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/baramjin/16010994"/>
		<id>tag:blog.daum.net,2009:baramjin.16010994</id>
	    <author>
		    <name>바람진</name>
	    </author>
	    <updated>2009-10-25T19:59:12Z</updated>
	    <published>2009-10-25T19:59:12Z</published>
	    <content type="html">
	    	&lt;P&gt;디바이스 드라이버를 등록하는 과정을 알아보기 위해서는 커널 초기화 과정을 따라갈 필요가 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;사용하는 CPU가 arm인 경우 초기화를 담당하는 어셈블 코드에서 C 코드로의 이동은 &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;/kernel/arch/arm/kernel/head-common.S 파일의 __map_switched 에서 start_kernel()로 분기하면서 리눅스 커널의 초기화 과정이 시작된다.&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;&lt;FONT color=#e31600&gt;__mmap_switched:&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; adr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r3, __switch_data + 4&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ldmia&amp;nbsp;&amp;nbsp; r3!, {r4, r5, r6, r7}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r4, r5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ Copy data segment if needed&lt;BR&gt;1:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmpne&amp;nbsp;&amp;nbsp; r5, r6&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ldrne&amp;nbsp;&amp;nbsp; fp, [r4], #4&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strne&amp;nbsp;&amp;nbsp; fp, [r5], #4&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bne&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1b&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fp, #0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ Clear BSS (and zero fp)&lt;BR&gt;1:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r6, r7&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strcc&amp;nbsp;&amp;nbsp; fp, [r6],#4&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bcc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1b&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ldmia&amp;nbsp;&amp;nbsp; r3, {r4, r5, r6, r7, sp}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r9, [r4]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ Save processor ID&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r1, [r5]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ Save machine type&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r2, [r6]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ Save atags pointer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bic&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r4, r0, #CR_A&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ Clear 'A' bit&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stmia&amp;nbsp;&amp;nbsp; r7, {r0, r4}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ Save control register values&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#e31600&gt;b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; start_kernel&lt;/FONT&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;start_kernel()은 /kernel/init/main.c 에서 선언하고 있으며&amp;nbsp;주로 Hardware와 밀접한 내용들을 초기화 하는 과정을 포함하며 리눅스 커널과 관련된 대부분의 초기화 과정이 여기에서 이루어 진다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;start_kernel()의 제일 마지막은 rest_init()을 호출한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;asmlinkage void __init start_kernel(void)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char * command_line;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; extern struct kernel_param __start___param[], __stop___param[];&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ......&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; acpi_early_init(); /* before LAPIC and SMP init */&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Do the rest non-__init'ed, we're now alive */&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#e31600&gt;rest_init();&lt;/FONT&gt;&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;리눅스 커널이 동작하면 /init 프로세스와 kthreadd 프로세스가 제일 처음 실행되게 되는데 이를 시작하는 것이 rest_init()이다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;img src=&quot;http://cfile227.uf.daum.net/image/117D890C4AE42ABA63AE7E&quot; class=&quot;tx-daum-image&quot; style=&quot;CLEAR: none; FLOAT: none&quot; actualwidth=&quot;753&quot; hspace=&quot;1&quot; width=&quot;753&quot; vspace=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;static void noinline __init_refok rest_init(void)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __releases(kernel_lock)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int pid; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#e31600&gt;kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; numa_default_policy();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#e31600&gt;pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; kthreadd_task = find_task_by_pid_ns(pid, &amp;init_pid_ns);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unlock_kernel();&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * The boot idle thread must execute schedule()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * at least once to get things moving:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; init_idle_bootup_task(current);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; preempt_enable_no_resched();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; schedule();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; preempt_disable();&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Call into cpu_idle with preempt disabled */&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu_idle();&lt;BR&gt;}&lt;/P&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;rest_init()에서 구동되는 kernel_init()&amp;nbsp;에서는 부팅 과정에서 커널이 생성하는 첫번째 프로세스인 /init을 생성하기 직전에 do_basic_setup()을 호출하여 정적인 디바이스 드라이버 파일을 초기화(등록) 하게 된다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;static int __init kernel_init(void * unused)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lock_kernel();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * init can run on any cpu.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set_cpus_allowed_ptr(current, CPU_MASK_ALL_PTR);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Tell the world that we're going to be the grim&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * reaper of innocent orphaned children.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * We don't want people to have to make incorrect&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * assumptions about where in the task array this&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * can be found.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; init_pid_ns.child_reaper = current;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cad_pid = task_pid(current);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; smp_prepare_cpus(setup_max_cpus);&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#e31600&gt; do_pre_smp_initcalls();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; smp_init();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sched_init_smp();&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpuset_init_smp();&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#e31600&gt; do_basic_setup();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * check if there is an early userspace init.&amp;nbsp; If yes, let it do all&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * the work&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#7293fa&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!ramdisk_execute_command)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ramdisk_execute_command = &quot;/init&quot;;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#7293fa&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#7293fa&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) {&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ramdisk_execute_command = NULL;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; prepare_namespace();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Ok, we have completed the initial bootup, and&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * we're essentially up and running. Get rid of the&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * initmem segments and start the user-mode stuff..&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&lt;FONT color=#7293fa&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; init_post();&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;BR&gt;}&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;do_basic_setup()에서 workqueue, driver, irq_proc 등을 호출하고 마지막으로 do_initcalls()를 호출한다. (do_pre_smp_initcalls() 함수고 do_basic_setup() 과 유사한 일을 수행한다)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;static void __init do_basic_setup(void)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rcu_init_sched(); /* needed by module_init stage. */&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* drivers will send hotplug events */&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; init_workqueues();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; usermodehelper_init();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; driver_init();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; init_irq_proc();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#e31600&gt;do_initcalls();&lt;BR&gt;&lt;/FONT&gt;}&lt;BR&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;do_initcalls()은 for 문을 이용해서 do_one_initcall()을 호출하게 된다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;&lt;FONT color=#e31600&gt;extern initcall_t __initcall_start[], __initcall_end[], __early_initcall_end[];&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;static void __init do_initcalls(void)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; initcall_t *call;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#e31600&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (call = __early_initcall_end; call &lt; __initcall_end; call++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do_one_initcall(*call);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Make sure there is no pending stuff from the initcall sequence */&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; flush_scheduled_work();&lt;BR&gt;}&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;static void __init do_pre_smp_initcalls(void)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; initcall_t *call;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#e31600&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (call = __initcall_start; call &lt; __early_initcall_end; call++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do_one_initcall(*call);&lt;/FONT&gt;&lt;BR&gt;}&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;int do_one_initcall(initcall_t fn)&amp;nbsp;&lt;/P&gt;
&lt;P&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int count = preempt_count();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ktime_t t0, t1, delta;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char msgbuf[64];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int result;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (initcall_debug) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(&quot;calling&amp;nbsp; %pF\n&quot;, fn);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; t0 = ktime_get();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#e31600&gt; result = fn();&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ......&amp;nbsp;&lt;/P&gt;
&lt;P&gt;}&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;여기서 보면 __early_initcall_end에서 __initcall_end 사이에 등록된 함수들을 호출하는 것을 알 수 있다.&lt;/P&gt;
&lt;P&gt;이들은 보통 CPU에 따라서 vmlinux.lds.S 파일에 정의되어 있다. arm의 경우를 보면 /kernel/arch/arm/kernel/vmlinux.lds.S 파일에 정의되어 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .init : {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Init code and data&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INIT_TEXT&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _einittext = .;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __proc_info_begin = .;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.proc.info.init)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __proc_info_end = .;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __arch_info_begin = .;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.arch.info.init)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __arch_info_end = .;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __tagtable_begin = .;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.taglist.init)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __tagtable_end = .;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = ALIGN(16);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __setup_start = .;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.init.setup)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __setup_end = .;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __early_begin = .;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.early_param.init)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __early_end = .;&lt;BR&gt;&lt;FONT color=#e31600&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __initcall_start = .;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INITCALLS&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __initcall_end = .;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.....&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;INITCALLS는&amp;nbsp;/kernel/include/asm-generic/vmlinux.lds.h 에 선언되어 있는데 이를 이용하여&amp;nbsp;/kernel/arch/arm/kernel/vmlinux.lds.S 의 내용을 다시 정리하면 다음과 같다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;__initcall_start = .;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.initcallearly.init)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VMLINUX_SYMBOL(__early_initcall_end) = .;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.initcall0.init)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.initcall0s.init)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.initcall1.init)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.initcall1s.init)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.initcall2.init)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.initcall2s.init)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.initcall3.init)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.initcall3s.init)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.initcall4.init)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.initcall4s.init)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.initcall5.init)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.initcall5s.init)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.initcallrootfs.init)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.initcall6.init)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.initcall6s.init)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.initcall7.init)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.initcall7s.init)&lt;/P&gt;
&lt;P&gt;__initcall_end = .;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;이 의미는 특정한 서브 섹션에 함수 포인터를 등록하기 위한 코드이다. 실제로 /kernel/include/linux/init.h 파일을 보면 이를 위한 매크로가 선언되어 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;&lt;FONT color=#e31600&gt;#define __define_initcall(level,fn,id) \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static initcall_t __initcall_##fn##id __used \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __attribute__((__section__(&quot;.initcall&quot; level &quot;.init&quot;))) = fn&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;/*&lt;BR&gt;&amp;nbsp;* Early initcalls run before initializing SMP.&lt;BR&gt;&amp;nbsp;*&lt;BR&gt;&amp;nbsp;* Only for built-in code, not modules.&lt;BR&gt;&amp;nbsp;*/&lt;BR&gt;#define early_initcall(fn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __define_initcall(&quot;early&quot;,fn,early)&lt;/P&gt;
&lt;P&gt;/*&lt;BR&gt;&amp;nbsp;* A &quot;pure&quot; initcall has no dependencies on anything else, and purely&lt;BR&gt;&amp;nbsp;* initializes variables that couldn't be statically initialized.&lt;BR&gt;&amp;nbsp;*&lt;BR&gt;&amp;nbsp;* This only exists for built-in code, not for modules.&lt;BR&gt;&amp;nbsp;*/&lt;BR&gt;#define pure_initcall(fn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __define_initcall(&quot;0&quot;,fn,0)&lt;/P&gt;
&lt;P&gt;#define core_initcall(fn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __define_initcall(&quot;1&quot;,fn,1)&lt;BR&gt;#define core_initcall_sync(fn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __define_initcall(&quot;1s&quot;,fn,1s)&lt;BR&gt;#define postcore_initcall(fn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __define_initcall(&quot;2&quot;,fn,2)&lt;BR&gt;#define postcore_initcall_sync(fn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __define_initcall(&quot;2s&quot;,fn,2s)&lt;BR&gt;&lt;FONT color=#e31600&gt;#define arch_initcall(fn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __define_initcall(&quot;3&quot;,fn,3)&lt;/FONT&gt;&lt;BR&gt;#define arch_initcall_sync(fn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __define_initcall(&quot;3s&quot;,fn,3s)&lt;BR&gt;#define subsys_initcall(fn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __define_initcall(&quot;4&quot;,fn,4)&lt;BR&gt;#define subsys_initcall_sync(fn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __define_initcall(&quot;4s&quot;,fn,4s)&lt;BR&gt;#define fs_initcall(fn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __define_initcall(&quot;5&quot;,fn,5)&lt;BR&gt;#define fs_initcall_sync(fn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __define_initcall(&quot;5s&quot;,fn,5s)&lt;BR&gt;#define rootfs_initcall(fn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __define_initcall(&quot;rootfs&quot;,fn,rootfs)&lt;BR&gt;&lt;FONT color=#e31600&gt;#define device_initcall(fn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __define_initcall(&quot;6&quot;,fn,6)&lt;BR&gt;&lt;/FONT&gt;#define device_initcall_sync(fn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __define_initcall(&quot;6s&quot;,fn,6s)&lt;BR&gt;#define late_initcall(fn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __define_initcall(&quot;7&quot;,fn,7)&lt;BR&gt;#define late_initcall_sync(fn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __define_initcall(&quot;7s&quot;,fn,7s)&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;예를 들어 내가 Board 동작에 필요한 기본적인 드라이버들을 하나의 파일에 정의해서&amp;nbsp;일괄적으로 platform에 등록하는 함수를 만들어 두었다면 커널 초기화에 사용하기 위해서 마지막에 .initcall 섹센에 등록해야 한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;내가 사용하는 TCC92xx 보드의 device.c 파일에 위와 관련된 코드(/kernel/arch/arm/mach-tcc92x/devices.c)가 있다. &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;static int __init tcc9200_init_devices(void)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; platform_add_devices(devices, ARRAY_SIZE(devices));&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#e31600&gt;arch_initcall(tcc9200_init_devices);&lt;/FONT&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;위와 같이 arch_initcall 매크로를 이용해서 tcc9200_init_devices를 .initcall3.init 섹션에 tcc9200_init_device 함수 포인터를 등록하게 된다. 이는 위에서 설명한 것처럼 do_initcalls() 에서 섹션에 등록된 순서대로 호출되게 된다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;다른 예로 보면 arm의 경우 /kernel/arch/arm/kernel/time.c 파일에서 LED 제어와 sysfs를 위한 device를 등록한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;static int __init leds_init(void)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int ret;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = sysdev_class_register(&amp;leds_sysclass);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ret == 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = sysdev_register(&amp;leds_device);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ret == 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = sysdev_create_file(&amp;leds_device, &amp;attr_event);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ret;&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#e31600&gt;device_initcall(leds_init);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;static int __init timer_init_sysfs(void)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int ret = sysdev_class_register(&amp;timer_sysclass);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ret == 0) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; system_timer-&gt;dev.cls = &amp;timer_sysclass;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = sysdev_register(&amp;system_timer-&gt;dev);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ret;&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#e31600&gt;device_initcall(timer_init_sysfs);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;일반적인 디바이스 드라이버의 경우도 각각의 디바이스 드라이버 파일을 마지막에 보면&amp;nbsp;module_init()과 module_exit() 매크로로 커널에 모듈을 적재하고 제거할 때 호출하는 함수를 지정하는 매크로가 있다. 보통 디바이스 드라이버는 정적으로도 커널에 링크시킬 수 있고 모듈 형태로 사용할 수도 있는데 module_init 매크로에 대한 정의를 /kernel/include/linux/init.h 에서 보면 다음과 같이 두가지로 정의한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;MODULE로 정의되지 않은 경우&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;#define device_initcall(fn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __define_initcall(&quot;6&quot;,fn,6)&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;......&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#e31600&gt;#define __initcall(fn) device_initcall(fn)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;......&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;/**&lt;BR&gt;&amp;nbsp;* module_init() - driver initialization entry point&lt;BR&gt;&amp;nbsp;* @x: function to be run at kernel boot time or module insertion&lt;BR&gt;&amp;nbsp;*&lt;BR&gt;&amp;nbsp;* module_init() will either be called during do_initcalls() (if&lt;BR&gt;&amp;nbsp;* builtin) or at module insertion time (if a module).&amp;nbsp; There can only&lt;BR&gt;&amp;nbsp;* be one per module.&lt;BR&gt;&amp;nbsp;*/&lt;BR&gt;&lt;FONT color=#e31600&gt;#define module_init(x)&amp;nbsp; __initcall(x);&lt;/FONT&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;즉 moudle_init 매크로는 디바이스 드라이버를 모듈로 컴파일 하지 않으면 device_initcall에 의해서&amp;nbsp; .initcall7.init 섹션에 등록되어 커널 초기화 과정에서 등록하게 된다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;MODULE로 정의되어 있는 경우는 다음과 같다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;/* Each module must use one module_init(). */&lt;BR&gt;#define module_init(initfn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&lt;FONT color=#e31600&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static inline initcall_t __inittest(void)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { return initfn; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int init_module(void) __attribute__((alias(#initfn)));&lt;/P&gt;
&lt;P&gt;/* This is only required if you want to be unloadable. */&lt;BR&gt;#define module_exit(exitfn)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static inline exitcall_t __exittest(void)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { return exitfn; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void cleanup_module(void) __attribute__((alias(#exitfn)));&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;위의 경우는 __inittest()라는 초기화 함수 포인터를 넘겨주는 static 함수를 만들고 이를 모듈 드라이버 로딩 과정에서 호출할 수 있게 해준다.&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>proc 디렉토리</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/baramjin/16010993"/>
		<id>tag:blog.daum.net,2009:baramjin.16010993</id>
	    <author>
		    <name>바람진</name>
	    </author>
	    <updated>2009-10-24T13:37:48Z</updated>
	    <published>2009-10-24T13:37:48Z</published>
	    <content type="html">
	    	&lt;P&gt;리눅스의 기본적인 디렉토리 구조에 대한 설명은 다음을 참조한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://mnslaboratory.springnote.com/pages/755516&quot; target=_blank&gt;http://mnslaboratory.springnote.com/pages/755516&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;리눅스에서 proc 디렉토리는 시스템의 여러 실시간 정보들이 디렉토리와 파일 형태로 저장되어 있다. 리눅스에서 proc와 dev는 가상 파일 시스템에 위치하는 가상 디렉토리로 실제 물리적인 디스크에 존재하는 것은 아니다.(즉 메모리에 저장된다)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;proc에 대한 내용은 다음을 주로 참조하여 정리하였다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://www.heyjinism.com/open_class/2913&quot; target=_blank&gt;http://www.heyjinism.com/open_class/2913&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/system_programing/proc/GetSMSInfo&quot; target=_blank&gt;http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/system_programing/proc/GetSMSInfo&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;proc 디렉토리로 이동한 후, ls로 내용을 보면 문자로 시작하는 것과 번호로 시작하는 것으로 크게 구분할 수 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;img src=&quot;http://cfile205.uf.daum.net/image/192EEA1A4AE2EE7E89A377&quot; class=&quot;tx-daum-image&quot; style=&quot;CLEAR: none; FLOAT: none&quot; actualwidth=&quot;763&quot; hspace=&quot;1&quot; width=&quot;759&quot; vspace=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;시스템 정보를 확인할 수 있는 것 위주로 정리한다. 파일의 경우 대부분 cat 으로 내용을 확인할 수 있다.&lt;/P&gt;
&lt;P&gt;정리한 내용에서 예로 보여주는 것들은 사용중인 안드로이드 데모 보드에서 나오는 내용이다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/cpuinfo&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;이름 그대로 CPU 정보를 보여준다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;Processor&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : ARMv6-compatible processor rev 6 (v6l)&lt;BR&gt;BogoMIPS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 719.25&lt;BR&gt;Features&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : swp half thumb fastmult vfp edsp java&lt;BR&gt;CPU implementer : 0x41&lt;BR&gt;CPU architecture: 7&lt;BR&gt;CPU variant&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0x0&lt;BR&gt;CPU part&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0xb76&lt;BR&gt;CPU revision&amp;nbsp;&amp;nbsp;&amp;nbsp; : 6&lt;BR&gt;Cache type&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : write-back&lt;BR&gt;Cache clean&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : cp15 c7 ops&lt;BR&gt;Cache lockdown&amp;nbsp; : format C&lt;BR&gt;Cache format&amp;nbsp;&amp;nbsp;&amp;nbsp; : Harvard&lt;BR&gt;I size&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 16384&lt;BR&gt;I assoc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 4&lt;BR&gt;I line length&amp;nbsp;&amp;nbsp; : 32&lt;BR&gt;I sets&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 128&lt;BR&gt;D size&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 16384&lt;BR&gt;D assoc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 4&lt;BR&gt;D line length&amp;nbsp;&amp;nbsp; : 32&lt;BR&gt;D sets&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 128 
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Hardware&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : Telechips TCC9200 Demo Board&lt;BR&gt;Revision&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0000&lt;BR&gt;Serial&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : 0000000000000000&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;BegoMIPS는 MIPS 정보를 보여준다. 즉 현재 CPU는 719.25 MIPS란 의미이며 다 알겠지만 초당 719.25 백만개의 명령어를 실행할 수 있다는 의미이다.&lt;/P&gt;
&lt;P&gt;이 외에도 Cache 메모리와 관련된 정보나 Board 정보도 간단하게 확인이 가능하다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/devices&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;시스템이 사용하는 디바이스 정보를 보여준다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;Character devices:&lt;BR&gt;&amp;nbsp; 1 mem&lt;BR&gt;&amp;nbsp; 4 /dev/vc/0&lt;BR&gt;&amp;nbsp; 4 tty&lt;BR&gt;&amp;nbsp; 5 /dev/tty&lt;BR&gt;&amp;nbsp; 5 /dev/console&lt;BR&gt;&amp;nbsp; 5 /dev/ptmx&lt;BR&gt;&amp;nbsp; 7 vcs&lt;BR&gt;&amp;nbsp;10 misc&lt;BR&gt;&amp;nbsp;13 input&lt;BR&gt;&amp;nbsp;14 sound&lt;BR&gt;&amp;nbsp;29 fb&lt;BR&gt;&amp;nbsp;81 video4linux&lt;BR&gt;&amp;nbsp;89 i2c&lt;BR&gt;&amp;nbsp;90 mtd&lt;BR&gt;108 ppp&lt;BR&gt;116 alsa&lt;BR&gt;128 ptm&lt;BR&gt;136 pts&lt;BR&gt;153 spi&lt;BR&gt;180 usb&lt;BR&gt;189 usb_device&lt;BR&gt;196 vpu&lt;BR&gt;197 tdmb_tuner&lt;BR&gt;198 jpeg&lt;BR&gt;199 graphic&lt;BR&gt;200 scaler&lt;BR&gt;201 scaler1&lt;BR&gt;202 overlay&lt;BR&gt;204 tcc-uart&lt;BR&gt;216 rfcomm&lt;BR&gt;244 bl&lt;BR&gt;246 tcc_intr&lt;BR&gt;251 mali&lt;BR&gt;252 tcc-tsif&lt;BR&gt;253 usbmon&lt;BR&gt;
&lt;P&gt;254 rtc&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Block devices:&lt;BR&gt;&amp;nbsp; 1 ramdisk&lt;BR&gt;&amp;nbsp; 7 loop&lt;BR&gt;&amp;nbsp;31 mtdblock&lt;BR&gt;&amp;nbsp;44 ftl&lt;BR&gt;&amp;nbsp;93 nftl&lt;BR&gt;179 mmc&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;크게 Char형 장치와 Block형 장치로 구분하여 보여줌을 알 수 있다.&lt;/P&gt;
&lt;P&gt;앞에 숫자는 디바이스 드라이버의 Major 넘버이다. 현재 시스템에서 사용하는 디바이스 드라이버들은 /dev 에서 관리하는데 위의 정보와 /dev 정보를 비교해 보면 같다는 것을 알수 있다. (Minor 넘버까지 표시되므로 dev 내용이 더 많기는 하다)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/filesystems&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;커널이 지원하는 파일 시스템의 정보를 보여준다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;nodev&amp;nbsp;&amp;nbsp; sysfs&lt;BR&gt;nodev&amp;nbsp;&amp;nbsp; rootfs&lt;BR&gt;nodev&amp;nbsp;&amp;nbsp; bdev&lt;BR&gt;nodev&amp;nbsp;&amp;nbsp; proc&lt;BR&gt;nodev&amp;nbsp;&amp;nbsp; debugfs&lt;BR&gt;nodev&amp;nbsp;&amp;nbsp; sockfs&lt;BR&gt;nodev&amp;nbsp;&amp;nbsp; pipefs&lt;BR&gt;nodev&amp;nbsp;&amp;nbsp; anon_inodefs&lt;BR&gt;nodev&amp;nbsp;&amp;nbsp; tmpfs&lt;BR&gt;nodev&amp;nbsp;&amp;nbsp; inotifyfs&lt;BR&gt;nodev&amp;nbsp;&amp;nbsp; configfs&lt;BR&gt;nodev&amp;nbsp;&amp;nbsp; devpts&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ext2&lt;BR&gt;nodev&amp;nbsp;&amp;nbsp; ramfs&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vfat&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; yaffs&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; yaffs2&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;STRONG&gt;/proc/dma&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;DMA 채널 정보를 보여준다고 하는데 현재 내 안드로이드 환경에서는 존재하지 않는다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/interrupts&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;인터럽트 정보를 보여준다. 즉 인터럽트 번호에 어떤 인터럽트가 연결되어 있는지를 알 수 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPU0&lt;BR&gt;&amp;nbsp; 1:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 510168&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IRQ&amp;nbsp; TC1_timer&lt;BR&gt;&amp;nbsp;14:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IRQ&amp;nbsp; tsc2003_ts&lt;BR&gt;&amp;nbsp;19:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 292363&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IRQ&amp;nbsp; TCC_LCD&lt;BR&gt;&amp;nbsp;24:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 108&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IRQ&amp;nbsp; Mali 200 (GX525)&lt;BR&gt;&amp;nbsp;25:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 108&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IRQ&amp;nbsp; MALI_GP2&lt;BR&gt;&amp;nbsp;26:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IRQ&amp;nbsp; Mali MMU&lt;BR&gt;&amp;nbsp;34:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IRQ&amp;nbsp; hdmi, cec, spdif&lt;BR&gt;&amp;nbsp;43:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IRQ&amp;nbsp; tcc-rtc&lt;BR&gt;&amp;nbsp;44:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 57&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IRQ&amp;nbsp; TCC_SD_SLOT0&lt;BR&gt;&amp;nbsp;45:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IRQ&amp;nbsp; TCC_SD_SLOT1&lt;BR&gt;&amp;nbsp;48:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IRQ&amp;nbsp; tcc-udc&lt;BR&gt;&amp;nbsp;64:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2836&amp;nbsp;&amp;nbsp;&amp;nbsp; IRQ_UART&amp;nbsp; uart0&lt;BR&gt;&amp;nbsp;71:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp; IRQ_GPSB&amp;nbsp; tsif&lt;BR&gt;Err:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/ioports&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;사용하고 있는 입출력 포트 정보를 보여준다. 현재 내 안드로이드 환경에서는 아무 내용이 없다.&lt;/P&gt;
&lt;P&gt;이는 x86 계열처럼 메모리 공간과 I/O 공간이 분리되어 있는 경우에 볼 수 있는 정보이기 떄문이다.&lt;/P&gt;
&lt;P&gt;현재 CPU가 ARM 계열이기 때문에 내용이 없는 것이다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/iomem&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I/O 장치들이 사용하고 있는 메모리 번지를 보여준다. 68x 계열이나 ARM 계열들은 memory mapped I/O를 지원하기 때문에 이에 대한 정보를 확인할 수 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;00000064-00000064 : tcc-i2c&lt;BR&gt;&amp;nbsp; 00000064-00000064 : tcc-i2c&lt;BR&gt;40000000-4c7fffff : System RAM&lt;BR&gt;&amp;nbsp; 40120000-4045bfff : Kernel text&lt;BR&gt;&amp;nbsp; 4045c000-40520da5 : Kernel data&lt;BR&gt;4dc00000-4fbfffff : Mali_SDRAM remapped to baseboard&lt;BR&gt;f0000000-f00010ef : Mali 200 (GX525)&lt;BR&gt;f0002000-f0002097 : MALI_GP2&lt;BR&gt;f0003000-f0003023 : Mali MMU&lt;BR&gt;f0102000-f0102030 : tcc-keypad&lt;BR&gt;f0405000-f0405040 : tcc-i2c&lt;BR&gt;f0530000-f05300c0 : tcc-tsc2003-ts&lt;BR&gt;&amp;nbsp; f0530000-f0530040 : tcc-i2c&lt;BR&gt;f0532000-f05320ff : tcc9200-uart.0&lt;BR&gt;f0532100-f05321ff : tcc9200-uart.1&lt;BR&gt;f0532200-f05322ff : tcc9200-uart.2&lt;BR&gt;f0532300-f05323ff : tcc9200-uart.3&lt;BR&gt;f0532400-f05324ff : tcc9200-uart.4&lt;BR&gt;f0532500-f05325ff : tcc9200-uart.5&lt;BR&gt;f0550000-f0550100 : tcc-udc.0&lt;BR&gt;f05a0000-f05a00ff : tcc-mmc0.0&lt;BR&gt;f05a0200-f05a02ff : tcc-mmc1.1&lt;BR&gt;f05f2000-f05f20ff : tcc-rtc&lt;BR&gt;f05f4000-f05f404c : tcc9200-adc.0&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/kcore&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;커널 메모리 이미지를 보여준다고 하는데 현재 내 안드로이드 환경에서는 존재하지 않는다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/kmsg&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;커널이 동작 중 중요한 이벤트가 생기면 출력되는 메시지를 보여준다. 보통 커널에서 printk를 사용해서 콘솔에 출력하도록 한 메시지를 말한다. 이런 메시지를 확인하는 명령으로 dmesg가 있다. 원래 dmesg를 실행하면 /var/log/dmesg 의 내용을 보여준다고 하는데 내 안드로이드 환경에서는 이 파일이 존재하지 않는다. 내용을 확인해 보면 dmegs 명령을 실행한 경우와 /proc/kmsg 를 출력한 경우와 같다. 따라서 이 부분은 커널 버젼에 따라서 달라진 것으로 보인다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/ksyms&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/kallsyms&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;모듈이 참조할 수 있는 커널 내부의 함수나 변수의 심볼 정보를 가지고 있다. 이는 모듈&amp;nbsp;개념을 지원하기 위한 중요한 정보이다. 일반적으로 linux에서는 /proc/ksyms가 심볼 정보를 가지고 있다고 하나 안드로이드에서는 /proc/kallsysms를 사용한다(정확하게는 커널 버젼에 따라 다른 이름을 사용하는 것 같다). 내용을 보면 다음처럼 보여진다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;......&lt;/P&gt;
&lt;P&gt;c0378f78 T tcp6_proc_exit&lt;BR&gt;c0378f94 t tcp6_seq_show&lt;BR&gt;c0379468 T tcp6_proc_init&lt;BR&gt;c0379484 T ipv6_find_tlv&lt;BR&gt;c037951c T ipv6_fixup_options&lt;BR&gt;c0379590 T ipv6_dup_options&lt;BR&gt;c037960c t ipv6_renew_option&lt;BR&gt;c0379704 T ipv6_renew_options&lt;BR&gt;c0379978 t ipv6_push_exthdr&lt;BR&gt;c03799c8 T ipv6_push_frag_opts&lt;BR&gt;c03799f0 T ipv6_push_nfrag_opts&lt;BR&gt;c0379acc t ipv6_hop_ra&lt;BR&gt;c0379b3c t ip6_parse_tlv&lt;BR&gt;c0379c8c t ipv6_hop_jumbo&lt;BR&gt;c0379e9c T ipv6_parse_hopopts&lt;BR&gt;c0379f74 T ipv6_exthdrs_exit&lt;BR&gt;c0379fb4 t ipv6_rthdr_rcv&lt;BR&gt;c037a1d4 t ipv6_destopt_rcv&lt;/P&gt;
&lt;P&gt;.......&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;앞에 있는 것은 주소값이고 뒤에 있는 것이 심볼명이다. &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/loadavg&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;시스템의 평균 부하를 보여준다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;1.01 0.29 0.10 1/135 794&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/meminfo&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;시스템의 메모리 정보를 보여준다. 주메모리의 크기나 사용량, 가상 메모리, 동적으로 할당된 메모리의 크기 등을 알 수 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;MemTotal:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 198864 kB&lt;BR&gt;MemFree:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 101548 kB&lt;BR&gt;Buffers:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 64 kB&lt;BR&gt;Cached:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 53608 kB&lt;BR&gt;SwapCached:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 kB&lt;BR&gt;Active:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 47724 kB&lt;BR&gt;Inactive:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 34868 kB&lt;BR&gt;SwapTotal:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 kB&lt;BR&gt;SwapFree:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 kB&lt;BR&gt;Dirty:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 kB&lt;BR&gt;Writeback:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 kB&lt;BR&gt;AnonPages:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 28932 kB&lt;BR&gt;Mapped:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 24592 kB&lt;BR&gt;Slab:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3116 kB&lt;BR&gt;SReclaimable:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 944 kB&lt;BR&gt;SUnreclaim:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2172 kB&lt;BR&gt;PageTables:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2688 kB&lt;BR&gt;NFS_Unstable:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 kB&lt;BR&gt;Bounce:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 kB&lt;BR&gt;WritebackTmp:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 kB&lt;BR&gt;CommitLimit:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 99432 kB&lt;BR&gt;Committed_AS:&amp;nbsp;&amp;nbsp; 725592 kB&lt;BR&gt;VmallocTotal:&amp;nbsp;&amp;nbsp; 311296 kB&lt;BR&gt;VmallocUsed:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 24784 kB&lt;BR&gt;VmallocChunk:&amp;nbsp;&amp;nbsp; 270332 kB&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/modules&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;현재 커널에 적재된 모듈 정보를 보여준다. 우리가 lsmod 명령으로 확인하는 내용과 같다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;mali 68644 0 - Live 0xbf00e000&lt;BR&gt;hpd 4152 0 - Live 0xbf00b000&lt;BR&gt;audio 5804 0 - Live 0xbf008000 (P)&lt;BR&gt;cec 4420 0 - Live 0xbf005000&lt;BR&gt;hdmidrv 12540 0 - Live 0xbf000000 (P)&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/net&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;네트워크 프로토콜에 대한 정보를 가지고 있다. 이는&amp;nbsp;디렉토리에 대한 심볼릭 링크이며&amp;nbsp;self/net와&amp;nbsp;연결되어 있다.&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;# ls -l net&lt;BR&gt;lrwxrwxrwx root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2009-09-03 18:47 net -&gt; self/net&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;하여간에 net로 이동해서 보면 커널이 지원하는 각종 프로토콜의 현재 상황에 대한 정보를 가진 파일들을 확인할 수 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 packet&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 ip6_flowlabel&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 rt6_stats&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 ipv6_route&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 if_inet6&lt;BR&gt;dr-xr-xr-x root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2009-09-03 18:48 dev_snmp6&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 snmp6&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 sockstat6&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 udplite6&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 raw6&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 mcfilter6&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 igmp6&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 anycast6&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 tcp6&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 udp6&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 unix&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 snmp&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 netstat&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 sockstat&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 udp&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 tcp&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 raw&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 udplite&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 rt_cache&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 route&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 arp&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 dev_mcast&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 wireless&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 ptype&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 softnet_stat&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 dev&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 protocols&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 18:48 netlink&lt;BR&gt;dr-xr-xr-x root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2009-09-03 18:48 netfilter&lt;BR&gt;dr-xr-xr-x root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2009-09-03 18:48 stat&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;위의 정보는 크게 ipv6를 위한 정보와 일반 정보로 분류할 수 있다.&lt;/P&gt;
&lt;P&gt;ipv6와 관련된 정보를 보면 다음과 같다.&lt;/P&gt;
&lt;UL style=&quot;LIST-STYLE-TYPE: disc&quot;&gt;
&lt;LI&gt;udp6 : UDP 소켓 리스트&lt;/LI&gt;
&lt;LI&gt;tcp6 : TCP 소켓 리스트&lt;/LI&gt;
&lt;LI&gt;raw6 : RAW 디바이스 상태&lt;/LI&gt;
&lt;LI&gt;igmp6 : IP 멀티캐스트 주소&lt;/LI&gt;
&lt;LI&gt;if_inet6 : IPv6 인터페이스 주소 목록&lt;/LI&gt;
&lt;LI&gt;ipv6_route : IPv6를 위한 커널 라우팅 테이블&lt;/LI&gt;
&lt;LI&gt;ipv6_stats : Global IPv6 라우팅 테이블&lt;/LI&gt;
&lt;LI&gt;sockstat6 : IPv6 소켓 상태&lt;/LI&gt;
&lt;LI&gt;snmp6 : IPv6 snmp 데이타&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;일반 네트웍 정보는 다음과 같다.&amp;nbsp;&lt;/P&gt;
&lt;UL style=&quot;LIST-STYLE-TYPE: disc&quot;&gt;
&lt;LI&gt;arp : arp 테이블 (arp 명령으로 확인할 때 이용된다)&lt;/LI&gt;
&lt;LI&gt;dev : 네트웍 디바이스 상태 (ifconfig 명령에서 사용)&lt;/LI&gt;
&lt;LI&gt;ip_fwchains : 방화벽 chain 룰&lt;/LI&gt;
&lt;LI&gt;ip_fwnames : 방화벽 chain 이름&lt;/LI&gt;
&lt;LI&gt;netstat : 네트웍 통계&lt;/LI&gt;
&lt;LI&gt;raw : raw 디바이스 통계&lt;/LI&gt;
&lt;LI&gt;route : 라우팅 테이블 정보 (route 명령에서 사용)&lt;/LI&gt;
&lt;LI&gt;rpc : rpc 정보 디렉토리&lt;/LI&gt;
&lt;LI&gt;rt_cache : 라우팅 캐쉬&lt;/LI&gt;
&lt;LI&gt;snmp : SNMP 데이타&lt;/LI&gt;
&lt;LI&gt;socket : 소켓 통계&lt;/LI&gt;
&lt;LI&gt;tcp : tcp 소켓&lt;/LI&gt;
&lt;LI&gt;tr_rif : Token Ring RIF 라우팅 테이블&lt;/LI&gt;
&lt;LI&gt;udp : udp 소켓&lt;/LI&gt;
&lt;LI&gt;unix : Unix 도메인 소켓&lt;/LI&gt;
&lt;LI&gt;wireless : Wireless 인터페이스 데이타&lt;/LI&gt;
&lt;LI&gt;igmp : IP 멀티캐스트 주소&lt;/LI&gt;
&lt;LI&gt;psched : Global Packet Scheduler Parameter&lt;/LI&gt;
&lt;LI&gt;netlink : PF_NETLINK 소켓 리스트&lt;/LI&gt;
&lt;LI&gt;ip_mr_vifs : Multicast Virtual Interface 리스트&lt;/LI&gt;
&lt;LI&gt;ip_mr_cache : Multicast Routing Cache 리스트&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;STRONG&gt;/proc/self&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;현재 /proc 디렉토리를 이용하는 프로세스 ID에 실볼릭 링크된 정보를 보여준다고 한다. 정확한 의미는 모르겠지만 ls로 확인해 보면 다음과 같다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;# ls -l self&lt;BR&gt;lrwxrwxrwx root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2009-09-03 18:39 self -&gt; 816&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;뒤의 PID는 수행할 때 마다 매번 달라진다. 이 부분에 대해서는 좀 더 확인해 봐야 겠다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/stat&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;커널과 시스템의 정보를 보여준다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;cpu&amp;nbsp; 2438 87 1912 86221 0 17 10 0 0&lt;BR&gt;cpu0 2438 87 1912 86221 0 17 10 0 0&lt;BR&gt;intr 183506 0 90685 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 91814 0 1 0 0 108 108 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 743 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0&lt;BR&gt;ctxt 145002&lt;BR&gt;btime 1252003168&lt;BR&gt;processes 820&lt;BR&gt;procs_running 3&lt;BR&gt;procs_blocked 0&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/sys&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;커널이 사용중인 커널 변수 정보를 가지고 있는 디렉토리이다. 크게 다음 디렉토리로 다시 구분되어 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;# ls -l&lt;BR&gt;dr-xr-xr-x root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2009-09-03 18:39 kernel&lt;BR&gt;dr-xr-xr-x root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2009-09-03 18:39 vm&lt;BR&gt;dr-xr-xr-x root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2009-09-03 18:55 fs&lt;BR&gt;dr-xr-xr-x root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2009-09-03 18:55 debug&lt;BR&gt;dr-xr-xr-x root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2009-09-03 18:55 dev&lt;BR&gt;dr-xr-xr-x root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2009-09-03 18:55 net&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;각각의 디렉토리로 이동하면 커널이 사용하는 각각의 변수 값이 파일 처럼 존재하는 것을 확인할 수 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/uptime&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;시스템의 가동시간을 보여준다. 이로부터 가동시간, 사용인원, 평균 시스템 부하등의 정보를 볼 수 있다고 한다(이는 uptime 명령을 사용하는 경우를 말한다). 실제로 보면 2개의 시간 정보가 보여지는데 이것으로 어떻게 저런 내용을 확인할 수 있는지 잘 모르겠다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;1309.05 1258.23&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;uptime 명령으로 확인하면 다음과 같다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;19:04:36 up 25 min, load average: 0.05, 0.44, 0.45&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/version&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;커널 버젼 정보를 보여준다. 커널 버젼, 작업자, gcc 버젼, 생성 날짜 등의 정보를 확인할 수 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;Linux version 2.6.27 (&lt;A href=&quot;mailto:B040017@sys2and-desktop&quot;&gt;B040017@sys2and-desktop&lt;/A&gt;) (gcc version 4.3.1 (GCC) ) #4 Thu Oct 22 22:08:58 KST 2009&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/pci&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/scsi&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;시스템에 있는 PCI와 SCSI 디바이스들의 정보를 보여준다. 당연히 현재 사용하는 안드로이드 환경에서 지원하지 않기 때문에&amp;nbsp;존재하지 않는다. PC에서 확인해 봐도 보이지 않는다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/proc/번호&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;번호는 디렉토리이다. 이 번호는 PID(Process ID)를 의미한다. 보통 터미널에서 ps 명령어를 치면 보여지는 내용을 만들 때 이 번호 디렉토리의 내용을 이용한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;img src=&quot;http://cfile238.uf.daum.net/image/1819C7174AE294F87E9058&quot; class=&quot;tx-daum-image&quot; style=&quot;CLEAR: none; FLOAT: none&quot; actualwidth=&quot;763&quot; hspace=&quot;1&quot; width=&quot;759&quot; vspace=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;임의의 번호로 이동하면 다음과 같은 구조로 되어 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;dr-xr-xr-x app_0&amp;nbsp;&amp;nbsp;&amp;nbsp; app_0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2009-09-03 19:12 task&lt;BR&gt;dr-x------ root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2009-09-03 19:12 fd&lt;BR&gt;dr-x------ root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2009-09-03 19:12 fdinfo&lt;BR&gt;dr-xr-xr-x app_0&amp;nbsp;&amp;nbsp;&amp;nbsp; app_0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2009-09-03 19:12 net&lt;BR&gt;-r-------- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:12 environ&lt;BR&gt;-r-------- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:12 auxv&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:12 status&lt;BR&gt;-r-------- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:12 limits&lt;BR&gt;-rw-r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:12 sched&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:08 cmdline&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:08 stat&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:12 statm&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:12 maps&lt;BR&gt;-rw------- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:12 mem&lt;BR&gt;lrwxrwxrwx root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2009-09-03 19:12 cwd -&gt; /&lt;BR&gt;lrwxrwxrwx root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2009-09-03 19:12 root -&gt; /&lt;BR&gt;lrwxrwxrwx root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2009-09-03 19:12 exe -&gt; /system/bin/app_process&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:12 mounts&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:12 mountinfo&lt;BR&gt;-r-------- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:12 mountstats&lt;BR&gt;--w------- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:12 clear_refs&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:12 smaps&lt;BR&gt;-r-------- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:12 pagemap&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:12 wchan&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:12 schedstat&lt;BR&gt;-r--r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:12 oom_score&lt;BR&gt;-rw-r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:07 oom_adj&lt;BR&gt;-rw-r--r-- root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; root&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 2009-09-03 19:12 coredump_filter&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;간단히 내용을 정리하면 다음과 같다.&amp;nbsp;&lt;/P&gt;
&lt;UL style=&quot;LIST-STYLE-TYPE: disc&quot;&gt;
&lt;LI&gt;&lt;SPAN&gt;cmdline : 프로세스를 실행한 명령어를 모두 보여준다.&lt;/SPAN&gt; &lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt;environ : 이 프로세스가 참조하는 환경변수 정보를 갖고 있다.&lt;/SPAN&gt; &lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt;fd : 프로세스가 참조하는 파일 목록 정보, 파일명이 0 부터 시작되어 링크된 파일을 확인한다.&lt;/SPAN&gt; &lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt;maps : 현재 프로세스가 사용하고 있는 메모리 구역 정보인데 주로 보면 lib가 로딩된 메모리 위치를 확인할 수 있다.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt;stat, statm, status : 프로세스의 상태 정보들을 담고 있다. stat는 프로세스의 상태를 statm은 프로세스의 메모리 상태, status는 사람이 보기 편한 형태로 프로세스의 상태를 나타낸다.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt;&lt;SPAN&gt;mem : 프로세스가 억세스 하는 메모리&lt;/SPAN&gt; (?)&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt;&lt;SPAN&gt;root : 프로세스의 루트 디렉토리&lt;/SPAN&gt;&amp;nbsp; (심볼릭 링크)&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt;&lt;SPAN&gt;cwd : 프로세스의 작업 디렉토리&lt;/SPAN&gt;&amp;nbsp; (심볼릭 링크)&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt;&lt;SPAN&gt;exe : 이 프로세스를 실행한 바이너리&amp;nbsp;&lt;/SPAN&gt;(심볼릭 링크)&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>DNS (Domain Name Service)</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/baramjin/16010992"/>
		<id>tag:blog.daum.net,2009:baramjin.16010992</id>
	    <author>
		    <name>바람진</name>
	    </author>
	    <updated>2009-10-20T14:21:15Z</updated>
	    <published>2009-10-20T14:21:15Z</published>
	    <content type="html">
	    	&lt;P&gt;만약 다음과 같이 도메인 이름으로 ping을 하면 당연한 얘기지만 DNS에 접속해서 해당 이름에 대한 IP와 MAC Address를 얻어온다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;img src=&quot;http://cfile233.uf.daum.net/image/1703D8254ADD48C60228BF&quot; class=&quot;tx-daum-image&quot; style=&quot;CLEAR: none; FLOAT: none&quot; actualwidth=&quot;753&quot; hspace=&quot;1&quot; width=&quot;753&quot; vspace=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;이에 대한 응답은 &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;img src=&quot;http://cfile214.uf.daum.net/image/1850AA284ADD49611824D2&quot; class=&quot;tx-daum-image&quot; style=&quot;CLEAR: none; FLOAT: none&quot; actualwidth=&quot;763&quot; hspace=&quot;1&quot; width=&quot;759&quot; vspace=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>네트워크 디바이스 드라이버 동작 테스트</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/baramjin/16010991"/>
		<id>tag:blog.daum.net,2009:baramjin.16010991</id>
	    <author>
		    <name>바람진</name>
	    </author>
	    <updated>2009-10-18T21:23:00Z</updated>
	    <published>2009-10-18T21:23:00Z</published>
	    <content type="html">
	    	&lt;P&gt;여러가지 방법이 있겠지만 가장 간단한 방법은 패킷 분석기를 이용하는 것이다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;1. 네트웍크 설정&lt;/P&gt;
&lt;P&gt;먼저 여러 장치들이 연결된 곳에서 테스트를 하면 전송되는 패킷이 너무 많으므로 PC와 1:1로 붙인다&lt;/P&gt;
&lt;P&gt;이 경우 PC의 IP는 테스트 보드의 Gateway가 되고 테스트 보드의 IP는 PC의 Gateway가 된다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;2. WireShark를 실행 시키고 Capture상태로 놓는다.&lt;/P&gt;
&lt;P&gt;3. 테스트 보드의 콘솔에서 Ping을 실행한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;보통 ARP와 ICMP 패킷이 정상적으로 왔다 가는지를 확인하면 된다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>ICMP (Internet Control Message Protocol) 와 Ping</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/baramjin/16010990"/>
		<id>tag:blog.daum.net,2009:baramjin.16010990</id>
	    <author>
		    <name>바람진</name>
	    </author>
	    <updated>2009-10-18T12:58:15Z</updated>
	    <published>2009-10-18T12:58:15Z</published>
	    <content type="html">
	    	&lt;P&gt;ICMP(Internet Control Message Protocol)는 IP의 에러 메시지나 제어 메시지를 전송하기 위한 프로토콜이다. 이는 Connection이 없어도 사용되는 프로토콜이며 주로 Ping이 주로 사용한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;ICMP가 전송되기 위해서는 LLC + IP + ICMP 로 이루어진 패킷을 전송하게 된다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;img src=&quot;http://cfile223.uf.daum.net/image/143763174ADA8E1D2B1AD9&quot; class=&quot;tx-daum-image&quot; style=&quot;CLEAR: none; FLOAT: none&quot; actualwidth=&quot;753&quot; hspace=&quot;1&quot; width=&quot;753&quot; vspace=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;먼저 LLC를 보면 Type 은 0x0800이 된다 (ARP의 경우는 0x0806)&lt;/P&gt;
&lt;P&gt;IP 부분은 잠시 잊고 ICMP 쪽만 보면 &lt;/P&gt;
&lt;P&gt;Type (1Byte) &lt;/P&gt;
&lt;P&gt;Code (1Byte)&lt;/P&gt;
&lt;P&gt;Checksum (2Byte)&lt;/P&gt;
&lt;P&gt;Data (4Byte : Identifier + Sequence number)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;이 후 32Byte의 데이터가 추가되는데 여기서 보면 a~z 까지의 값을 나열한 특별한 의미 없는 데이터이다. &lt;/P&gt;
&lt;P&gt;IP DataGram에서 전송될 데이터를 40Byte로 하고 있기 때문에 ICMP를 위한 8Byte외의 32Byte를 채워넣어 둔 것이다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;보통 Ping의 경우는 Code를 0으로 사용하고 이 경우에 Type의 의미는&amp;nbsp;다음과 같이 정의되어 있다.&lt;/P&gt;
&lt;P&gt;8 : Echo Request&lt;/P&gt;
&lt;P&gt;0 : Echo Reply&lt;/P&gt;
&lt;P&gt;3 : Destination Unreachable&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;내용을 보면 알겠지만 ICMP 자체는 Control Message가 어떤 종류인지 정도만을 나타낸다.&lt;/P&gt;
&lt;P&gt;실제 보내는 주소와 관련된 내용은 MAC 정보는 LLC에 IP 주소 정보는 IP에 존재한다. (당연한 얘기죠)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;IP DataGram에서 주의해서 볼 내용은 ICMP를 전송하는 경우이므로 Protocol 을 보면 0x01로 ICMP임을 나타내고 있다. 이 값은 TCP인 경우는 6이고 UDP인 경우는 17이다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>ARP(Address Resolution Protocol)</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/baramjin/16010989"/>
		<id>tag:blog.daum.net,2009:baramjin.16010989</id>
	    <author>
		    <name>바람진</name>
	    </author>
	    <updated>2009-10-17T16:32:12Z</updated>
	    <published>2009-10-17T16:32:12Z</published>
	    <content type="html">
	    	&lt;P&gt;ARP (Address Resolution Protocol)&lt;/P&gt;
&lt;P&gt;IP가 패킷을 라우팅할 떄, 물리적 통신을 당담하는 네트워크 어댑터 카드가 인식할 수 있는 하드웨어 어드레스(즉 MAC Address)가 필요하다. IP는 이 MAC Address를 알아 내야만 통신을 할 수가 있다. IP가 통신을 원하는 호스트의 MAC Address를 요청하면 APR는 ARP Cache를 찾아서 관련 정보가 있는지 찾고 없으면 IP Address를 가지고 MAX Addreess를 찾기 위하여 ARP 요청 프레임을 만들고 이것을 네트워크에 broadcast 한다. &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;네트워크에 연결된 여러 호스트가 받은 후, IP Address와 일치하는 IP를 가진 호스트가 응답을 하게 되고 나머지는 이를 버린다. &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;실제 ARP를 보면&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;img src=&quot;http://cfile204.uf.daum.net/image/11369D1C4AD970987311AC&quot; class=&quot;tx-daum-image&quot; style=&quot;CLEAR: none; FLOAT: none&quot; actualwidth=&quot;753&quot; hspace=&quot;1&quot; width=&quot;753&quot; vspace=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;위의 내용을 보면 총 60Byte를 캡쳐했는데 실제 ARP와 관련된 것은 42Byte이고 나머지는 0으로 패딩되어 있다.&lt;/P&gt;
&lt;P&gt;처음 14Byte는 Ethernet II 정보 즉 Destination MAC(6bye), Source MAC(6byte) 그리고 Type(2bye)이며 Type값이 0x0806으로 ARP임을 나타낸다. &lt;/P&gt;
&lt;P&gt;실제&amp;nbsp; ARP 프로토콜은 28Byte(8+10+10)로 &lt;/P&gt;
&lt;P&gt;Hardware Type : 2byte&lt;/P&gt;
&lt;P&gt;Protocol Type : 2Byte&lt;/P&gt;
&lt;P&gt;Hardware Size : 1Byte (보통 항상 6으로 MAC 어드레스의 크기를 나타낸다)&lt;/P&gt;
&lt;P&gt;Protocol Size : 1Byte (보통 항상 4로 IP 어드레스의 크기를 나타낸다)&lt;/P&gt;
&lt;P&gt;Opcode : 2Byte&lt;/P&gt;
&lt;P&gt;Sender MAC + IP : 10Byte&lt;/P&gt;
&lt;P&gt;Target MAC + IP : 10Byte&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;즉 이 내용은 192.168.1.28을 IP로 갖는 쪽에서 192.168.1.6 을 찾고 있는 것이다.&lt;/P&gt;
&lt;P&gt;OpCode의 값은 0x0001로 되어 있다. 이는 Request이기 때문이다. 만약 이러한 요청에 대한 응답을 하게 되는 경우라면 OpCode는 0x0002가 되고 그 이후에 보내지는 Sender MAX + IP 와 Target MAC + IP의 값이 모두 채워져서 전송되게 된다. &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;ARP 패킷을 보내기 전에 ARP Cache를 찾아서 기본에 접속해서 IP에 대한 MAC 어드레스가 있는지 확인한다고 했는데 Windows나 Linux 코두 arp utility를 제공한다. 이를 실행하면 현재 ARP Cache의 내용을 확인할 수 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;$arp -a&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>네트워크 패킷 분석툴</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/baramjin/16010988"/>
		<id>tag:blog.daum.net,2009:baramjin.16010988</id>
	    <author>
		    <name>바람진</name>
	    </author>
	    <updated>2009-10-17T14:43:57Z</updated>
	    <published>2009-10-17T14:43:57Z</published>
	    <content type="html">
	    	&lt;P&gt;패킷 분석기로 유명한 툴로 Ethereal 이란 것이 있습니다.&lt;/P&gt;
&lt;P&gt;Ethereal을 사용하기 위해서는 윈도우에서 프로토콜을 캡쳐하는 WinPcap 드라이버와 Dll이 필요합니다. 관련 홈페이지는 &lt;A href=&quot;http://www.ethereal.com/&quot; target=_blank&gt;http://www.ethereal.com&lt;/A&gt; 과 &lt;A href=&quot;http://winpcap.polito.it/&quot; target=_blank&gt;http://winpcap.polito.it&lt;/A&gt; 입니다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;다운받아서 설치하려고 하니 Ethereal이 설치가 잘 안되는 것 같습니다. 확인해보니&amp;nbsp;최근에는 Ethereal 이란 이름 대신 wireshark란 것으로 이름이 바뀌어서 제공한다고 합니다.(&lt;A href=&quot;http://www.wireshark.org/&quot; target=_blank&gt;&lt;U&gt;http://www.wireshark.org/&lt;/U&gt;&lt;/A&gt;&amp;nbsp;) 다운 받아서 확인해 보니 WinPcap도 자동으로 설치해 주고 정상적으로 잘 동작합니다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;기본적인 실행 방법은 다음과 같습니다.&lt;/P&gt;
&lt;P&gt;첫 실행 화면입니다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;img src=&quot;http://cfile209.uf.daum.net/image/1858D7294AD958EA61A646&quot; class=&quot;tx-daum-image&quot; style=&quot;CLEAR: none; FLOAT: none&quot; actualwidth=&quot;753&quot; hspace=&quot;1&quot; width=&quot;753&quot; vspace=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;패킷을 캡쳐하기 위해서는 [Capture]-[Interface]를 선택합니다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;img src=&quot;http://cfile229.uf.daum.net/image/1958D7294AD958EA62C5B8&quot; class=&quot;tx-daum-image&quot; style=&quot;CLEAR: none; FLOAT: none&quot; actualwidth=&quot;753&quot; hspace=&quot;1&quot; width=&quot;753&quot; vspace=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;현재 컴퓨터에 설치된 Interface를 보여줍니다.&amp;nbsp; 이중 패킷을 캡쳐하려는 장치를 확인 후 [Start] 버튼을 누릅니다. [Option] 버튼을 이용하여 패킷 캡쳐할때 필터링 등을 설정할 수 있습니다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;img src=&quot;http://cfile235.uf.daum.net/image/2058D7294AD958EA63C227&quot; class=&quot;tx-daum-image&quot; style=&quot;CLEAR: none; FLOAT: none&quot; actualwidth=&quot;753&quot; hspace=&quot;1&quot; width=&quot;753&quot; vspace=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;현재 들어오는 패킷을 분석해서 보여줍니다. 보고 싶은 패킷을 선택하면 자세한 데이터 내용을 확인할 수 있습니다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;img src=&quot;http://cfile234.uf.daum.net/image/1258D7294AD958EB648A9D&quot; class=&quot;tx-daum-image&quot; style=&quot;CLEAR: none; FLOAT: none&quot; actualwidth=&quot;753&quot; hspace=&quot;1&quot; width=&quot;753&quot; vspace=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;패킷 캡쳐를 멈추고 싶으면 다시 [Capture]-[Stop]을 선택합니다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;img src=&quot;http://cfile219.uf.daum.net/image/1358D7294AD958EB65AB4E&quot; class=&quot;tx-daum-image&quot; style=&quot;CLEAR: none; FLOAT: none&quot; actualwidth=&quot;753&quot; hspace=&quot;1&quot; width=&quot;753&quot; vspace=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>Ethernet 사용하기</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/baramjin/16010987"/>
		<id>tag:blog.daum.net,2009:baramjin.16010987</id>
	    <author>
		    <name>바람진</name>
	    </author>
	    <updated>2009-10-17T09:34:22Z</updated>
	    <published>2009-10-17T09:34:22Z</published>
	    <content type="html">
	    	&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;안드로이드는 기본적으로 WIFI를 지원한다. Ethernet을 사용하기 위해서는 아주 많은 작업은 필요없다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;이유는 리눅스가 기본적으로 Ethernet을 지원하기 때문이다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;단 커널 컴파일은 다시 해야 한다. &lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;Make menuconfig 해서 Network support로 들어가서 Networking options의 설정을 확인해야 한다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;img src=&quot;http://cfile224.uf.daum.net/image/14232F1E4AD90ED36401F6&quot; class=&quot;tx-daum-image&quot; style=&quot;CLEAR: none; FLOAT: none&quot; actualwidth=&quot;640&quot; hspace=&quot;1&quot; width=&quot;640&quot; vspace=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;기본적으로 WIFI만 지원하는 경우 아래와 같이 설정되어 있을 수도 있다. &lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;img src=&quot;http://cfile204.uf.daum.net/image/15232F1E4AD90ED365DFFA&quot; class=&quot;tx-daum-image&quot; style=&quot;CLEAR: none; FLOAT: none&quot; actualwidth=&quot;640&quot; hspace=&quot;1&quot; width=&quot;640&quot; vspace=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;Ethernet을 사용하기 위해서는 다음과 같이 수정한다.&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;img src=&quot;http://cfile211.uf.daum.net/image/1777791C4AD90FFC3FE060&quot; class=&quot;tx-daum-image&quot; style=&quot;CLEAR: none; FLOAT: none&quot; actualwidth=&quot;640&quot; hspace=&quot;1&quot; width=&quot;640&quot; vspace=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;Ethernet&amp;nbsp;Device Driver도 설정해 주어야 한다. &lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;IMG class=txc-image style=&quot;CLEAR: none; FLOAT: none&quot; hspace=1 src=&quot;http://cfile234.uf.daum.net/image/1775141C4ACFE04A52347B&quot; width=639 vspace=1 border=0 actualwidth=&quot;639&quot;&gt;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;사용하려는 Device Driver가 이미 있다는 가정하에서&amp;nbsp;DM9000을 선택한다.&amp;nbsp;DM9000을 선택할 때 모듈 타입과 커널에 정적으로 결합되도록 선택할 수 있다. 테스트 과정에서는 디바이스 드라이버를 계속 변경할 수도 있으므로 모듈 타입으로 하는 것이 좋다. 또 예전에는 정적으로 결합하도록 디바이스 드라이버를 만들었고 이 경우 관련 디바이스 드라이버를 probe 할 수 있게 코드를 수정해 주어야 한다. 하지만 최근에는 모듈 타입으로 해서 매크로에 의해 probe 하는 것이 더 많이 사용되는 것 같다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;IMG class=txc-image style=&quot;CLEAR: none; FLOAT: none&quot; hspace=1 src=&quot;http://cfile223.uf.daum.net/image/1875141C4ACFE04A5397F4&quot; width=639 vspace=1 border=0 actualwidth=&quot;639&quot;&gt;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;부팅 후에&amp;nbsp;네트웍 설정을 맞추는 작업이 필요하다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;일단 테스트를 위하여 Ethernet Device Driver는 SD Card에 저장해 둔다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;기본적으로 있는 네트웍&amp;nbsp;유틸리티는 정상적으로 동작하지 않는 경우도 있는 것 같다. busybox에 있는 것을 사용하는 것이 좋을 것 같으며 작업을 편리하게 하기 위하여 link를 걸어둔다. &lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;$busybox ash&lt;/P&gt;
&lt;P&gt;$ln -s system/bin/busybox ifconfig&lt;/P&gt;
&lt;P&gt;$ln -s system/bin/busybox route&lt;/P&gt;
&lt;P&gt;$ln -s system/bin/busybox arp&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;디바이스 드라이버 파일을 Load한다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;$insmod dm9000.ko&lt;/DIV&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;디바이스 드라이버가 정상적으로 Load 되었는지는 lsmod로 확인이 가능하고 Unload는 rmmod로 한다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;디바이스 드라이버가 정상적으로&amp;nbsp;Load 되었는지를 확인하는 다른 방법은 &amp;nbsp;ifconfig를 이용하는 것이다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;$./ifconfig -a&lt;/DIV&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;위의 명령은 전체 Ethernet 드라이버의 상태를 보겠다는 것이다. 디바이스 드라이버가 Load 되어 있지 않다면 루프백 장치(논리적인 장치)인 lo만 보일 것이다. 만약 정상적으로 Load되었으면 eth0과 lo가 보일 것이다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;eth0이 보이는 지 확인한 후 네트웍 환경을 설정한다. (만약 테스트하는 환경에서 IP가 192.168.21.33이고 Gateway가 192.168.21.254라고 하면)&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;$./ifconfig eth0 down&lt;/P&gt;
&lt;P&gt;$./ifconfig eth0 hw ether 00:12:34:56:78:19&amp;nbsp;&lt;/P&gt;
&lt;P&gt;$,/ifconfig&amp;nbsp;eth0 192.168.21.33&amp;nbsp;up&lt;/P&gt;
&lt;P&gt;$./route add default gw 192.168.21.254 eth0&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;위에서 eth0으로 잡힌 장치의 MAC 어드레스를 00:12:34:56:78:19로 잡아주는 과정이 필요한 경우도 있고 아닌 경우도 있다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;만약 고립된 네트워크에서 혼자 테스트하는 경우라면 MAC 어드레스는 디바이스 드라이버에 Default로 써넣어준 값을 이용할 수도 있다. 그러나 여러 디바이스가 연결된 경우에는 같은 MAC 어드레스를 이용하면 충돌이 나서 정상적인 테스트를 할 수 없다. &lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;이 경우 디바이스 드라이버에서 특별한 ID 에 따라서 MAC 어드레스를 자동으로 변경 가능하는 코드를 넣을 수도 있지만 위와 같이 ifconfig로 수정하는 것도 하나의 방법이다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;위에까지 정상적으로 되었다면 ping을 이용해서 동작 테스트를 할 수 있다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;$ping 192.168.21.254&lt;/P&gt;&lt;/DIV&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;만약 문제가 있다면 ARP 패킷으로 MAC 어드레스 받아오는 부분부터 문제가 생길 것이다. 정상적으로 ARP 패킷 수신했는지는 arp 명령어로 확인한다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;당연한 얘기지만 Web Browser를 사용하기 위해서는 DNS 설정이 필요하다. WIFI 모듈을 사용하는 경우에 DHCPCD에 의해서 DNS 정보를 얻어올 수 있지만 현재는 테스트하는 과정이므로 강제로 DNS 값을 설정한다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;$setprop net.dns1 192.168.1.36&lt;/P&gt;&lt;/DIV&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;setprop와 getprop는 다른쪽에서 설명하였지만 안드로이드에서 내부 환경 변수 등을 설정하거나 얻어올 수 있다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;net.dns1 의 값을 설정해주면 이후는 별 문제없이 동작한다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>네트워크 드라이버</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/baramjin/16010986"/>
		<id>tag:blog.daum.net,2009:baramjin.16010986</id>
	    <author>
		    <name>바람진</name>
	    </author>
	    <updated>2009-10-16T10:58:36Z</updated>
	    <published>2009-10-16T10:58:36Z</published>
	    <content type="html">
	    	&lt;P&gt;리눅스에서 네트워크 드라이버(특히 Ethernet 드라이버)를 사용하기 위해서는 커널 설정에서 다음 세 항목 CONFIG_NET, CONFIG_NETDEVICE. CONFIG_NET_ETHERNET이 선택되어 있어야 한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;리눅스는 네트워크 드라이버를 char/block 드라이버 다른 별도의 드라이버로 구현한다.&lt;/P&gt;
&lt;P&gt;net_device 구조체를 이용하여 네트워크 장치에 필요한 모든 정보를 관리하며 이는 include/linux/netdevice.h에 정의되어 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;net_device 구조체는 register_netdev() 함수를 이용하여 등록하고 unregister_netdev()에 의하여 해제된다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;static &amp;nbsp;struct net_device dev;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;static int init_module(void)&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;register_netdev(&amp;dev);&amp;nbsp;&lt;/P&gt;
&lt;P&gt;}&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;static void cleanup_module(void)&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;unregister_netdev(&amp;dev);&amp;nbsp;&lt;/P&gt;
&lt;P&gt;}&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>리눅스 커널 버젼 관리</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/baramjin/16010985"/>
		<id>tag:blog.daum.net,2009:baramjin.16010985</id>
	    <author>
		    <name>바람진</name>
	    </author>
	    <updated>2009-10-13T14:08:49Z</updated>
	    <published>2009-10-13T14:08:49Z</published>
	    <content type="html">
	    	&lt;P&gt;리눅스의 디바이스 드라이버를 만들다 보면 커널 버젼에 따라서 수정할 내용이 발생한다.&lt;/P&gt;
&lt;P&gt;이를 위해서 보통 다음과 같이 feature 작업을 하게 된다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;#if LINUX_VERSION_CODE &gt;= KERNEL_VERSION(2, 4, 28)&lt;/P&gt;
&lt;P&gt;...&lt;/P&gt;
&lt;P&gt;#endif&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;실제 커널의 버젼과 KERNEL_VESION 매크로는&amp;nbsp;kernel\include\linux\vesion.h 에서 관리한다.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;#define LINUX_VERSION_CODE 132635&lt;BR&gt;#define KERNEL_VERSION(a,b,c) (((a) &lt;&lt; 16) + ((b) &lt;&lt; 8) + (c))&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;커널 버젼이 132635 는 2.6.1B 이다&amp;nbsp; 즉 2.6.17 버젼이다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>네트워크 설정 관련</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/baramjin/16010984"/>
		<id>tag:blog.daum.net,2009:baramjin.16010984</id>
	    <author>
		    <name>바람진</name>
	    </author>
	    <updated>2009-10-12T20:20:03Z</updated>
	    <published>2009-10-12T20:20:03Z</published>
	    <content type="html">
	    	&lt;P&gt;임베디드 리눅스에서 네트워크 설정 관련한 내용이다.&lt;/P&gt;
&lt;P&gt;임베디드 리눅스의 경우 ifconfig 나 route 등의 유틸리티가 기본적으로 없고 busybox에 묶여 있는 경우도 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;이를 위해서 다음과 같이 link를 건다. (아래의 예제는 타겟 시스템이 안드로이드인 경우이고 system/bin 디렉토리 안에 유틸리티가 있다)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;$ln -s system/bin/busybox ifconfig&lt;/P&gt;
&lt;P&gt;$ln -s system/bin/busybox route&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;이후 ifconfig나 route를 사용할 때는 다음과 같이 사용한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;$./ifconfig&lt;/P&gt;
&lt;P&gt;$./route&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;insmod로 네트워크 디바이스 드라이버(예로 dm9000.ko)를 올려주는 경우에는 다음과 같이 한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;$insmod dm9000.ko&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;ifconfig로 eth0이 잡혀있는지 확인하고 사용할 IP 주소를 설정해 준다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;$./ifconfig -a &lt;/P&gt;
&lt;P&gt;$,/ifconfig eth0 down&lt;/P&gt;
&lt;P&gt;$./ifconfig eth0 192.168.xxx.xxx up&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;netmask와 broadcast를 따로 설정해 줄수도 있지만 보통은 IP address만 설정해 주면 되낟.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;설정된 정보를 확인하면 다음과 같다.&lt;/P&gt;
&lt;P&gt;$ ./ifconfig&lt;BR&gt;eth0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Link encap:Ethernet&amp;nbsp; HWaddr 00:12:34:56:78:00&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#e31600&gt;inet addr:192.168.xxx.yyy&amp;nbsp; Bcast:192.168.xxx.255&amp;nbsp; Mask:255.255.255.0&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inet6 addr: fe80::212:34ff:fe56:7800/64 Scope:Link&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UP BROADCAST RUNNING MULTICAST&amp;nbsp; MTU:1500&amp;nbsp; Metric:1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RX packets:0 errors:0 dropped:0 overruns:0 frame:0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TX packets:9 errors:0 dropped:0 overruns:0 carrier:0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; collisions:0 txqueuelen:1000&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#e31600&gt;RX bytes:0 (0.0 B)&amp;nbsp; TX bytes:706 (706.0 B)&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Interrupt:7 Base address:0xe30&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;lo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Link encap:Local Loopback&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inet addr:127.0.0.1&amp;nbsp; Mask:255.0.0.0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inet6 addr: ::1/128 Scope:Host&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UP LOOPBACK RUNNING&amp;nbsp; MTU:16436&amp;nbsp; Metric:1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RX packets:40 errors:0 dropped:0 overruns:0 frame:0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TX packets:40 errors:0 dropped:0 overruns:0 carrier:0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; collisions:0 txqueuelen:0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RX bytes:4480 (4.3 KiB)&amp;nbsp; TX bytes:4480 (4.3 KiB)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;RX bytes 와 TX bytes 를 확인하면 현재 리눅스가 받아들인 데이터의 양과 외부로 전송한 데이터의 양을 알 수 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;gateway를 설정해 준다. 현재 설정된 gateway 정보를 보려면 다음과 같다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;$./route&lt;/P&gt;
&lt;P&gt;Kernel IP routing table&lt;BR&gt;Destination&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Gateway&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Genmask&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Flags Metric Ref&amp;nbsp;&amp;nbsp;&amp;nbsp; Use Iface&lt;BR&gt;192.168.21.0&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 255.255.255.0&amp;nbsp;&amp;nbsp; U&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 eth0&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;gateway는 다음과 같이 설정한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;$./route add default gw 192.168.xxx.yyy dev eth0&lt;/P&gt;
&lt;P&gt;$./route&lt;/P&gt;
&lt;P&gt;Kernel IP routing table&lt;BR&gt;Destination&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Gateway&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Genmask&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Flags Metric Ref&amp;nbsp;&amp;nbsp;&amp;nbsp; Use Iface&lt;BR&gt;192.168.21.0&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 255.255.255.0&amp;nbsp;&amp;nbsp; U&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 eth0&lt;BR&gt;default&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 192.168.21.254&amp;nbsp; 0.0.0.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UG&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 eth0&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;이 외 네트워크 관련하여 사용하는 유틸리티는 netstat이 있다.&lt;/P&gt;
&lt;P&gt;이는 설정하고는 관계없고 현재 연결되었거나 연결될 목록을 보여준다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;$netstat&lt;/P&gt;
&lt;P&gt;Proto Recv-Q Send-Q Local Address&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Foreign Address&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; State&lt;BR&gt;tcp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 127.0.0.1:5037&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.0.0.0:*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LISTEN&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Proto : 현재 사용한 프로토콜&lt;/P&gt;
&lt;P&gt;Local Address : 현재 열려 있는 사용자 컴퓨터의 IP(호스트 네임) 과 사용중인 포트&lt;/P&gt;
&lt;P&gt;Foreign Address : 현재 접속되어 있는 IP(호스트 네임)과 사용중인 포트&lt;/P&gt;
&lt;P&gt;State : 연결 상태&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;ESTABLISHED : 현재 연결되어 있음&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;LISTEN&amp;nbsp;: 연결을 위하여 접속을 기다림&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;TIME_WAIT : 연결 종료되었거나 다음 연결을 위하여 기다리는 상태&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;SYS_SENT : 접속하기 위해 패킷을 보냈음&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;DNS 설정 관련해서는 /etc/resolv.conf 파일이 있어야 한다.&lt;/P&gt;
&lt;P&gt;사용할 DNS 서버 주소를 설정하는 파일이다. &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;파일 내용을 보면 다음과 같다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;# Generated by NetworkManager&lt;/P&gt;
&lt;P&gt;nameserver 168.126.xxx.xxx&lt;/P&gt;
&lt;P&gt;nameserver 168.126.xxx.yyy&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;resolv.conf가 있으면 dns를 사용하기 위하여 libnss_dns-2.x.so가 필요하며 보통 link로 같이 존재해야 한다.&lt;/P&gt;
&lt;P&gt;link가 없으면 다음과 같이 정의해 둔다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;$ln -s libnss_dns-2.x.so libnss_dns.so.2&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>dmesg</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/baramjin/16010983"/>
		<id>tag:blog.daum.net,2009:baramjin.16010983</id>
	    <author>
		    <name>바람진</name>
	    </author>
	    <updated>2009-10-11T11:34:17Z</updated>
	    <published>2009-10-11T11:34:17Z</published>
	    <content type="html">
	    	&lt;P&gt;dmesg 명령은 커널 ring 버퍼를 조사하거나 제어하는데 사용된다.&lt;/P&gt;
&lt;P&gt;/var/log/dmesg는 부팅하는 동안 커널의 기록을 남겨 놓은 파일이다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;로그를 파일로 저장하고 싶으면 &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;$dmesg &gt; 파일명&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;메시지 내용을 보여주고 ring 버퍼 내용을 모두 비우고 싶으면&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;$dmesg -c&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;만약 로그 중에 특정한 내용을 찾고 싶으면 &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;$dmesg|grep &quot;찾을 내용&quot;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>안드로이드 WIFI 설정 </title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/baramjin/16010982"/>
		<id>tag:blog.daum.net,2009:baramjin.16010982</id>
	    <author>
		    <name>바람진</name>
	    </author>
	    <updated>2009-10-10T10:17:38Z</updated>
	    <published>2009-10-10T10:17:38Z</published>
	    <content type="html">
	    	&lt;P&gt;안드로이드 WIFI 설정 관련해서 참고할만한 사이트 이다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://www.aesop.or.kr/?document_srl=67446&amp;mid=board_android_platform&quot;&gt;http://www.aesop.or.kr/?document_srl=67446&amp;mid=board_android_platform&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://www.aesop.or.kr/?document_srl=55406&quot; target=_blank&gt;http://www.aesop.or.kr/?document_srl=55406&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://www.aesop.or.kr/?document_srl=49038&amp;mid=board_android_platform&quot;&gt;http://www.aesop.or.kr/?document_srl=49038&amp;mid=board_android_platform&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;먼저 커널에서 Network 관련해서 설정해 줘야 한다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;네트웍트 설정 관련해서는 다음과 같다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;img src=&quot;http://cfile213.uf.daum.net/image/1675141C4ACFE0494D729C&quot; class=&quot;tx-daum-image&quot; style=&quot;CLEAR: none; FLOAT: none&quot; actualwidth=&quot;639&quot; hspace=&quot;1&quot; width=&quot;639&quot; vspace=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;img src=&quot;http://cfile209.uf.daum.net/image/1775141C4ACFE0494E0A6C&quot; class=&quot;tx-daum-image&quot; style=&quot;CLEAR: none; FLOAT: none&quot; actualwidth=&quot;639&quot; hspace=&quot;1&quot; width=&quot;639&quot; vspace=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;설정을 보면 wireless extension을 설정한다. 이와 관련된 내용은 다음을 참조한다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&lt;A href=&quot;http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html&quot; target=_blank&gt;http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html&lt;/A&gt;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;네트웍트 디바이스 드라이버 설정은 다음과 같다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;img src=&quot;http://cfile206.uf.daum.net/image/1875141C4ACFE0494FAD02&quot; class=&quot;tx-daum-image&quot; style=&quot;CLEAR: none; FLOAT: none&quot; actualwidth=&quot;640&quot; hspace=&quot;1&quot; width=&quot;640&quot; vspace=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;img src=&quot;http://cfile213.uf.daum.net/image/1775141C4ACFE0495093CA&quot; class=&quot;tx-daum-image&quot; style=&quot;CLEAR: none; FLOAT: none&quot; actualwidth=&quot;640&quot; hspace=&quot;1&quot; width=&quot;640&quot; vspace=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;img src=&quot;http://cfile202.uf.daum.net/image/1675141C4ACFE04A51AF30&quot; class=&quot;tx-daum-image&quot; style=&quot;CLEAR: none; FLOAT: none&quot; actualwidth=&quot;639&quot; hspace=&quot;1&quot; width=&quot;639&quot; vspace=&quot;1&quot; border=&quot;0&quot; /&gt;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;위의 글을 참고하면 안드로이드 WIFI의 경우 모듈 로딩을 기본으로 하게 되어 있다고 한다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;실제로 ATHEROS 모듈 적용한 경우도 보니 모듈 로딩을 하도록 한 것을 보았다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;위의 글에서는 Marvel 드라이버를 사용하는 경우인데 커널에 Built In 하도록 하고 있다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;이유는 안드로이드의 경우 모듈을 하나만 로딩해야 되는데 모듈을 두개 로딩할 필요가 있어서 편하게 작업한 것으로 보인다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;(SDIO 타입의 WIFI 모듈의 경우 SDIO 디바이스 드라이버 모듈을 로드하고 WIFI 디바이스 드라이버 모듈을 로드해야 한다.)&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;관련 내용은 hardware/libhardware_legacy/wifi.c 참조&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;int wifi_load_driver()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char driver_status[PROPERTY_VALUE_MAX];&lt;BR&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int count = 100; /* wait at most 20 seconds for completion */&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (check_driver_loaded()) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#e31600&gt;if (insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG) &lt; 0)&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (strcmp(FIRMWARE_LOADER,&quot;&quot;) == 0) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; usleep(500000);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; property_set(DRIVER_PROP_NAME, &quot;ok&quot;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; property_set(&quot;ctl.start&quot;, FIRMWARE_LOADER);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sched_yield();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (count-- &gt; 0) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (property_get(DRIVER_PROP_NAME, driver_status, NULL)) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (strcmp(driver_status, &quot;ok&quot;) == 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (strcmp(DRIVER_PROP_NAME, &quot;failed&quot;) == 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; usleep(200000);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; property_set(DRIVER_PROP_NAME, &quot;timeout&quot;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;int wifi_unload_driver()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int count = 20; /* wait at most 10 seconds for completion */&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#e31600&gt;if (rmmod(DRIVER_MODULE_NAME) == 0) {&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;while (count-- &gt; 0) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!check_driver_loaded())&lt;BR&gt;&amp;nbsp;&amp;nbsp;break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; usleep(500000);&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;if (count) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;return -1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;BR&gt;}&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;/DIV&gt;
&lt;P style=&quot;TEXT-ALIGN: center&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;실제로 2개의 모듈을 로드해야 된다면 수정 사항은 다음과 같을 것이다.&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;int wifi_load_driver()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char driver_status[PROPERTY_VALUE_MAX];&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int count = 100; /* wait at most 20 seconds for completion */&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (check_driver_loaded()) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 새로 추가&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#e31600&gt;if (insmod(DRIVER_MODULE_PATH1, DRIVER_MODULE_ARG) &lt; 0)&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#e31600&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#e31600&gt;if (insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG) &lt; 0)&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ......&amp;nbsp;&lt;/P&gt;
&lt;P&gt;}&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;int wifi_unload_driver()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int count = 20; /* wait at most 10 seconds for completion */&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 새로&amp;nbsp;추가&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#e31600&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (rmmod(DRIVER_MODULE_NAME1) != 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -;1&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#e31600&gt;if (rmmod(DRIVER_MODULE_NAME) == 0) {&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;......&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;&lt;/DIV&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;구글에서 제공하는 wifi.c 에서 좀더 수정할 내용이 있는데 wifi.c 파일을 보면 초기에 Path, Name 등을 정의해 둔 곳이 있다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;#ifndef WIFI_DRIVER_MODULE_PATH&lt;BR&gt;&lt;FONT color=#e31600&gt;#define WIFI_DRIVER_MODULE_PATH&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;/system/lib/modules/wlan.ko&quot;&lt;/FONT&gt;&lt;BR&gt;#endif&lt;BR&gt;#ifndef WIFI_DRIVER_MODULE_NAME&lt;BR&gt;&lt;FONT color=#e31600&gt;#define WIFI_DRIVER_MODULE_NAME&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;wlan&quot;&lt;/FONT&gt;&lt;BR&gt;#endif&lt;BR&gt;#ifndef WIFI_DRIVER_MODULE_ARG&lt;BR&gt;&lt;FONT color=#e31600&gt;#define WIFI_DRIVER_MODULE_ARG&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;&quot;&lt;/FONT&gt;&lt;BR&gt;#endif&lt;BR&gt;#ifndef WIFI_FIRMWARE_LOADER&lt;BR&gt;&lt;FONT color=#e31600&gt;#define WIFI_FIRMWARE_LOADER&amp;nbsp;&amp;nbsp;&quot;&quot;&lt;/FONT&gt;&lt;BR&gt;#endif&lt;BR&gt;#define WIFI_TEST_INTERFACE&amp;nbsp;&amp;nbsp;&quot;sta&quot;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;static const char IFACE_DIR[]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = &quot;/data/system/wpa_supplicant&quot;;&lt;BR&gt;static const char DRIVER_MODULE_NAME[]&amp;nbsp; = WIFI_DRIVER_MODULE_NAME;&lt;BR&gt;static const char DRIVER_MODULE_TAG[]&amp;nbsp;&amp;nbsp; = WIFI_DRIVER_MODULE_NAME &quot; &quot;;&lt;BR&gt;static const char DRIVER_MODULE_PATH[]&amp;nbsp; = WIFI_DRIVER_MODULE_PATH;&lt;BR&gt;static const char DRIVER_MODULE_ARG[]&amp;nbsp;&amp;nbsp; = WIFI_DRIVER_MODULE_ARG;&lt;BR&gt;static const char FIRMWARE_LOADER[]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = WIFI_FIRMWARE_LOADER;&lt;BR&gt;static const char DRIVER_PROP_NAME[]&amp;nbsp;&amp;nbsp;&amp;nbsp; = &quot;wlan.driver.status&quot;;&lt;BR&gt;static const char SUPPLICANT_NAME[]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = &quot;wpa_supplicant&quot;;&lt;BR&gt;static const char SUPP_PROP_NAME[]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = &quot;init.svc.wpa_supplicant&quot;;&lt;BR&gt;static const char SUPP_CONFIG_TEMPLATE[]= &quot;/system/etc/wifi/wpa_supplicant.conf&quot;;&lt;BR&gt;static const char SUPP_CONFIG_FILE[]&amp;nbsp;&amp;nbsp;&amp;nbsp; = &quot;/data/misc/wifi/wpa_supplicant.conf&quot;;&lt;BR&gt;static const char MODULE_FILE[]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = &quot;/proc/modules&quot;;&lt;/P&gt;&lt;/DIV&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;보통 새로운 WIFI 모듈을 사용한다면 WIFI_DRIVER_MODULE_PATH, WIFI_DRIVER_MODULE_NAME 등은 바꾸어 주어야 한다. 샘플 파일에 WIFI_FIRMWARE_LOADER의 경우 정의되어 있지 않지만 보통 WIFI 모듈은 펌웨어를 다운로드해서 사용하기 떄문에 이 부분도 수정할 필요도 있다. 실제로 드라이버 로드 과정 중에 WIFI_FIRMWARE_LOADER를 체크하여 동작하는 부분이 있다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;int wifi_load_driver()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char driver_status[PROPERTY_VALUE_MAX];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int count = 100; /* wait at most 20 seconds for completion */ 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (check_driver_loaded()) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG) &lt; 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#e31600&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (strcmp(FIRMWARE_LOADER,&quot;&quot;) == 0) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; usleep(500000);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; property_set(DRIVER_PROP_NAME, &quot;ok&quot;);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; property_set(&quot;ctl.start&quot;, FIRMWARE_LOADER);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#e31600&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sched_yield();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (count-- &gt; 0) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (property_get(DRIVER_PROP_NAME, driver_status, NULL)) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (strcmp(driver_status, &quot;ok&quot;) == 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (strcmp(DRIVER_PROP_NAME, &quot;failed&quot;) == 0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; usleep(200000);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ......&amp;nbsp;&lt;/P&gt;}&lt;/DIV&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;위의 글을 보면 busybox 와 iwconfig를 이용해서 테스트하는 과정을 정리한 내용이 있다. &lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;iwconfig는 ifconfig와 유사하지만 wireless 인터페이스를 위해 만들어 졌다. 보통 wireless 환경을 위한 파라미터 설정(주파수 설정 등 ifconfig에는 없는 내용이 추가)에 사용되며, 설정된 값을 보거나 wireless 상태를 확인하는데도 사용한다. (wireless 상태를 확인하기 위해서 /proc/nex/wiress를 이용)&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&lt;A href=&quot;http://linux.about.com/od/commands/l/blcmdl8_iwconfi.htm&quot; target=_blank&gt;http://linux.about.com/od/commands/l/blcmdl8_iwconfi.htm&lt;/A&gt;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #fefeb8 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #fefeb8 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #fefeb8 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #fefeb8 1px solid; BACKGROUND-COLOR: #fefeb8&quot;&gt;
&lt;DIV id=columnLeft&gt;
&lt;DIV class=profileArea&gt;&lt;!-- 
                                        &lt;img src=&quot;/layouts/WG_Layout/images/default/profile.jpg&quot; alt=&quot;profile&quot; class=&quot;iePngFix&quot; width=&quot;183&quot; /&gt;
                                        --&gt;&lt;!-- 로그인 위젯 --&gt;
&lt;DIV style=&quot;OVERFLOW: hidden&quot;&gt;밑에 첨부하는 busybox와 iwconfig를 이용해서 테스트할 수 있습니다.&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV id=columnRight&gt;
&lt;DIV class=board&gt;
&lt;DIV class=viewDocument&gt;
&lt;DIV class=boardRead&gt;
&lt;DIV class=boardReadBody&gt;
&lt;DIV class=&quot;document_67446_220 xe_content&quot; jQuery1255136138253=&quot;15&quot;&gt;
&lt;P&gt;이 두개의 파일을 안드로이드 rootfs 의 / 에 가져다 놓고&lt;BR&gt;부팅후....&lt;/P&gt;
&lt;P&gt;다음과 같은 명령을 내리면 인터넷을 사용할 수 있습니다.&lt;BR&gt;브라우저 이용해서&lt;/P&gt;
&lt;P&gt;-------------------------------------------&lt;BR&gt;iwconfig, busybox를 rootfs의 / 에 복사하신 후에&lt;BR&gt;firmware를 rootfs의 system/etc/firmware 디렉토리에 복사해 주시고&lt;/P&gt;
&lt;P&gt;부팅 후&lt;/P&gt;
&lt;P&gt;// 이 두줄은 한번만&lt;BR&gt;ln -s busybox ./ifconfig&lt;BR&gt;ln -s busybox ./route&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;// 이렇게 해서&lt;BR&gt;./busybox ash&lt;BR&gt;./ifconfig eth0 up&lt;BR&gt;./iwconfig eth0 essid 'insignal'&lt;BR&gt;./ifconfig eth0 192.168.0.105&lt;BR&gt;./route add default gw 192.168.0.1 eth0&lt;BR&gt;setprop net.dns1 168.126.63.1&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;--------------------------------------------&lt;/P&gt;
&lt;P&gt;이런 방식은 android의 wifi를 쓰는게 아니라 ethernet을 사용하는 것처럼 사용하는 것입니다.&lt;/P&gt;
&lt;P&gt;wifi를 쓰려면 wpa_supplicant를 이용해서 처리를 합니다.&lt;/P&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;iwconfig 사용을 보면 essid를 'insignal'로 설정하고 있다. 이는 네트웍 이름을 설정하는 것이라고 한다. &lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;다음 사이트는 일반적인 PC에서 WIFI를 사용하기 위한 환경 설정을 설명하고 있다. 네트웍과 리눅스에 문외한인 나로서는 좀 도움이 되는 것 같다.&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&lt;A href=&quot;http://innu.pe.kr/tt/tag/iwconfig&quot; target=_blank&gt;http://innu.pe.kr/tt/tag/iwconfig&lt;/A&gt;&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: left&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;안드로이드에서 wifi를 사용할 때는 wpa_supplicant를 이용해서 처리한다고 한다. &lt;/P&gt;
&lt;P&gt;이에 대한 정보&lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://wiki.kldp.org/wiki.php/GentooX86Handbook_Ko_4-4&quot; target=_blank&gt;http://wiki.kldp.org/wiki.php/GentooX86Handbook_Ko_4-4&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;위치는 &lt;/P&gt;
&lt;P&gt;external/wpa_supplicant 이다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;setprop를 이용해서 강제로 DNS 주소를 설정한다. 안드로이드의 경우 /etc/resolv.conf도 없고 libnss_dnx-2.x.so 도 사용하지 않는다.&lt;/P&gt;
&lt;P&gt;네트웍 관련된 서비스는 wpa_supplicant와 dhcpcd 정도만 사용한다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;dns 정보의 경우 resolv.conf가 없으므로 setprop로 강제 설정하고 getprop로 설정된 내용을 확인할 수 있는 것 같다. 위에서도 setprop를 사용해서 설정하는 예를 보여주고 있다. 콘솔에서 getprop를 실행하면 현재 설정을 확인할 수 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;$getprop&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;P&gt;.....&lt;BR&gt;[net.tcp.buffersize.default]: [4096,87380,110208,4096,16384,110208]&lt;BR&gt;[net.tcp.buffersize.wifi]: [4095,87380,110208,4096,16384,110208]&lt;BR&gt;[net.tcp.buffersize.umts]: [4094,87380,110208,4096,16384,110208]&lt;BR&gt;[net.tcp.buffersize.edge]: [4093,26280,35040,4096,16384,35040]&lt;BR&gt;[net.tcp.buffersize.gprs]: [4092,8760,11680,4096,8760,11680]&lt;BR&gt;[init.svc.console]: [running]&lt;BR&gt;[init.svc.servicemanager]: [running]&lt;BR&gt;[init.svc.vold]: [running]&lt;BR&gt;[init.svc.debuggerd]: [running]&lt;BR&gt;[init.svc.ril-daemon]: [running]&lt;BR&gt;[init.svc.zygote]: [running]&lt;BR&gt;[init.svc.media]: [running]&lt;BR&gt;[init.svc.dbus]: [running]&lt;BR&gt;[init.svc.installd]: [running]&lt;BR&gt;[init.svc.keystore]: [running]&lt;BR&gt;[init.svc.adbd]: [running]&lt;BR&gt;[hw.egl.enable]: [1]&lt;BR&gt;[init.svc.bootanim]: [stopped]&lt;BR&gt;[hw.keyboards.65536.devname]: [telechips power key]&lt;BR&gt;[hw.keyboards.0.devname]: [telechips keypad]&lt;BR&gt;[sys.settings_secure_version]: [4]&lt;BR&gt;[dev.bootcomplete]: [1]&lt;BR&gt;[sys.settings_system_version]: [6]&lt;BR&gt;[gsm.sim.operator.numeric]: []&lt;BR&gt;[gsm.sim.operator.alpha]: []&lt;BR&gt;[gsm.sim.operator.iso-country]: []&lt;BR&gt;[gsm.sim.state]: [UNKNOWN]&lt;BR&gt;[gsm.current.phone-type]: [1]&lt;BR&gt;[gsm.operator.alpha]: []&lt;BR&gt;[gsm.operator.numeric]: []&lt;BR&gt;[gsm.operator.iso-country]: []&lt;BR&gt;[gsm.operator.isroaming]: [false]&lt;BR&gt;[EXTERNAL_STORAGE_STATE]: [mounted]&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;처음에 WIFI 모듈을 연결하지 않은 상태는 위와 같다. WIFI 모듈을 켜고 다시 확인하면 다음과 같은 내용이 추가된다.&lt;/P&gt;
&lt;P&gt;wpa_supplicant와 dhcpcd가 동작 상태가 됨을 알 수 있다. 테스트한 경우는 AP에 접속해서 IP나 DNS 정보 등을 가져오지 않았으므로 비정상적인 값이들어가 있다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;...... 
&lt;P&gt;[EXTERNAL_STORAGE_STATE]: [mounted]&amp;nbsp;&lt;/P&gt;
&lt;P&gt;[wlan.driver.status]: [ok]&lt;BR&gt;&lt;/P&gt;[init.svc.wpa_supplicant]: [running]&lt;BR&gt;[init.svc.dhcpcd]: [running]&lt;BR&gt;[net.dns1]: [1.1.1.1]&lt;BR&gt;[net.dns2]: [1.1.1.1]&lt;BR&gt;[dhcp.eth0.pid]: [869]&lt;BR&gt;[dhcp.eth0.reason]: [PREINIT]&lt;BR&gt;[net.dnschange]: [1] &lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Setup에서 다시 WIFI 모듈을 끄고 확인하면 다음과 같다. wpa_supplicant와 dhcpcd 모두 stopped 상태로 된다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #c1c1c1 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #c1c1c1 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #c1c1c1 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #c1c1c1 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;...... 
&lt;P&gt;[EXTERNAL_STORAGE_STATE]: [mounted]&amp;nbsp;&lt;/P&gt;
&lt;P&gt;[wlan.driver.status]: [unloaded]&lt;BR&gt;[init.svc.wpa_supplicant]: [stopped]&lt;BR&gt;[init.svc.dhcpcd]: [stopped]&lt;BR&gt;[net.dns1]: [1.1.1.1]&lt;BR&gt;[net.dns2]: [1.1.1.1]&lt;BR&gt;[dhcp.eth0.pid]: [1569]&lt;BR&gt;[dhcp.eth0.reason]: [FAIL]&lt;BR&gt;[net.dnschange]: [2]&lt;BR&gt;[dhcp.eth0.dns1]: []&lt;BR&gt;[dhcp.eth0.dns2]: []&lt;BR&gt;[dhcp.eth0.dns3]: []&lt;BR&gt;[dhcp.eth0.dns4]: []&lt;BR&gt;[dhcp.eth0.result]: [failed]&lt;/P&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;위에서는 강제로 net.dns1의 값을 설정해 두고 있다.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;그 외 참고 내용으로 &lt;/P&gt;
&lt;P&gt;위의 글에서 제시하는 방법은&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;1) external/wpa_supplicant/.config 수정&lt;/P&gt;
&lt;P&gt;2) build/target/board/generic/BoardConfig.mk 수정&lt;/P&gt;
&lt;P&gt;3) extenal/wpa_supplicant/wpa_supplicant.conf 수정 &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;추가 수정 부분은&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;1) external/dhcpcd/android.conf&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;frameworks/base/services/java/com/android/server/WifiWatchdogService.java、 &lt;BR&gt;android-1.5r3/frameworks/base/wifi/java/android/net/wifi/WifiStateTracker.java&lt;/P&gt;
&lt;P style=&quot;MARGIN-LEFT: 4em&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;2) wifi interface 이름 설정은 system/build.prop&lt;/P&gt;
&lt;P&gt;3) init.rc 도 수정 필요&lt;/P&gt;
	    </content>
	    	</entry>
      </feed>
