about summary refs log tree commit diff stats
path: root/dev/c
diff options
context:
space:
mode:
Diffstat (limited to 'dev/c')
-rw-r--r--dev/c/index.html90
1 files changed, 87 insertions, 3 deletions
diff --git a/dev/c/index.html b/dev/c/index.html
index 09374c6..684c7d2 100644
--- a/dev/c/index.html
+++ b/dev/c/index.html
@@ -7,6 +7,92 @@
     <body>
         <a href="../index.html">Development Index</a>
 
+        <h1>System Development</h1>
+
+        <p>System development requires debug kernel know how,
+        in this example will be used qemu and gdb. A simple init
+        program is created. Create init.S;</p>
+
+        <pre>
+	.global _start
+	_start:
+	    mov $1, %rax
+	    mov $1, %rdi
+	    mov $message, %rsi
+	    mov $message_len, %rdx
+	    syscall
+	    jmp .
+	    message: .ascii "FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n"
+	    .equ message_len, . - message
+	</pre>
+
+	<p>Assemble, link and create simple initial ram disk;</p>
+
+	<pre>
+	mkdir d
+	as --64 -o init.o init.S # assemble
+	ld -o d/init init.o      # link
+	cd d
+	find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz
+	</pre>
+
+	<p>Clean temporary directory;</p>
+
+	<pre>
+	cd ..
+	rm -r d/
+	</pre>
+
+	<p>Can be used C to create init program;</p>
+
+	<pre>
+	#include &lt;stdio.h&gt;
+	#include &lt;unistd.h&gt;
+
+	int main() {
+	    printf("FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n");
+	    sleep(0xFFFFFFFF);
+	    return 0;
+	}
+	</pre>
+
+	<pre>
+	$ gcc -static init.c -o init
+	</pre>
+
+	<p>Test qemu, kernel and simple init program, you should see
+	"FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR";</p>
+
+	<pre>
+	$ qemu-system-x86_64 -enable-kvm --kernel arch/x86_64/boot/bzImage \
+    	--initrd rootfs.cpio.gz
+	</pre>
+
+	<p>If everything goes well you can start qemu without start CPU at
+	startup (-S) and with gdb server on TCP port 1234 (-s).</p>
+
+	<pre>
+	$ qemu-system-x86_64 -enable-kvm --kernel arch/x86/boot/bzImage \
+                --initrd rootfs.cpio.gz \
+		-S -s
+	</pre>
+
+	<p>On another terminal start gdb;</p>
+
+	<pre>
+	gdb \
+	    -ex "add-auto-load-safe-path $(pwd)" \
+	    -ex "file vmlinux" \
+	    -ex 'set arch i386:x86-64:intel' \
+	    -ex 'target remote localhost:1234' \
+	    -ex 'break start_kernel' \
+	    -ex 'continue' \
+	    -ex 'disconnect' \
+	    -ex 'set arch i386:x86-64' \
+	    -ex 'target remote localhost:1234'
+	</pre>
+
+	
         <h1>C &amp; GDB</h1>
 
         <p><a href="http://blog.fourthbit.com/2013/06/18/creating-an-open-source-program-in-c-with-autotools-part-1-of-2/">C program with autotools</a>
@@ -74,7 +160,7 @@
         thread 1
         </pre>
 
-        <p><a href=" http://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_39.html#SEC40">Stopping and Starting</a>
+        <p><a href="http://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_39.html#SEC40">Stopping and Starting</a>
         multi-thread programs</p>
 
         <pre>
@@ -86,8 +172,6 @@
         <pre>
         strace -c ./program
         </pre>
-
-
         <a href="../index.html">Development Index</a>
         <p>
         This is part of the c9-doc Manual.
gression: typing uppercase letters in text' href='/akkartik/text.love/commit/keychord.lua?id=3b4dacaee81ec55a1dccdb50584d45ca5bbe00ec'>3b4daca ^
f4235a1 ^
4aa2003 ^



0fab1b4 ^
1326914 ^
3b4daca ^
a6ab7a2 ^

d441f8a ^
1326914 ^
d441f8a ^


1326914 ^
d441f8a ^


1326914 ^
d441f8a ^

3b4daca ^
1326914 ^
d441f8a ^

84875f3 ^



a6ab7a2 ^


e1c5a42 ^










a6ab7a2 ^












0fab1b4 ^
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

                  

                                                                                  
                                                
                                    
                                              
          

                                                            
                                                       

   
                                   
                   
                         

                         
                        

                         
                          

                                                                       
                        
                         



                      
 
                                
                                                                                

   
                        
                                                                 


                       
                                                               


                         
                                                                   

   
                       
                                                               

   



                                                                                              


                              










                                  












                           
   
-- Keyboard driver

Modifiers = {'lctrl', 'rctrl', 'lalt', 'ralt', 'lshift', 'rshift', 'lgui', 'rgui'}

function App.keypressed(key, scancode, isrepeat)
  if array.find(Modifiers, key) then
    -- do nothing when the modifier is pressed
    return
  end
  -- include the modifier(s) when the non-modifer is pressed
  App.keychord_pressed(App.combine_modifiers(key), key)
end

function App.combine_modifiers(key)
  local result = ''
  if App.ctrl_down() then
    result = result..'C-'
  end
  if App.alt_down() then
    result = result..'M-'
  end
  if App.shift_down() then
    result = result..'S-'  -- don't try to use this with letters/digits
  end
  if App.cmd_down() then
    result = result..'s-'
  end
  result = result..key
  return result
end

function App.any_modifier_down()
  return App.ctrl_down() or App.alt_down() or App.shift_down() or App.cmd_down()
end

function App.ctrl_down()
  return App.modifier_down('lctrl') or App.modifier_down('rctrl')
end

function App.alt_down()
  return App.modifier_down('lalt') or App.modifier_down('ralt')
end

function App.shift_down()
  return App.modifier_down('lshift') or App.modifier_down('rshift')
end

function App.cmd_down()
  return App.modifier_down('lgui') or App.modifier_down('rgui')
end

function App.is_cursor_movement(key)
  return array.find({'left', 'right', 'up', 'down', 'home', 'end', 'pageup', 'pagedown'}, key)
end

array = {}

function array.find(arr, elem)
  if type(elem) == 'function' then
    for i,x in ipairs(arr) do
      if elem(x) then
        return i
      end
    end
  else
    for i,x in ipairs(arr) do
      if x == elem then
        return i
      end
    end
  end
  return nil
end

function array.any(arr, f)
  for i,x in ipairs(arr) do
    local result = f(x)
    if result then
      return result
    end
  end
  return false
end