在 Ubuntu 18.04 中,我使用以下自动启动脚本:
[Desktop Entry]
Type=Application
Exec=/home/user/.xinitrc
Version=1.0
X-GNOME-Autostart-enabled=true
Name=xmodmap
Comment=xmodmap script
Run Code Online (Sandbox Code Playgroud)
这只是xmodmap /path/.Xmodmap &
。
当系统启动时,它就工作了。当系统从睡眠中醒来时,重新映射不再起作用。我怎样才能解决这个问题?
编辑:(回复评论)这也不能解决问题:
$ cat /etc/systemd/system/xmodmapbindings.service
[Unit]
Description=xmodmap bindings
Before=sleep.target
StopWhenUnneeded=yes
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStop=-/home/norake/.xinitrc
[Install]
WantedBy=sleep.target
$ cat ~/.xinitrc
#!/bin/bash
if [ "$USER" != norake ]; then
su norake -c 'sleep 5; /usr/bin/xmodmap /home/norake/.Xmodmap' &
# without su, without sleep, without fork (&): doesn't work either
else
(sleep 5; /usr/bin/xmodmap /home/norake/.Xmodmap) &
fi
Run Code Online (Sandbox Code Playgroud)
sleep 30
也不行。当然,手动运行脚本是有效的。
我试图了解 Linux 3/1 拆分(或 2/2、1/3、任何)以及映射到物理内存的工作方式。让我们假设 x86。
我特别不明白的是为什么内核在 va[3GiB, 4GiB) 中的 1GiB 总是映射到 pa[0, 1GiB]。拆分位于 (virtual) PAGE_OFFSET
。
如果我有更多的内存怎么办?如果我少了怎么办?用户空间的所有内存都去哪儿了?
从 TLDP 我了解到,底层物理 1GiB 始终用于内核(为什么?)。当虚拟地址空间小于物理地址空间时,使用高端内存(通过这篇文章),因为内存很多,否则会被浪费(对吧?);在 x86-64 中它没有被使用,因为虚拟地址空间是异常的。
始终保持内核的一件事可能是在上下文切换上current
保持不变并且无需更改cr3
.
这个答案说:
高端内存是用户空间程序可以寻址的内存段。它不能触及低内存。
Low Memory 是 Linux 内核可以直接寻址的内存段。如果内核必须访问高端内存,它必须首先将其映射到自己的地址空间。
人们是否过度使用“低记忆力”和“高记忆力”这两个术语?
最后,LDD3 说:
内核不能直接操作未映射到内核地址空间的内存。换句话说,内核需要它自己的虚拟地址来处理它必须直接接触的任何内存。因此,多年来,内核可以处理的最大物理内存量是可以映射到内核虚拟地址空间部分的量,减去内核代码本身所需的空间。因此,基于 x86 的 Linux 系统最多可以使用略低于 1 GB 的物理内存。
这是指p
内核中的指针必须持有虚拟地址,而不是物理地址,因为映射总是适用的?为什么这个“1GiB 物理内存”限制?