树莓派&自动运维
目录
基础安装&配置
树莓派安装openEuler
树莓派安装openssl
修改环境变量
在/etc/profile中加入
export PATH="/root/dopenssl/bin/:$PATH"
export LD_LIBRARY_PATH="/root/dopenssl/lib:$LD_LIBRARY_PATH"
安装后运行截图
3-2汇编语言练习:查找最大数
.section .data
.align 3
my_data:
.quad 1
.quad 2
.quad 5
.quad 8
.quad 10
.quad 12
my_data_count:
.quad 6
.align 3
print_data:
.string "big data: %d\n"
.section .text
.globl main
main:
stp x29, x30, [sp, -16]!
ldr x0, =my_data
ldr x1, my_data_count
add x4, x0, #40
mov x3, xzr
1:
ldr x2, [x0], #8
cmp x2, x3
csel x3, x2, x3, hi
cmp x0, x4
b.ls 1b
ldr x0, =print_data
//adrp x0, print_data
//add x0, x0, :lo12:print_data
mov x1, x3
bl printf
ldp x29, x30, [sp], 16
ret
3-3:汇编语言练习——通过 C 语言调用汇编函数
main.c
#include <stdio.h>
extern int compare_data(int a, int b);
int main()
{
int val;
val = compare_data(5, 6);
printf("big data: %d\n", val);
}
compare.S
.section .text
.globl compare_data
compare_data:
cmp x0, x1
csel x0, x0, x1, hi
ret
3-4汇编调用C函数
main.S
.section .data
.align 3
print_data:
.string "big data: %d\n"
.section .text
.globl main
main:
stp x29, x30, [sp, -16]!
mov x0, #6
mov x1, #5
bl compare_data
mov x1, x0
ldr x0, =print_data
bl printf
ldp x29, x30, [sp], 16
ret
compare.c
int compare_data(int a, int b)
{
return (a >= b) ? a : b;
}
3-5GCC内联汇编
#include <stdio.h>
static int compare_data(int a, int b)
{
int val;
asm volatile (
"cmp %1, %2\n"
"csel %0, %1, %2, hi\n"
: "+r" (val)
: "r" (a), "r" (b)
: "memory");
return val;
}
int main()
{
int val;
val = compare_data(5, 6);
printf("big data: %d\n", val);
val = compare_data(6, 4);
printf("big data: %d\n", val);
}
3-6一个裸机程序
由于裸机没有操作系统,需自行编写链接脚本
SECTIONS
{
.text.boot : { *(.text.boot) }
.text : { *(.text) }
.rodata : { *(.rodata) }
.data : { *(.data) }
. = ALIGN(0x8);
bss_begin = .;
.bss : { *(.bss*) }
bss_end = .;
}
在第1行中,SECTIONS 是 LS (Linker Script)语法中的关键命令,用来描述输出文件的内存布局。
SECTIONS命令告诉链接文件如何把输入文件的段映射到输出文件的各个段,如何将输入段合为输出段,以及如何把输出段放入程序地址空间(VMA)和进程地址空间(LMA)。
SECTIONS命令格式如下。
SECTIONS
{
sections-command
sections-command
...
}
sections-command有4种。
- ENTRY命令。
- 符号赋值语句。
- 输出段的描述(output section description)。
- 段的叠加描述(overlay description)。
在第3行中,“.”非常关键,它代表位置计数(Location Counter , LC),这里把.text段的链接地址被设置为0x0,这里链接地址指的是装载地址(load address)。
在第4行中,输出文件的.text.boot段内容由所有输入文件(其中的“”可理解为所有的.o文件,也就是二进制文件)的.text.boot段组成。
“”可理解为所有的.o
在第5行中,输出文件的.text段内容由所有输入文件(其中的“*”可理解为所有的.o文件,也就是二进制文件)的.text段组成。
在第6行中,输出文件的.rodata段由所有输入文件的.rodata段组成。
在第7行中,输出文件的.data段由所有输入文件的.data段组成在第8行中,设置为按8个字节对齐。
在第9~11行中,定义了一个.bss 段。