📄 load_driver_module_into_l1_memory.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 <linux/init.h></span><span class="co2">#include <linux/module.h></span>MODULE_LICENSE<span class="br0">(</span><span class="st0">"Dual BSD/GPL"</span><span class="br0">)</span>; <span class="kw4">int</span> a __attribute<span class="br0">(</span><span class="br0">(</span>section<span class="br0">(</span><span class="st0">".data.l1"</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</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">(</span><span class="br0">(</span>section<span class="br0">(</span><span class="st0">".bss.l1"</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span>; <span class="coMULTI">/* Specify the global uninitialized variable 'b' saved in L1 data bank A memory */</span> <span class="kw4">int</span> c __attribute<span class="br0">(</span><span class="br0">(</span>section<span class="br0">(</span><span class="st0">".data.b.l1"</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</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">(</span><span class="br0">(</span>section<span class="br0">(</span><span class="st0">".bss.b.l1"</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span>; <span class="coMULTI">/* Specify the global uninitialized variable 'd' saved in L1 data bank B memory */</span> <span class="kw4">void</span> l1_code_test<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span>__attribute<span class="br0">(</span><span class="br0">(</span>section<span class="br0">(</span><span class="st0">".text.l1"</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span>; <span class="coMULTI">/* Sepcify the function 'l1_code_test' saved in L1 instruction memory */</span> <span class="kw4">void</span> l1_code_test<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="br0">{</span> printk<span class="br0">(</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">)</span>;<span class="br0">}</span> <span class="kw4">void</span> l1_data_a_test<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="br0">{</span> printk<span class="br0">(</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>, &a, a<span class="br0">)</span>;<span class="br0">}</span> <span class="kw4">void</span> l1_bss_a_test<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="br0">{</span> printk<span class="br0">(</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>, &b, b<span class="br0">)</span>;<span class="br0">}</span> <span class="kw4">void</span> l1_data_b_test<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="br0">{</span> printk<span class="br0">(</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>, &c, c<span class="br0">)</span>;<span class="br0">}</span> <span class="kw4">void</span> l1_bss_b_test<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="br0">{</span> printk<span class="br0">(</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>, &d, d<span class="br0">)</span>;<span class="br0">}</span> <span class="kw4">static</span> <span class="kw4">int</span> hello_init<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="br0">{</span> printk<span class="br0">(</span>KERN_ALERT <span class="st0">"========Load module into L1 memory========<span class="es0">\n</span>"</span><span class="br0">)</span>; l1_code_test<span class="br0">(</span><span class="br0">)</span>; l1_data_a_test<span class="br0">(</span><span class="br0">)</span>; l1_bss_a_test<span class="br0">(</span><span class="br0">)</span>; l1_data_b_test<span class="br0">(</span><span class="br0">)</span>; l1_bss_b_test<span class="br0">(</span><span class="br0">)</span>; <span class="kw1">return</span> <span class="nu0">0</span>;<span class="br0">}</span> <span class="kw4">static</span> <span class="kw4">void</span> hello_exit<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="br0">{</span> printk<span class="br0">(</span>KERN_ALERT <span class="st0">"Goodbye, cruel world<span class="es0">\n</span>"</span><span class="br0">)</span>;<span class="br0">}</span> module_init<span class="br0">(</span>hello_init<span class="br0">)</span>;module_exit<span class="br0">(</span>hello_exit<span class="br0">)</span>;</pre><p>The running result is as follows:</p><pre class="code">root:~> 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"> –code-in-l1: put .text section into L1 instruction memory</div></li><li class="level2"><div class="li"> –data-in-l1: put .data and .bss section into L1 data bank A memory</div></li></ul></li></ol><p>Here is the program “hello.c” </p><pre class="code c"><span class="co2">#include <linux/init.h></span><span class="co2">#include <linux/module.h></span>MODULE_LICENSE<span class="br0">(</span><span class="st0">"Dual BSD/GPL"</span><span class="br0">)</span>; <span class="kw4">int</span> a=<span class="nu0">1</span>;<span class="kw4">int</span> b; <span class="kw4">void</span> l1_code_test<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span>; <span class="kw4">void</span> l1_code_test<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="br0">{</span> printk<span class="br0">(</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">)</span>;<span class="br0">}</span> <span class="kw4">void</span> l1_data_a_test<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="br0">{</span> printk<span class="br0">(</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>, &a, a<span class="br0">)</span>;<span class="br0">}</span> <span class="kw4">void</span> l1_bss_a_test<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="br0">{</span> printk<span class="br0">(</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>, &b, b<span class="br0">)</span>;<span class="br0">}</span> <span class="kw4">static</span> <span class="kw4">int</span> hello_init<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="br0">{</span> printk<span class="br0">(</span>KERN_ALERT <span class="st0">"========Load module into L1 memory========<span class="es0">\n</span>"</span><span class="br0">)</span>; l1_code_test<span class="br0">(</span><span class="br0">)</span>; l1_data_a_test<span class="br0">(</span><span class="br0">)</span>; l1_bss_a_test<span class="br0">(</span><span class="br0">)</span>; <span class="kw1">return</span> <span class="nu0">0</span>;<span class="br0">}</span> <span class="kw4">static</span> <span class="kw4">void</span> hello_exit<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="br0">{</span> printk<span class="br0">(</span>KERN_ALERT <span class="st0">"Goodbye, cruel world<span class="es0">\n</span>"</span><span class="br0">)</span>;<span class="br0">}</span> module_init<span class="br0">(</span>hello_init<span class="br0">)</span>;module_exit<span class="br0">(</span>hello_exit<span class="br0">)</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 ‘hello.ko’</p><pre class="code">aubrey@linux-suse:/tftpboot/module-example> 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> 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> 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 <===================== 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:~> 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 + -