A 32-bit process can access 4 GB of virtual memory map. However, that map is then split into 2 pieces: 2 GB for the kernel, 2 GB for the process itself. It's the same setup on just about every PC-based OS (Windows, Linux, MacOS X, the BSDs, etc).
If a process needs to access more than 2 GB of the virtual memory map, then it needs to resort to various tricks like PAE, memory thunking, bounce buffers, or reconfiguring the kernel/user split (aka large memory support).
The first and last options are things the user can do. The others are things only the program devs can do.
Not sure how to change the kernel/user split in FreeBSD, but it is possible to use a 1/3 split instead of the standard 2/2 split. As you discovered, it's possible to add a flag to the Windows boot loader to change this.
If a process needs to access more than 2 GB of the virtual memory map, then it needs to resort to various tricks like PAE, memory thunking, bounce buffers, or reconfiguring the kernel/user split (aka large memory support).
The first and last options are things the user can do. The others are things only the program devs can do.
Not sure how to change the kernel/user split in FreeBSD, but it is possible to use a 1/3 split instead of the standard 2/2 split. As you discovered, it's possible to add a flag to the Windows boot loader to change this.