我在一个嵌入式系统上(来自 Xilinx 的 Zynq。它使用 ARMv7、Cortex-A9),并运行 Linux。我需要确保一定的物理内存范围内没有访问过发,无论是意外内核空间或用户。我可以发出信号、数据中止或其他任何事情,但这种硬件尝试不能超过 MMU。
在裸机模式和 U-Boot 中,我可以直接访问 TLB 的位置,并且可以通过将 MMU 配置为在发生任何读或写访问时中止数据来限制硬件级别的内存访问。我想在 Linux 中这样做,即使是 mmap() 也会引发数据中止。
推理:
在 Zynq 中,2GB 的地址空间被分配给一个可能永远不会在硬件级别响应的范围。ARM 的 AXI/AMBA 协议说主机永远不能“放弃”访问地址的尝试,即使那里什么都没有。如果我取消引用一个没有硬件驻留的指针,整个芯片就会挂起。
我知道我可以“只是不给 sudo”或“只是编写好的驱动程序”,但这甚至在那个级别之前。我想在早期启动时将 MMU 的 TLB 设置为如果我的超级用户进行了一些错误的编码,则数据完全中止。我宁愿不 hack boot.S,而是直接修改 TLB,然后使用 API 来刷新它。
我一直在尝试为arm交叉编译util-linux,但我总是得到动态链接的可执行文件,我不知道为什么会这样。我的目标是静态的。我一直在使用类似步骤的不同工具之前进行交叉编译,并且它一直有效,所以我不知道这次我做错了什么。我使用的是 Ubuntu 16.04。以下是我正在运行的命令:
export CC=arm-linux-gnueabi-gcc
export ac_cs_linux_vers=4
export CFLAGS=-static
export CPPFLAGS=-static
export LDFLAGS=-static
./configure --host=arm-linux LDFLAGS=-static --disable-shared --without-tinfo --without-ncurses --disable-ipv6 --disable-pylibmount --enable-static-programs=fdisk,sfdisk,whereis --prefix=/opt/util-linux/arm --bindir=/opt/util-linux/arm/bin --sbindir=/opt/util-linux/arm/sbin
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我在我能想到的每个地方都指定了静态,甚至重复了一些东西“只是为了确保它理解我”,并且在运行配置脚本后,以下是输出:
util-linux 2.28.2
prefix: /opt/util-linux/arm
exec prefix: ${prefix}
localstatedir: ${prefix}/var
bindir: /opt/util-linux/arm/bin
sbindir: /opt/util-linux/arm/sbin
libdir: ${exec_prefix}/lib
includedir: ${prefix}/include
usrbin_execdir: ${exec_prefix}/bin
usrsbin_execdir: ${exec_prefix}/sbin
usrlib_execdir: ${exec_prefix}/lib
compiler: arm-linux-gnueabi-gcc
cflags: -static
suid cflags:
ldflags: -static
suid ldflags:
Python: /usr/bin/python
Python version: 2.7
Python libs: ${exec_prefix}/lib/python2.7/site-packages
Bash completions: /usr/share/bash-completion/completions
Systemd support: no
Btrfs support: yes
warnings:
Run Code Online (Sandbox Code Playgroud)
然后我这样做:
make fdisk …Run Code Online (Sandbox Code Playgroud) 我的来宾操作系统是 x86(.vmdk 格式),从 QEMU 文档看来,由于我的主机是 ARM Raspberry Pi 3,即使在内核中启用 KVM,我也无法利用它。
那是对的吗?
如果我想为 ARM 架构构建自定义内核,是否需要:
a) 从 kernel.org 下载内核,对内核进行更改,使用一些交叉编译器(如代码源或其他东西)构建它
b) 从某处找到一个 ARM 特定的内核,找到一些补丁,使用一些 ARM 特定的工具编译它?
可以为 ARM 架构构建任何自定义内核吗?
一般来说,我对内核知之甚少。
我正在玩 TTY,对于qemu-system-x86_64 -M pc,每当我通过该-serial选项时,它都会创建一个新的 TTY,我可以从 Linux 向它附加一个类似ttyS0和 的序列号。ttyS1
然而,对于 ARM,我无法通过第一个ttyAMA0. 如果我添加-serial,它不会显示info qtree,并且内核启动消息只能找到一条:
9000000.pl011: ttyAMA0 at MMIO 0x9000000 (irq = 54, base_baud = 0) is a PL011 rev1
Run Code Online (Sandbox Code Playgroud)
是否可能,如果不可能,是否有特定的设计原因?
我使用的是 QEMU v3.0.0。从来源来看,这似乎不可能:https://github.com/qemu/qemu/blob/v3.0.0/hw/arm/virt.c#L138,因为内存映射中只有一个 UART:
[VIRT_GIC_REDIST] = { 0x080A0000, 0x00F60000 },
[VIRT_UART] = { 0x09000000, 0x00001000 },
[VIRT_RTC] = { 0x09010000, 0x00001000 },
Run Code Online (Sandbox Code Playgroud)
我这样做是因为我想看看从不同的串行连接是否会使 KGDB 工作。在 x86_64 上我可以连接到ttyS0,但我认为值得在 ARM 上尝试一下。另请参阅:/sf/ask/1540323151/#44197715
有大量基于 ARM 的低成本迷你设备问世(Cotton Candy 等)。其中一些仅适用于 Android,一些仅适用于 Linux,还有一些允许两种操作系统运行。
唯一的问题是:所有这些都是基于 ARM 的设备。虽然 Android 应用程序可以在 x86 和 ARM 上的 Android 上运行,但我很难找到在 ARM 上的 Linux 上运行的有用应用程序 - 事实上,即使是 ARM 上的 Ubuntu 仍然没有得到很好的支持。
我有两个相关的问题:
顺便说一句,我./今天在运行 ARM linux 的 sh shell 中输入了一个错误,它产生了“权限被拒绝”作为错误,而不是“是一个目录”,这是通常的错误。
sh 中的 ARM Linux:
[root@zynq DEBUG]# ./
-sh: ./: Permission denied
[root@zynq DEBUG]# uname -a
Linux zynq 3.8.0-xilinx #1 SMP PREEMPT Mon May 19 13:01:00 PDT 2014 armv7l GNU/Linux
[root@zynq DEBUG]# echo $SHELL
/bin/sh
Run Code Online (Sandbox Code Playgroud)
bash 中的 Debian Jessie:
root@hotbox:~# ./
bash: ./: Is a directory
root@hotbox:~# uname -a
Linux hotbox 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt9-3~deb8u1 (2015-04-24) x86_64 GNU/Linux
root@hotbox:~# echo $SHELL
/bin/bash
Run Code Online (Sandbox Code Playgroud)
我知道我正在尝试执行一个目录,但我很好奇:为什么 sh 会产生权限错误?