最新記事

起動中の Linux カーネル空間のページテーブル 質問する
linux-kernel
virtual-memory
mmu
page-tables

起動中の Linux カーネル空間のページテーブル 質問する

Linux カーネルのページ テーブル管理に混乱を感じます。 Linux カーネル空間では、ページ テーブルがオンになる前。カーネルは 1 対 1 のマッピング メカニズムを使用して仮想メモリで実行されます。ページ テーブルがオンになった後、カーネルはページ テーブルを参照して仮想アドレスを物理メモリ アドレスに変換します。質問は次のとおりです。 この時点で、ページ テーブルをオンにした後、カーネル空間はまだ 1GB (0xC0000000 - 0xFFFFFFFF) ですか? また、カーネル プロセスのページ テーブルでは、0xC0000000 - 0xFFFFFFFF の範囲のページ テーブル エントリ (PTE) のみがマップされます。この範囲外の PTE は、カーネル コードがそこにジャンプすることはないため、マップされません。 ページ テーブルを有効にする前と有効にした後のアドレスのマッピングは同じですか? たとえば、ページ テーブルを有効にする前は、仮想アドレス 0xC00000FF が物理アドレス 0x000000FF にマッピングされていますが、ページ テーブルを有効にした後、上記のマッピングは変更されません。仮想アドレス 0xC00000FF は、引き続き物​​理アドレス 0x000000FF にマッピングされています。異なる点は、ページ テーブルを有効にした後、CPU がページ テーブルを参照して仮想アドレスを物理アドレスに変換することです。これは、以前は必要ありませんでした。 カーネル空間のページ テーブルはグローバルであり、ユーザー プロセスを含むシステム内のすべてのプロセス間で共有されます。 このメカニズムは x86 32 ビットと ARM で同じですか?

Admin

Linuxクロスビルド必須armhf壊れたパッケージ
linux
kernel
linux-kernel
raspberry-pi
arm

Linuxクロスビルド必須armhf壊れたパッケージ

私はRaspberry Pi LinuxカーネルにLinuxカーネルをインストールして設定しようとしています。次のウェブサイトを参考にしました。https://www.raspberrypi.com/documentation/computers/linux_kernel.html。 これまで、Raspberry Piで次のコマンドをこの順序で実行しました。 sudo 適切なアップデート sudo 適切なアップグレード sudo apt-get 自動削除 sudo apt インストール git bc bison flex libssl-dev make git clone --深さ=1https://github.com/raspberrypi/linux cd linux KERNEL=kernel7 make bcm2709_defconfig make -j4 zImage モジュール dtbs sudo を有効にする module_install sudo cpアーチ/arm/boot/dts/*.dtb /boot/ sudo cpアーチ/arm/boot/dts/overlays/.dtb/開始/上書き/ sudo cpアーチ/arm/boot/dts/overlays/README /boot/overlays/ sudo cpアーチ/arm/boot/zImage /boot/$KERNEL.img sudo apt インストール git bc bison flex libssl-dev make libc6-dev libncurses5-dev sudo apt install crossbuild-essential-armhf ただし、ポイント14でコマンドを実行中に次のエラーが発生しました。 Reading package lists... Done Building dependency tree Reading state information... Done Some packages could not be installed. This may mean that you have requested an impossible situation or if you are using the unstable distribution that some required packages have not yet been created or been moved out of Incoming. The following information may help to resolve the situation: The following packages have unmet dependencies: crossbuild-essential-armhf : Depends: gcc-arm-linux-gnueabihf (>= 5.3) but it is not going to be installed Depends: g++-arm-linux-gnueabihf (>= 5.3) but it is not going to be installed E: Unable to correct problems, you have held broken packages.

Admin

内部ルートハブのMaxPowerが0mAであるのはなぜですか?
linux-kernel
usb
power-management

内部ルートハブのMaxPowerが0mAであるのはなぜですか?

純粋な好奇心で、私はLinuxでUSB電源がどのように処理されるかを理解しようとしています。私が見たのは、外部デバイスのMaxPowerがデバイスに応じて合理的な数字に設定されているが、内部ルートハブが合理的な数字にMaxPower設定されていることです0mA。これがルートハブの特別なケースですか?カーネルは、リーフデバイスパスの各ホップに使用できる最大電力を決定するときに内部ハブを無視しますか? Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub MaxPower 0mA Bus 001 Device 003: ID 04f2:b6d9 Chicony Electronics Co., Ltd Integrated Camera MaxPower 500mA Bus 001 Device 008: ID 18d1:4ee1 Google Inc. Nexus/Pixel Device (MTP) MaxPower 500mA Bus 001 Device 004: ID 8087:0026 Intel Corp. AX201 Bluetooth MaxPower 100mA Bus 001 Device 002: ID 058f:9540 Alcor Micro Corp. AU9540 Smartcard Reader MaxPower 50mA Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub MaxPower 0mA

Admin

Linux-headers-5.10.0-21-amd64 debian 11が見つかりません
debian
linux-kernel
dual-boot
macintosh
linux-headers

Linux-headers-5.10.0-21-amd64 debian 11が見つかりません

Debian イメージをフラッシュしました。Debian 公式 DVD amd64ライブUSBを接続し、MacBook Air 2020 Intel Core i7のデュアルブートにインストールしました。このチュートリアル。インストール中にFAT32でフォーマットしたパーティションをrootとしてマウントできず、パーティションをext4ファイルにフォーマットしてインストールに成功しました。 インストール後、トラックパッド、キーボード、WIFI、Bluetoothは機能しません。だから私はフォローしています。このStackoverflowの答えapplespiドライバをインストールするとトラックパッドとキーボードが機能しますが、最後のコマンドを実行した後にエラーが発生しますdkms install -m applespi -v 0.1。エラーメッセージ Your kernel headers for kernel 5.10.0-21-amd64 cannot be found. Please install the linux-headers-5.10.0-21-amd64 package or use the --kernelsourcedir option to tell DKMS where it's located uname -r出力は5.10.0-21-amd64 apt search linux-headers-$(uname -r)出力です Sorting... Done Full Text Search... Done sudo apt-get install linux-headers-$(uname -r)出力は次のとおりです Reading package lists... Done Building dependency tree... Done Reading state information... Done E: Unable to locate package linux-headers-5.10.0-21-amd64 E: Couldn't find any package by glob linux-headers-5.10.0-21-amd64 E: Couldn't find any package by regex linux-headers-5.10.0-21-amd64 カーネルを6.0.0-0.deb11.6-amd64にアップグレードしましたが、まだエラーが発生しました(Unable to locate package linux-headers-6.0.0-0.deb11.6-amd64)。 私のカーネルバージョンのLinuxヘッダーをどのようにインストールしますか?

Admin

マルチCPUシステムのdentry/inodeキャッシュ/メモリアロケータの設定
linux-kernel
memory
cache
inode

マルチCPUシステムのdentry/inodeキャッシュ/メモリアロケータの設定

CPLEXのパフォーマンスベンチマーク中に奇妙な問題が発生しました。詳細はブログに掲載されています。https://community.ibm.com/community/user/ai-datascience/blogs/xavier-nodet1/2021/07/08/performance-considerations-for-cplex-on-multiproce。 2ページほどしかありませんが、ここにコピーしたくないので、主な内容は次のとおりです。 マルチCPUシステムでは、NUMAアクセス時間について心配する必要があります。コードのキャッシュヒット率が低く、プロセスを実行しているCPUのメモリバンクにメモリが割り当てられている場合、メモリが他のメモリバンクに割り当てられている場合よりもはるかに速くコードが実行されます。もちろん、アロケータは同じ銀行に割り当てることを好みますが、その銀行が完全に使用されると、アロケータは別の銀行に移動します。バンクがキャッシュされたコンテンツでのみ使用される場合も同様です。何らかの理由でdentry / inodeキャッシュはCPU0バンクにあります。したがって、私のコードがCPU0のコアに予約されている場合、キャッシュがバンク0の少量を占めるのか、それとも大量を占めるのかによってパフォーマンスが大きく異なります。ベンチマークには良くない... キャッシュを強制的に削除することもできますが、これには欠点があります。また、大量のファイルを読み取ってデータ処理を開始する前にキャッシュがバンク0を埋める可能性があるため、不十分な場合があります。 それでは、他のメモリバンクからメモリを割り当てる前にキャッシュを削除することを好むようにアロケータに指示することが可能かどうか疑問に思います。 PS:参考ブログでvfs_cache_Pressureを使用してこの問題を軽減することができると述べましたが、最近はこれが万能歯磨き粉ではないことを発見しました。

Admin

linux-kernel
usb
usb-drive
dmesg

"xhci_hcdを使用してSuperSpeed USBデバイス番号1をリセットする"カーネルログメッセージ

cat /dev/sdx > /dev/nullVirtualBox VM(ホスト:Fedora 37、ゲスト:重要ではありません)のUSB3 HDDドライブ(USB3 HDDドライブを介して接続)からデータを確実に読み取ると、1000秒ごとに繰り返されるカーネルメッセージの連続ストリームが表示されます。 [30690.822917] usb 6-1.1: reset SuperSpeed USB device number 1 using xhci_hcd [31750.830800] usb 6-1.1: reset SuperSpeed USB device number 1 using xhci_hcd [32943.838334] usb 6-1.1: reset SuperSpeed USB device number 1 using xhci_hcd [33228.839274] usb 6-1.1: reset SuperSpeed USB device number 1 using xhci_hcd [33921.890985] usb 6-1.1: reset SuperSpeed USB device number 1 using xhci_hcd [34333.894787] usb 6-1.1: reset SuperSpeed USB device number 1 using xhci_hcd どういう意味ですか?データが失われましたか?私のUSB3 4ポートハブに欠陥がありますか?ハードドライブの電力が不足していますか(USB3ハブには受動的に電力が供給されています)?

Admin

vm.watermark_scale_factor プロパティを設定するとメモリ消費量が増加するのはなぜですか?
linux-kernel
sysctl
mx-linux

vm.watermark_scale_factor プロパティを設定するとメモリ消費量が増加するのはなぜですか?

デーモンがRAMからディスクへのページングの有効化を開始すると、カーネルに通知するvm.watermark_scale_factor属性を設定すると、説明が見つからないことが発生します。 RAMメモリ消費量が増加します。/etc/sysctl.confkswapd デフォルト値をそのままにすると10つまりkswapd、0.1%利用可能なメモリ、conkyは、コンピュータの起動時に使用することを伝えます。1.2GBメモリ消費;たとえば、次のように設定した場合1000、これは最大値であり、消費は次から始まります。2.9そして3GB何も開く必要はありません。 私はLiquorixカーネルと私が使用しているDebianカーネルの両方でこれを試しましたが、同じ結果を得ました。そして、Linux Mintを使って不動産の価値が高まると、消費も増えるという事実を覚えています。200。 私はこのプロパティを次のように設定しました。270、その値に設定すると、スワップの開始時にPCの速度が遅くならないことがわかったからです。デフォルト値にしておくと10、交換により小さな麻痺が発生しました。10到着15第二。 要約すると、このプロパティをデフォルトでそのままにしておくと10消費する1.2GB。設定したら270消費する1.7GB設定したら1000消費する2.9~3.0GBアプリケーションを開く必要はありません。システムモニタを確認してみると、メモリ消費量の多いプロセスはありません。 最初に登場するのは、これがカーネルの一般的なバグであるということです。 この属性が単にスワップデーモンを有効にするためのものである場合、消費が増加するのはなぜですかkswapd? そしてvm.watermark_scale_factor=270: $ free -h total used free shared buff/cache available Mem: 5,7Gi 933Mi 3,8Gi 21Mi 1,0Gi 4,1Gi Swap: 4,8Gi 0B 4,8Gi そしてvm.watermark_scale_factor=1000: $ free -h total used free shared buff/cache available Mem: 5,7Gi 1,1Gi 3,6Gi 39Mi 1,0Gi 2,9Gi Swap: 4,8Gi 0B 4,8Gi イメージはvm.watermark_scale_factor=1000: システムモニタも表示されます。これらすべての消費は何も開きません。

Admin

chardevでcatをhead -c 5にパイプすると、chardevでhead -c 5を呼び出すよりもドライバの読み取りでより多くの呼び出しが発生するのはなぜですか?
linux
linux-kernel
drivers
buffer
character-device

chardevでcatをhead -c 5にパイプすると、chardevでhead -c 5を呼び出すよりもドライバの読み取りでより多くの呼び出しが発生するのはなぜですか?

~からインスピレーションを得るこのブログ投稿、私はLinuxデバイスドライバの作業をしています(彼らから学んでいます)。 readドライバ関連フィールドは、file_operations次の機能で初期化されます。 static ssize_t mychardev_read(struct file *file, char __user *buf, size_t count, loff_t *offset) { uint8_t *data = "Hello from the kernel world!\n"; size_t datalen = strlen(data); printk("MYCHARDEV: mychardev_read was called with count equal to %zu\n", count); if (count > datalen) { count = datalen; } if (copy_to_user(buf, data, count)) { return -EFAULT; } return count; } 私が理解したように、ユーザースペースがこのドライバによって生成されたデバイスから特定の量のデータを要求すると、転送はdatalen文字列の長さdata(この場合は29(末尾の文字列を含む\n))まで一括して発生します。これは、シェルで次のコマンドを実行することで確認できます。 $ head -c 5 /dev/mychardev-0 $ head -c 29 /dev/mychardev-0 $ head -c 30 /dev/mychardev-0 $ head -c 32 /dev/mychardev-0 結果は出力に次のようになりますdmesg(およびメソッドに明白な呼び出しがあると仮定printk)。openrelease [10782.052736] MYCHARDEV: Device open [10782.052743] MYCHARDEV: mychardev_read was called with count equal to 5 [10782.052751] MYCHARDEV: Device close [10868.275577] MYCHARDEV: Device open [10868.275585] MYCHARDEV: mychardev_read was called with count equal to 29 [10868.275598] MYCHARDEV: Device close [10878.414433] MYCHARDEV: Device open [10830.796424] MYCHARDEV: mychardev_read was called with count equal to 30 [10830.796438] MYCHARDEV: mychardev_read was called with count equal to 1 [10830.796443] MYCHARDEV: Device close [10830.796417] MYCHARDEV: Device open [10878.414441] MYCHARDEV: mychardev_read was called with count equal to 32 [10878.414455] MYCHARDEV: mychardev_read was called with count equal to 3 [10878.414460] MYCHARDEV: Device close 私が理解していないのはなぜ次のコマンドが $ cat /dev/mychardev-0 | head -c 5 明らかにする [11186.036107] MYCHARDEV: Device open [11186.036120] MYCHARDEV: mychardev_read was called with count equal to 8192 [11186.036131] MYCHARDEV: mychardev_read was called with count equal to 8192 [11186.036136] MYCHARDEV: mychardev_read was called with count equal to 8192 [11186.036141] MYCHARDEV: mychardev_read was called with count equal to 8192 [11186.036145] MYCHARDEV: mychardev_read was called with count equal to 8192 [11186.036150] MYCHARDEV: mychardev_read was called with count equal to 8192 [11186.036154] MYCHARDEV: mychardev_read was called with count equal to 8192 [11186.036159] MYCHARDEV: mychardev_read was called with count equal to 8192 [11186.036163] MYCHARDEV: mychardev_read was called with count equal to 8192 [11186.036168] MYCHARDEV: mychardev_read was called with count equal to 8192 [11186.036172] MYCHARDEV: mychardev_read was called with count equal to 8192 [11186.036177] MYCHARDEV: mychardev_read was called with count equal to 8192 [11186.036181] MYCHARDEV: mychardev_read was called with count equal to 8192 [11186.036187] MYCHARDEV: Device close 原則として、バイト単位で順番に要求するのではなく、一度に一括してドライバ(またはシェルランタイムとする必要がありますか?)からcatデータ(この場合は8192)を要求することを理解しています。catパフォーマンスを向上させます。 しかし、なぜそれを何度も呼び出すべきかはわかりません。

Admin

Linuxは/etc/fstabなしで/マウントすることをどうやって知ることができますか?
linux
systemd
boot
linux-kernel
initramfs

Linuxは/etc/fstabなしで/マウントすることをどうやって知ることができますか?

/etc/fstab が削除されたり名前が変更されたりすると、マシンへのブートが引き続き機能し、ルートファイルシステム (/) がまだマウントされ、正しいストレージデバイスに /etc なしで / をマウントすることがどのようにわかりますか? / fstabに移動デバイス。

Admin

Linuxページキャッシュを無効にする方法
linux-kernel
cache

Linuxページキャッシュを無効にする方法

Linuxカーネルは、I / Oの操作を高速化するためにページキャッシュを実装します。 研究とテストのためにページキャッシュをオフまたはオンにすることができれば役立ちます。 Linuxページキャッシュを無効にする方法は? アップデート1:ページキャッシュをグローバルにオフにできない場合は、Linuxファイルシステムを連続書き込みモードでマウントできます。私が正しく理解した場合、EXT2、EXT4、およびXFSのマウントオプションはdaxwrite-throughモードを実装します。ページキャッシュを防ぐための有効なオプションですか(少なくともファイルシステムの場合)。 https://www.kernel.org/doc/Documentation/filesystems/dax.txt アップデート2:明らかにDAXはやや死んでおり、ページキャッシュを適切にオフにすることはできません(グローバルには、まったくオフにせず、個々のアプリケーションに対して限られた方法でのみ)。しかし、実際にLinuxファイルシステム(たとえば、mountパラメータを介して)を連続書き込みモードに設定する方法はありませんか? アップデート3:このツールは、ddLinuxカーネルページキャッシュを簡単にバイパスできるアプリケーションの一例ですoflag=direct。 https://man7.org/linux/man-pages/man1/dd.1.html アップデート4:明らかに、FUSE(ユーザー空間のファイルシステム)モジュールを使用するファイルシステムは、ページキャッシュへの読み取りと書き込みが完全にバイパスされる直接IOモードで使用できます。 https://www.kernel.org/doc/Documentation/filesystems/fuse-io.txt アップデート5:マウントオプションを-o sync使用すると、一部のファイルシステム(ext2、ext3、FAT、VFAT、UFS)に対して連続書き込みモードとページキャッシュバイパスが可能です。 https://linux.die.net/man/8/mount

Admin