Skip to content

Commit

Permalink
Docs: add backport infomation in zh_TW docs
Browse files Browse the repository at this point in the history
  • Loading branch information
jeffpeng3 committed Mar 20, 2024
1 parent 4ed2d66 commit 9794589
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 1 deletion.
2 changes: 1 addition & 1 deletion website/docs/zh_TW/guide/app-profile.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,5 +114,5 @@ KernelSU 提供了一種 systemless 的方式來修改系統分區,這是透
2. 關閉「預設卸載模組」的開關,然後針對需要「卸載模組」的應用程式進行單獨的設置,在 App Profile 中開啟「卸載模組」;(相當於「黑名單」)。
:::info
KernelSU 在 5.10 及以上內核上,內核會執行“卸載模組”的操作;但在 5.10 以下的設備上,這個開關僅僅是一個“設定”,KernelSU 本身不會做任何動作,一些模組(如 Zygisksu 會透過這個模組決定是否需要卸載)
KernelSU 在 5.10 及以上內核上,內核無須任何修改就可以卸載模組;但在 5.10 以下的設備上,這個開關僅僅是一個“設定”,KernelSU 本身不會做任何動作,如果你希望在 5.10 以前的內核可以卸載模組,你需要將 `path_unmount` 函數向後移植到 `fs/namespace.c`,您可以在[如何為非 GKI 核心整合 KernelSU](/zh_TW/guide/how-to-integrate-for-non-gki.html)的末尾獲取更多資訊。一些模組(如 ZygiskNext)也會透過這個設定決定是否需要卸載。
:::
55 changes: 55 additions & 0 deletions website/docs/zh_TW/guide/how-to-integrate-for-non-gki.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@ CONFIG_KPROBE_EVENTS=y
`KernelSU/kernel/ksu.c` 中的 `ksu_enable_sucompat()``ksu_enable_ksud()` 取消註解,如果正常開機,即 kprobe 已損毀;或者您可以手動嘗試使用 kprobe 功能,如果不正常,手機會直接重新啟動。
:::

:::info 如何為非 GKI 核心啟用卸載模組功能

如果你的 kernel 版本小於 5.9,你應該將 `path_umount` 向後移植至 `fs/namespace.c`。 卸載模組功能依賴於這個函數。 如果你沒有向後移植 `path_umount`,卸載模組功能將無法工作。 你可以在底下查看更多關於 `path_unmount` 的資料。
:::

## 手動修改核心原始碼 {#modify-kernel-source-code}

如果 kprobe 無法正常運作 (可能是上游的錯誤或核心版本過低),那您可以嘗試這種方法:
Expand Down Expand Up @@ -261,4 +266,54 @@ index 45306f9ef247..815091ebfca4 100755
add_input_randomness(type, code, value);
```

### 如何向後移植 path_umount {#how-to-backport-path_unpount}

你可以透過向後移植 `path_umount` 來讓卸載模組功能在小於 5.9 的非 GKI 核心上運作. 你可以參考這個修改:

```diff
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -1739,6 +1739,39 @@ static inline bool may_mandlock(void)
}
#endif

+static int can_umount(const struct path *path, int flags)
+{
+ struct mount *mnt = real_mount(path->mnt);
+
+ if (flags & ~(MNT_FORCE | MNT_DETACH | MNT_EXPIRE | UMOUNT_NOFOLLOW))
+ return -EINVAL;
+ if (!may_mount())
+ return -EPERM;
+ if (path->dentry != path->mnt->mnt_root)
+ return -EINVAL;
+ if (!check_mnt(mnt))
+ return -EINVAL;
+ if (mnt->mnt.mnt_flags & MNT_LOCKED) /* Check optimistically */
+ return -EINVAL;
+ if (flags & MNT_FORCE && !capable(CAP_SYS_ADMIN))
+ return -EPERM;
+ return 0;
+}
+
+int path_umount(struct path *path, int flags)
+{
+ struct mount *mnt = real_mount(path->mnt);
+ int ret;
+
+ ret = can_umount(path, flags);
+ if (!ret)
+ ret = do_umount(mnt, flags);
+
+ /* we mustn't call path_put() as that would clear mnt_expiry_mark */
+ dput(path->dentry);
+ mntput_no_expire(mnt);
+ return ret;
+}
/*
* Now umount can handle mount points as well as block devices.
* This is important for filesystems which use unnamed block devices.
```


最後,再次建置您的核心,KernelSU 將會如期運作。

0 comments on commit 9794589

Please sign in to comment.