diff options
author | Jack Lloyd <[email protected]> | 2018-03-09 07:13:07 -0500 |
---|---|---|
committer | Jack Lloyd <[email protected]> | 2018-03-09 07:13:07 -0500 |
commit | 869909163d08144e69c7f2b11e8053d68a07d390 (patch) | |
tree | f6f82e2815d585c137a9ce9e59e1cbdc4b27a6af /src/lib/utils | |
parent | 5185c2aaa8bf9556556e4507869042a71eaba6c0 (diff) |
Add OS::system_page_size
Diffstat (limited to 'src/lib/utils')
-rw-r--r-- | src/lib/utils/os_utils.cpp | 23 | ||||
-rw-r--r-- | src/lib/utils/os_utils.h | 6 |
2 files changed, 25 insertions, 4 deletions
diff --git a/src/lib/utils/os_utils.cpp b/src/lib/utils/os_utils.cpp index 769615543..f2813b323 100644 --- a/src/lib/utils/os_utils.cpp +++ b/src/lib/utils/os_utils.cpp @@ -197,6 +197,24 @@ uint64_t OS::get_system_timestamp_ns() return std::chrono::duration_cast<std::chrono::nanoseconds>(now).count(); } +size_t OS::system_page_size() + { +#if defined(BOTAN_TARGET_OS_HAS_POSIX1) + long p = ::sysconf(_SC_PAGESIZE); + if(p > 1) + return static_cast<size_t>(p); + else + return 4096; +#elif defined(BOTAN_TARGET_OS_HAS_VIRTUAL_LOCK) + SYSTEM_INFO sys_info; + ::GetSystemInfo(&sys_info); + return sys_info.dwPageSize; +#endif + + // default value + return 4096; + } + size_t OS::get_memory_locking_limit() { #if defined(BOTAN_TARGET_OS_HAS_POSIX1) @@ -255,16 +273,13 @@ size_t OS::get_memory_locking_limit() return 0; } - SYSTEM_INFO sSysInfo; - ::GetSystemInfo(&sSysInfo); - // According to Microsoft MSDN: // The maximum number of pages that a process can lock is equal to the number of pages in its minimum working set minus a small overhead // In the book "Windows Internals Part 2": the maximum lockable pages are minimum working set size - 8 pages // But the information in the book seems to be inaccurate/outdated // I've tested this on Windows 8.1 x64, Windows 10 x64 and Windows 7 x86 // On all three OS the value is 11 instead of 8 - size_t overhead = sSysInfo.dwPageSize * 11ULL; + size_t overhead = OS::system_page_size() * 11ULL; if(working_min > overhead) { size_t lockable_bytes = working_min - overhead; diff --git a/src/lib/utils/os_utils.h b/src/lib/utils/os_utils.h index feccdbe73..5210b2523 100644 --- a/src/lib/utils/os_utils.h +++ b/src/lib/utils/os_utils.h @@ -68,6 +68,12 @@ uint64_t BOTAN_TEST_API get_system_timestamp_ns(); size_t get_memory_locking_limit(); /** +* Return the size of a memory page, if that can be derived on the +* current system. Otherwise returns some default value (eg 4096) +*/ +size_t system_page_size(); + +/** * Request so many bytes of page-aligned RAM locked into memory using * mlock, VirtualLock, or similar. Returns null on failure. The memory * returned is zeroed. Free it with free_locked_pages. |