记得当年读书的时候,写过ARM Linux下最小helloworld实验的代码,地址是:
当时这个使用OABI方式,现在改动下实现EABI方式实现系统调用:
- char *str = "hello world!\n";
- /**********************************************
- * function print
- * description :use the syscall write
- * prototype of wirte:
- * ssize_t write(int fd, const void *buf, size_t count)
- **********************************************/
- void print(void)
- {
- __asm__ __volatile__(
- "mov r0, #0x0\n\t" /*fd*/
- "mov r1, %0\n\t" /*buf*/
- "mov r2, #0x0d\n\t" /*count*/
- "mov r7, #0x04\n\t"
- "swi #0\n\t"
- ::"r"(str):"r0","r1","r2");
- }
- /********************************************
- * function: exit
- * description: use the syscall exit
- ********************************************/
- void exit(void)
- {
- __asm__ __volatile__(
- "mov r0, #42\n\t"
- "mov r7, #0x01\n\t"
- "swi #0\n\t");
- }
- void nomain(void)
- {
- print();
- exit();
- }
ARM Linux使用swi实现用户空间到内核空间。
内核里面谈EABI,OABI,其实相对于系统调用的方式,当然我们所说的系统限于arm系统。EABI (Extended ABI),说的是这样的一种新的系统调用方式
mov r7, #num
swi 0x0
原来的系统调用方式是这样,
swi (#num | 0x900000) (0x900000是个magic值)
也就是说原来的调用方式(Old ABI)是通过跟随在swi指令中的调用号来进行的,现在的是根据r7中的值。
tinyhelloworld.lds
- ENTRY(nomain)
- SECTIONS
- {
- . = 0x00008000 + SIZEOF_HEADERS;
- tinytext :
- {
- *(.text)
- *(.data)
- *(.rodata)
- }
- /DISCARD/ :
- {
- *(.comment)
- }
- }
Makefile
- 1 tinyhelloworld: tinyhelloworld.c
- 2 arm-linux-gcc -c -fno-builtin tinyhelloworld.c
- 3 arm-linux-ld -static -T tinyhelloworld.lds -o tinyhelloworld -Map boot.map tinyhelloworld.o
- 4 clean:
- 5 -rm tinyhelloworld *.o *.map
阅读(2294) | 评论(0) | 转发(0) |