⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 load_driver_module_into_l1_memory.html

📁 ADI 公司blackfin系列的用户使用文挡。
💻 HTML
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html><head>  <title></title>  <link rel="stylesheet" media="screen" type="text/css" href="./style.css" />  <link rel="stylesheet" media="screen" type="text/css" href="./design.css" />  <link rel="stylesheet" media="print" type="text/css" href="./print.css" />  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head><body><a href=start.html>start</a></br><p>We offer two methods to load driver module into L1 memory.</p><ol><li class="level1"><div class="li"> Specify the section attribute to the function and variable prototype declaration, here is a completed example<pre class="code c"><span class="co2">#include &lt;linux/init.h&gt;</span><span class="co2">#include &lt;linux/module.h&gt;</span>MODULE_LICENSE<span class="br0">&#40;</span><span class="st0">"Dual BSD/GPL"</span><span class="br0">&#41;</span>;&nbsp;<span class="kw4">int</span> a __attribute<span class="br0">&#40;</span><span class="br0">&#40;</span>section<span class="br0">&#40;</span><span class="st0">".data.l1"</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> = <span class="nu0">1</span>; <span class="coMULTI">/* Specify the global initialized variable 'a' saved in the L1 data bank A memory */</span><span class="kw4">int</span> b __attribute<span class="br0">&#40;</span><span class="br0">&#40;</span>section<span class="br0">&#40;</span><span class="st0">".bss.l1"</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>; <span class="coMULTI">/* Specify the global uninitialized variable 'b' saved in L1 data bank A memory */</span>&nbsp;<span class="kw4">int</span> c __attribute<span class="br0">&#40;</span><span class="br0">&#40;</span>section<span class="br0">&#40;</span><span class="st0">".data.b.l1"</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> = <span class="nu0">2</span>; <span class="coMULTI">/* Specify the global initialized variable 'c' saved in L1 data bank B memory */</span><span class="kw4">int</span> d __attribute<span class="br0">&#40;</span><span class="br0">&#40;</span>section<span class="br0">&#40;</span><span class="st0">".bss.b.l1"</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>; <span class="coMULTI">/* Specify the global uninitialized variable 'd' saved in L1 data bank B memory */</span>&nbsp;&nbsp;<span class="kw4">void</span> l1_code_test<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>__attribute<span class="br0">&#40;</span><span class="br0">&#40;</span>section<span class="br0">&#40;</span><span class="st0">".text.l1"</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>; <span class="coMULTI">/* Sepcify the function 'l1_code_test' saved in L1 instruction memory */</span>&nbsp;<span class="kw4">void</span> l1_code_test<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><span class="br0">&#123;</span>        printk<span class="br0">&#40;</span>KERN_ALERT <span class="st0">"Code test: code function addr = 0x%p<span class="es0">\n</span>"</span>, l1_code_test<span class="br0">&#41;</span>;<span class="br0">&#125;</span>&nbsp;<span class="kw4">void</span> l1_data_a_test<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><span class="br0">&#123;</span>        printk<span class="br0">&#40;</span>KERN_ALERT <span class="st0">"Data bank A test: data variable addr = 0x%p, data value is %d<span class="es0">\n</span>"</span>, &amp;a, a<span class="br0">&#41;</span>;<span class="br0">&#125;</span>&nbsp;<span class="kw4">void</span> l1_bss_a_test<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><span class="br0">&#123;</span>        printk<span class="br0">&#40;</span>KERN_ALERT <span class="st0">"BSS  bank A test: bss  variable addr = 0x%p, bss value is %d<span class="es0">\n</span>"</span>, &amp;b, b<span class="br0">&#41;</span>;<span class="br0">&#125;</span>&nbsp;<span class="kw4">void</span> l1_data_b_test<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><span class="br0">&#123;</span>        printk<span class="br0">&#40;</span>KERN_ALERT <span class="st0">"Data bank B test: data variable addr = 0x%p, data value is %d<span class="es0">\n</span>"</span>, &amp;c, c<span class="br0">&#41;</span>;<span class="br0">&#125;</span>&nbsp;<span class="kw4">void</span> l1_bss_b_test<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><span class="br0">&#123;</span>        printk<span class="br0">&#40;</span>KERN_ALERT <span class="st0">"BSS  bank B test: bss  variable addr = 0x%p, bss value is %d<span class="es0">\n</span>"</span>, &amp;d, d<span class="br0">&#41;</span>;<span class="br0">&#125;</span>&nbsp;<span class="kw4">static</span> <span class="kw4">int</span> hello_init<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><span class="br0">&#123;</span>        printk<span class="br0">&#40;</span>KERN_ALERT <span class="st0">"========Load module into L1 memory========<span class="es0">\n</span>"</span><span class="br0">&#41;</span>;        l1_code_test<span class="br0">&#40;</span><span class="br0">&#41;</span>;        l1_data_a_test<span class="br0">&#40;</span><span class="br0">&#41;</span>;        l1_bss_a_test<span class="br0">&#40;</span><span class="br0">&#41;</span>;        l1_data_b_test<span class="br0">&#40;</span><span class="br0">&#41;</span>;        l1_bss_b_test<span class="br0">&#40;</span><span class="br0">&#41;</span>;        <span class="kw1">return</span> <span class="nu0">0</span>;<span class="br0">&#125;</span>&nbsp;<span class="kw4">static</span> <span class="kw4">void</span> hello_exit<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><span class="br0">&#123;</span>        printk<span class="br0">&#40;</span>KERN_ALERT <span class="st0">"Goodbye, cruel world<span class="es0">\n</span>"</span><span class="br0">&#41;</span>;<span class="br0">&#125;</span>&nbsp;module_init<span class="br0">&#40;</span>hello_init<span class="br0">&#41;</span>;module_exit<span class="br0">&#40;</span>hello_exit<span class="br0">&#41;</span>;</pre><p>The running result is as follows:</p><pre class="code">root:~&gt; insmod hello.ko========Load module into L1 memory========Code test: code function addr = 0xffa00378Data bank A test: data variable addr = 0xff803e58, data value is 1BSS  bank A test: bss  variable addr = 0xff803e5c, bss value is 0Data bank B test: data variable addr = 0xff902580, data value is 2BSS  bank B test: bss  variable addr = 0xff902584, bss value is 0</pre></div></li><li class="level1"><div class="li"> Add the options to the link command. There is nothing need to be changed in the driver. We offer two options:</div><ul><li class="level2"><div class="li"> &ndash;code-in-l1: put .text section into L1 instruction memory</div></li><li class="level2"><div class="li"> &ndash;data-in-l1: put .data and .bss section into L1 data bank A memory</div></li></ul></li></ol><p>Here is the program &ldquo;hello.c&rdquo; </p><pre class="code c"><span class="co2">#include &lt;linux/init.h&gt;</span><span class="co2">#include &lt;linux/module.h&gt;</span>MODULE_LICENSE<span class="br0">&#40;</span><span class="st0">"Dual BSD/GPL"</span><span class="br0">&#41;</span>;&nbsp;<span class="kw4">int</span> a=<span class="nu0">1</span>;<span class="kw4">int</span> b;&nbsp;<span class="kw4">void</span> l1_code_test<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span>;&nbsp;<span class="kw4">void</span> l1_code_test<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><span class="br0">&#123;</span>        printk<span class="br0">&#40;</span>KERN_ALERT <span class="st0">"Code test: code function addr = 0x%p<span class="es0">\n</span>"</span>, l1_code_test<span class="br0">&#41;</span>;<span class="br0">&#125;</span>&nbsp;<span class="kw4">void</span> l1_data_a_test<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><span class="br0">&#123;</span>        printk<span class="br0">&#40;</span>KERN_ALERT <span class="st0">"Data bank A test: data variable addr = 0x%p, data value is %d<span class="es0">\n</span>"</span>, &amp;a, a<span class="br0">&#41;</span>;<span class="br0">&#125;</span>&nbsp;<span class="kw4">void</span> l1_bss_a_test<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><span class="br0">&#123;</span>        printk<span class="br0">&#40;</span>KERN_ALERT <span class="st0">"BSS  bank A test: bss  variable addr = 0x%p, bss value is %d<span class="es0">\n</span>"</span>, &amp;b, b<span class="br0">&#41;</span>;<span class="br0">&#125;</span>&nbsp;<span class="kw4">static</span> <span class="kw4">int</span> hello_init<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><span class="br0">&#123;</span>        printk<span class="br0">&#40;</span>KERN_ALERT <span class="st0">"========Load module into L1 memory========<span class="es0">\n</span>"</span><span class="br0">&#41;</span>;        l1_code_test<span class="br0">&#40;</span><span class="br0">&#41;</span>;        l1_data_a_test<span class="br0">&#40;</span><span class="br0">&#41;</span>;        l1_bss_a_test<span class="br0">&#40;</span><span class="br0">&#41;</span>;        <span class="kw1">return</span> <span class="nu0">0</span>;<span class="br0">&#125;</span>&nbsp;<span class="kw4">static</span> <span class="kw4">void</span> hello_exit<span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span><span class="br0">&#123;</span>        printk<span class="br0">&#40;</span>KERN_ALERT <span class="st0">"Goodbye, cruel world<span class="es0">\n</span>"</span><span class="br0">&#41;</span>;<span class="br0">&#125;</span>&nbsp;module_init<span class="br0">&#40;</span>hello_init<span class="br0">&#41;</span>;module_exit<span class="br0">&#40;</span>hello_exit<span class="br0">&#41;</span>;</pre><p>The Makefile is simple, one line is enough.</p><pre class="code">obj-m += hello.o</pre><p>The following instruction tell you how to generate &lsquo;hello.ko&rsquo;</p><pre class="code">aubrey@linux-suse:/tftpboot/module-example&gt; make -C /home/aubrey/cvs/kernel/new/uClinux-dist/linux-2.6.x SUBDIRS=$PWD modulesmake: Entering directory `/home/aubrey/cvs/kernel/new/uClinux-dist/linux-2.6.x'  CC [M]  /tftpboot/module-example/hello.o  Building modules, stage 2.  MODPOST  CC      /tftpboot/module-example/hello.mod.o  LD [M]  /tftpboot/module-example/hello.komake: Leaving directory `/home/aubrey/cvs/kernel/new/uClinux-dist/linux-2.6.x'</pre><p>Here we get the hello.ko, now we re-link the object file to add the specific flags to the driver module:</p><pre class="code">aubrey@linux-suse:/tftpboot/module-example&gt; bfin-uclinux-ld --code-in-l1 --data-in-l1 -r -o hello.ko hello.o hello.mod.o</pre><p>Make sure the flags have been added</p><pre class="code">aubrey@linux-suse:/tftpboot/module-example&gt; bfin-uclinux-readelf -h hello.koELF Header:  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00  Class:                             ELF32  Data:                              2's complement, little endian  Version:                           1 (current)  OS/ABI:                            UNIX - System V  ABI Version:                       0  Type:                              REL (Relocatable file)  Machine:                           Analog Devices Blackfin  Version:                           0x1  Entry point address:               0x0  Start of program headers:          0 (bytes into file)  Start of section headers:          1004 (bytes into file)  Flags:                             0x30, code in L1, data in L1 &lt;===================== Here, make sure the flags are setted  Size of this header:               52 (bytes)  Size of program headers:           0 (bytes)  Number of program headers:         0  Size of section headers:           40 (bytes)  Number of section headers:         13  Section header string table index: 10</pre><p>The running result is as follows:</p><pre class="code">root:~&gt; insmod hello.ko========Load module into L1 memory========Code test: code function addr = 0xffa003ccData bank A test: data variable addr = 0xff803e58, data value is 1BSS  bank A test: bss  variable addr = 0xff803e5c, bss value is 0</pre></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -